• 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()方法,

  • 相关阅读:
    多列转两列(Power Query)
    多簿多表合并(Power Query)
    高亮显示指定内容
    价格段公式
    按日期段计算平均销量
    Filter、Unique如何跳过隐藏行
    人民币填空
    按换行符拆分(Power Query)
    添加分类汇总小计行(Power Query)
    添加累计列(Power Query)
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4202494.html
Copyright © 2020-2023  润新知