《Struts2-类型转换与输入验证.ppt》由会员分享,可在线阅读,更多相关《Struts2-类型转换与输入验证.ppt(37页珍藏版)》请在三一办公上搜索。
1、Struts第二章,类型转换与输入验证,1,目标,2.1 拦截器2.2 类型转换2.3 输入验证2.4 fielderror标签,2,Struts截拦器,截拦器是Struts2中最重要的概念之一,Struts中有80%的功能都通过截拦器实现.截拦器意义:提高更高层次的解耦,无须侵入框架本身便可以添加新的功能.截拦器是AOP的一种实现,底层通过动态代理模式完成,3,Struts截拦器与Action的关系,将一些功能放到截拦器,可以降低Action的复杂性,提高重用性.截拦器的典型使用封装请求参数文件上传异常处理.拦截器是Action的截拦器,4,截拦器工作原理,5,截拦器运行的关键代码,6,默认
2、截拦器,如果没有为Action指定截拦器,则使用defaultStack作为默认截拦器下面的功能由默认截拦器提供请求参数封装文件上传类型转换异常处理一旦为Action指定了截拦器,则默认截拦器不再起作用,必须显示指定默认截拦器.,7,截拦器定义,截拦器是一个继承自AbstractInterceptor抽象类或实现Interceptor接口的类,可以重写的方法:public void init():执行初始化动作public void destroy():执行销毁动作String intercept(ActionInvocation invocation):执行截拦动作参数invocation:
3、包含了Action的引用,invocation.invoke()方法用于将控制权转给下一个截拦器或者调用Action的execute()方法.返回值为逻辑视图AbstractInterceptor为init和destroy方法提供了默认实现.,8,截拦器示例,public class FirstInterceptor extends AbstractInterceptor Overridepublic String intercept(ActionInvocation invocation)throws Exception System.out.println(Action:+invocati
4、on.getAction().getClass().getName();return invocation.invoke();,9,截拦器配置及使用,10,要点,如果Action配置了多个截拦器,截拦器的执行顺序与配置顺序相同截拦器可以注入属性值,在struts.xml文件中通过value实现,作用于interceptor或interceptor-ref.通过intercept的返回值,可以改变请求的流程控制(*).一般来说,invocation.invoke()方法总是要调用的.因为Action定义了截拦器,所以默认截拦器将失效.如果要用到默认截拦器提供的功能,必须显示配置在Action中.
5、,11,示例-给Action属性赋值,12,/index.jsp,13,方法过滤,一般情况下,Action的任何一个方法执行时都会调用截拦器.通过继承自MethodFilterInterceptor的截拦器可以指定哪些方法会执行截拦器,哪些不会.执行动作定义在String doIntercept(ActionInvocation invocation)方法中.excludeMethods:指定哪些方法不调用截拦器(黑名单)includeMethods:指定哪些方法会调用截拦器(白名单)如果includeMethods和excludeMethods冲突,includeMethods取胜.,14,
6、方法过滤示例,/success.jspm1,m2m2注:m1方法不调用methodint截拦器,m2会调用截拦器,15,要点,如果不指定excludeMethods和includeMethods,则所有方法都会被截拦器截拦.如果方法在excludeMethods和includeMethods都配置了,则includeMethods取胜.如果需要过滤多个方法,方法名之间用逗号隔开.,16,截拦器栈,将多个截拦器组合成一个截拦器栈配置使用,17,内置拦截器,用于打印Action执行的时间防止重复提交表单方法过滤拦截器excludeMethodsincludeMethods和配合使用在Action中
7、必须定义名为invalid.token的result,如果重复提交则自动跳转到该逻辑视图,18,默认截拦器,如果希望所有Action都被某个截拦器或截拦器栈截拦,可以使用指定默认截拦器如果Action显示定义了截拦器,则默认截拦器失效.,19,小结,截拦器的作用和意义截拦器的定义与配置默认截拦器分析截拦器栈,20,传统类型转换,客户端浏览器只能将字符串传送到服务器(文件上传除外),而服务器端java语言是强类型语言,数据类型非常丰富,这就造成B/S两端的类型不兼容问题.传统做法:将客户端数据转变成intint v=Integer.parseInt(request.getParameter(v)
8、;缺陷:过程烦琐枯燥.,21,Struts2类型转换,Struts2提供了强有力的表现层类型转换机制,无需程序员过多干预即可自动完成转换.Struts能自动处理类型转换过程中出现的未知异常.下面的数据类型会自动转换:boolean,char,int,long,float,double基础类型,包括封装类型和对应数组.Date,String数组,元素类型为String的List,22,自定义类型转换器,类型转换器是一个继承自StrutsTypeConverter(抽象类)的类,必须重写两个方法:public Object convertFromString(Map context,String
9、values,Class toClass)从字符串转换成目标类型public String convertToString(Map context,Object o)将目标类型转换成字符串注:上面的两个方法都必须重写.,23,自定义类型转换器-示例,24,注册自定义类型转换器,注册自定义类型转换器有两种方法局部类型转换器:只有特定的Action才可以使用注册方法:在Action所在的包中建立properties文件,文件名格式:Action类名-conversion.properties,内容如下:其中:inver是action属性名,全局类型转换器:所有Action都可以使用注册方法:在cl
10、asspath下建立名为xwork-conversion.properties的文件,内容如下:目标类型(全限定名)=转换器全限定名,25,处理类型转换异常,转换出错后,ConversionErrorInterceptor截拦器会截拦转换异常,该截拦器会带领我们进入result为input的URL,并通过显示错误信息.前提:Action必须是ActionSupport的子类如果不使用struts自带的错误信息,可以在Action所在的包中定义”Action类名.properties”文件,内容如下:invalid.fieldvalue.inver=整型数组转换出错其中,invalid.fiel
11、dvalue固定,inver是属性名称,26,类型转换器小结,一般来说,struts为我们提供的默认转换器能实现大部分需求,不需要重新定义新的转换器.,27,验证器,验证器和转换器是一对兄弟,他们总是如影随形.所有用户的输入都是邪恶的先类型转换,再验证Struts2主要通过验证框架来完成数据验证.Action必须继承ActionSupport,28,Struts2的验证框架能做什么?,验证日期范围验证双精度/整型/长整型数值范围邮箱验证验证字段关系必填项验证字符串长度验证URL验证正则表达式验证正则表达式能解决绝大部分验证问题,29,使用struts2验证框架我们应该做什么?,我们可以为每一个
12、单独的Action定义一个验证文件验证文件格式:Action类名-validation.xml也可以为Action的方法定义一个验证文件:必须先为方法配置action验证文件格式:Action类名-name-validation.xml注:验证文件要和Action类放在同一包中,30,验证文件怎么写?,两个方面DOCTYPE从中可以找到验证内容查看doc文档,有详尽的说明和示范,31,验证示例,输入员工信息应该遵循下面的规范员工姓名必填,且在6-20个字符之间员工年龄必须在18-100之间员工的邮箱必须输入正确格式员工电话号码只接受手机号,32,验证示例-Action,public class
13、 EmployeeAction extends ActionSupport private String ename;private int age;private String email;private String phone;,33,验证示例验证文件,验证文件名称为:EmployeeAction-validation.xml验证员工姓名true员工姓名不能为空620员工姓名必须在$minLength-$maxLength个字符之,34,验证电话号码(使用正则表达式)只接受手机号,35,显示验证错误信息,验证失败后,struts会自动跳转到result为input的URL中,在页面中显示错误信息使用下面的标签此时,显示所有错误信息通过fieldName显示指定属性的错误信息,36,总结,Struts2强大的数据类型转换与验证功能不仅降低耦合度,而且能处理复杂的任务数据验证需要阅读相关doc,实现起来并不难,但很有用,37,