class17struts2(高级)精编版.pptx
Struts2(高级)(高级)讲解人:王英伟 讲解时间:60min23Struts2介绍4Struts2的处理流程StrutsPrepareAndExecuteFilterInterceptorActionResultJsp/html响应用户请求Struts2内置的一些拦截器或用户自定义拦截器5自定义拦截器要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:public class PermissionInterceptor implements Interceptor public String intercept(ActionInvocation invocation)throws Exception Object user=ActionContext.getContext().getSession().get(user);if(user!=null)/调用此方法,拦截执行。return invocation.invoke();ActionContext.getContext().put(message,你没有权限执行操作);return“index;6 7输入校验采用手工编写代码实现。基于XML配置方式实现。8手工编写代码方式(全方法)public void validate()if(this.username=null|(this.username).equals()this.addFieldError(username,用户名不能为空);if(this.mobile=null|(this.mobile.toString().equals()this.addFieldError(mobile,手机号不能为空);else/正则表达式(首位,)if(!Ppile(1358d9$).matcher(this.mobile).matches()this.addFieldError(mobile,手机号格式不确定);验证失败后,请求转发至验证失败后,请求转发至input视图:视图:/WEB-INF/page/addUser.jsp在在addUser.jsp页面中使用页面中使用显示失败信息。显示失败信息。/引用ognl标签库9手工编写代码方式(指定方法)public void validateXxx()if(this.username=null|(this.username).equals()this.addFieldError(username,用户名不能为空);if(this.mobile=null|(this.mobile.toString().equals()this.addFieldError(mobile,手机号不能为空);else/正则表达式(首位,)if(!Ppile(1358d9$).matcher(this.mobile).matches()this.addFieldError(mobile,手机号格式不确定);Xxx代表方法名,首字母大写代表方法名,首字母大写验证失败后,请求转发至验证失败后,请求转发至input视图:视图:/WEB-INF/page/addUser.jsp在在addUser.jsp页面中使用页面中使用显示失败信息。显示失败信息。/引用ognl标签库10输入校验的流程1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。2.如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。3.系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。4.再调用action中的validate()方法。5.经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。11基于XML配置方式(全方法)定义UserAction-validation.xml:ActionClassName-validation.xml true 用户名不能为空!指定action中要校验的属性指定校验器:xwork-core-2.x.jar下com.opensymphony.xwork2.validator.validators中default.xml找到校验器类型true对属性进行校验,首先要求调用trim()方法去掉空格为校验失败后的提示信息12基于XML配置方式(指定方法)当校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。例如:在实际应用中,常有以下配置:/WEB-INF/page/message.jsp/WEB-INF/page/addUser.jspUserAction中有以下两个处理方法:public String add()throws Exception .public String update()throws Exception .要对add()方法实施验证,校验文件的取名为:UserAction-user_add-validation.xml要对update()方法实施验证,校验文件的取名为:UserAction-user_update-validation.xml13struts2提供的校验器列表系统提供的校验器如下:required(必填校验器,要求field的值不能为null)requiredstring(必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)url(网址校验器,要求如果field的值非空,则必须是合法的url地址)date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)conversion(转换校验器,指定在类型转换失败时,提示的错误信息)visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)14校验器的使用例子required 必填校验器 性别不能为空!requiredstring 必填字符串校验器 true 用户名不能为空!stringlength:字符串长度校验器102true15email:邮件地址校验器电子邮件地址无效regex:正则表达式校验器 手机号格式不正确!int:整数校验器1150年龄必须在1-150之间字段OGNL表达式校验器!CDATAimage()文件不能为空16基于XML校验的一些特点当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:1。AconClassName-validation.xml2。ActionClassName-ActionName-validation.xml系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于action方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。当action继承了另一个action,父类action的校验文件会先被搜索到。假设UserAction继承BaseAction:访问上面action,系统先搜索父类的校验文件:BaseAction-validation.xml,BaseAction-user-validation.xml,接着搜索子类的校验文件:UserAction-validation.xml,UserAction-user-validation.xml。应用于上面action的校验规则为这四个文件的总和。17全局result配置/index.jsp18包继承 /index.jsp =19Action的属性注入值$message/WEB-INF/hello.jsp20动态方法调用如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法/struts/test/hello!other.action21通配符/WEB-INF/page/hello.jsp *代表一段字符1 代表第一个*所代表的字符22自定义类型转换器java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。import java.util.Date;public class HelloWorldAction private Date createtime;public Date getCreatetime()return createtime;public void setCreatetime(Date createtime)this.createtime=createtime;23public class DateConverter extends DefaultTypeConverter Override public Object convertValue(Map context,Object value,Class toType)SimpleDateFormat dateFormat=new SimpleDateFormat(yyyyMMdd);try if(toType=Date.class)/当字符串向Date类型转换时String params=(String)value;/Request.getParameterValues()return dateFormat.parse(params0);else if(toType=String.class)/当Date转换成字符串时Date date=(Date)value;return dateFormat.format(date);catch(ParseException e)return null;24局部类型转换器将上面的类型转换器注册为局部类型转换器:在Action类所在的包下放置ActionClassName-conversion.properties文件ActionClassName是Action的类名,后面的-conversion.properties是固定写法对于本例而言,文件的名称应HelloWorldAction-conversion.properties在properties文件中的内容为:属性名称=类型转换器的全类名HelloWorldAction-conversion.properties文件中的内容为:createtime=com.unis.conversion.DateConverter25全局类型转换器将上面的类型转换器注册为全局类型转换器:在WEB-INF/classes下放置xwork-conversion.properties文件。在properties文件中的内容为:待转换的类型=类型转换器的全类名对于本例而言,xwork-conversion.properties文件中的内容为:java.util.Date=com.unis.conversion.DateConverter26文件上传第一步:在第一步:在WEB-INF/lib下加入下加入commons-、commons-io-1.3.2.jar。这两个文件可以从下载。这两个文件可以从下载。第二步:把第二步:把form表的表的enctype设置为:设置为:“multipart/form-data“,如下,如下 第三步:在第三步:在Action类中添加以下属性,类中添加以下属性,属性红色部分对应于表单中文件字段的名称属性红色部分对应于表单中文件字段的名称:public class HelloWorldAction private File uploadImage;/得到上传的文件 private String uploadImageContentType;/得到文件的类型 private String uploadImage得到文件的名称 /getter/setter方法 public String upload()throws ExceptionString realpath=ServletActionContext.getServletContext().getRealPath(/images);=new);if(!()();(uploadImage,new,uploadImage);return success;27多文件上传 在在Action类中添加以下属性,类中添加以下属性,属性红色部分对应于表单中文件字段的名称属性红色部分对应于表单中文件字段的名称:public class HelloWorldAction private File uploadImages;/上传的文件 private String uploadImagesContentType;/文件的类型 private String uploadImages文件的名称 /getter/setter方法 public String upload()throws ExceptionString realpath=ServletActionContext.getServletContext().getRealPath(/images);=new);if(!()();for(int i=0;iuploadImages.length;i+)(uploadImagesi,new,uploadImagesi);return success;28谢谢!1、有时候读书是一种巧妙地避开思考的方法。4月-234月-23Monday,April 17,20232、阅读一切好书如同和过去最杰出的人谈话。05:11:0005:11:0005:114/17/2023 5:11:00 AM3、越是没有本领的就越加自命不凡。4月-2305:11:0005:11Apr-2317-Apr-234、越是无能的人,越喜欢挑剔别人的错儿。05:11:0005:11:0005:11Monday,April 17,20235、知人者智,自知者明。胜人者有力,自胜者强。4月-234月-2305:11:0005:11:00April 17,20236、意志坚强的人能把世界放在手中像泥块一样任意揉捏。17四月20235:11:00上午05:11:004月-237、最具挑战性的挑战莫过于提升自我。四月235:11上午4月-2305:11April 17,20238、业余生活要有意义,不要越轨。2023/4/175:11:0005:11:0017 April 20239、一个人即使已登上顶峰,也仍要自强不息。5:11:00上午5:11上午05:11:004月-2310、你要做多大的事情,就该承受多大的压力。4/17/2023 5:11:00 AM05:11:0017-4月-2311、自己要先看得起自己,别人才会看得起你。4/17/2023 5:11 AM4/17/2023 5:11 AM4月-234月-2312、这一秒不放弃,下一秒就会有希望。17-Apr-2317 April 20234月-2313、无论才能知识多么卓著,如果缺乏热情,则无异纸上画饼充饥,无补于事。Monday,April 17,202317-Apr-234月-2314、我只是自己不放过自己而已,现在我不会再逼自己眷恋了。4月-2305:11:0017 April 202305:11谢谢大家谢谢大家