首页 > 代码库 > Struts 2 类型转换器 输入校验 拦截器
Struts 2 类型转换器 输入校验 拦截器
Struts 2中内建了字符串类型和常见类型之间相互转换的转换器,能满足大多数转换需求,但不能完成字符串和User对象之间的转换。
OGNL项目中有一个TypeConvert接口,这个接口是自定义类型转换器必须要实现的接口,OGNL还提供了一个实现类:
DefaultTypeConverter,自定义类型转换器(UserConverter类)须重写DefaultTypeConverter类的convertValue()方法。该方法可以实现字符串和对象之前相互转换
注册局部类型转换器:注册局部类型转换器使用局部类型转换文件指定,只要在局部类型转换文件中添加:
<propName>=<ConverterClass>
#指定Action的user属性需要使用UserConverter类来完成类型转换
user=org.crazy.app.converter.UserConverter
至此,局部类型转换成功
全局类型转换器:注册全局类型转换器应该提供一个xwork-conversion.properties,该文件由多项
<propType>=<ConverterClass>项组成,
输入校验的流程
1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。
不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4、再调用action中的validate()方法。
5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。
如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
输入校验:客户端校验为了防止正常浏览者的错误输入,能降低服务器端额负载,服务端防止恶意用户的恶意 行为
<!-- 指定age属性必须在指定范围内-->
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
每个Action有一个检验文件,文件名应为ActionName-validation.xml
配置struts.xml文件
<!-- 用户注册的Action -->
<action name="regist" class="org.crazyit.app.action.RegistAction">
<!-- 类型转换失败、输入校验失败,转入input对应的视图 -->
<result name="input">/WEB-INF/content/registForm.jsp</result>
<result>/WEB-INF/content/show.jsp</result> </action>
在registForm.jsp中添加<s:fielderror>来输出错误提示。
手动完成校验需要重写validate()方法,重写validateXxx()方法
一、理解拦截器:
1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种
实现.需要时添加,不需要时取消该拦截器的配置即可。
2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截
器链中的拦截器就会按其之前定义的顺序被调用。拦截器栈中还可以包含另一个拦截器栈。
二、实现Struts2拦截器原理
Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的 拦截器对象,然后
串成一个列表,最后一个一个地调用列表中的拦截器
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截
器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
<!-- 应用所需使用的拦截器都在该元素下配置 -->
<interceptors>
<!-- 配置mySimple拦截器 -->
<interceptor name="mySimple"lass="org.crazyit.app.interceptor.SimpleInterceptor">
<!-- 为拦截器指定参数值 -->
<param name="name">简单拦截器</param>
</interceptor>
</interceptors>
<action name="login" class="org.crazyit.app.action.LoginAction">
<result name="error">/WEB-INF/content/error.jsp</result>
<result>/WEB-INF/content/welcome.jsp</result>
<!-- 配置系统的默认拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 应用自定义的mySimple拦截器 -->
<interceptor-ref name="mySimple">
<param name="name">改名后的拦截器</param>
</interceptor-ref>
</action>
要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:包含init()、destory()、intercept()三个方法
AbstractInterceptor类提供init()、destory()方法的空实现,被不需要打开资源的拦截器继承可以简化操作
SimpleInterceptor extends AbstractInterceptor实现了intercept()方法,
Struts 2 类型转换器 输入校验 拦截器