Struts 2.x 高级应用

来源:互联网 发布:和俄罗斯人谈恋爱 知乎 编辑:程序博客网 时间:2024/06/09 17:32

一、数据类型转化器

    JSP提交的数据全部是String类型的。Struts2也是通过request.getParameter(name)获取到String类型数据,并通过拦截器将String转换各种常用的数据类型,如Date、Time、Timestamp等,然后通过getter、setter方法设置到Action对应的属性上。

    1、日期转换器
        数据类型转换器都需要实现ognl.TypeConverter接口。一般地,直接继承DefaultTypeConverter类,并实现convertValue()方法就可以了。
        convertValue()方法有3个参数,参数value为待转换的数据,参数toType为要转成的类型。
        注意JSP提交数据时,参数value为request.getParameterValues(String name)返回的String[]类型对象,而不是String。

    2、 配置转换器
        xwork-conversion-properties
        java.sql.Date = com.helloweenvsfei.struts2.convertor.DateTimeConvertor
        java.sql.Time = com.helloweenvsfei.struts2.convertor.DateTimeConvertor
        java.util.Date = com.helloweenvsfei.struts2.convertor.DateTimeConvertor

    3、Action代码
        转换器的调用对Action是透明的,Action中不需要做什么处理,只需要声明Date类型的变量就可以了。Struts2自动调用转换器将从request中取到的String转换成Date,然后setter到Action实例中。在输出Action的Date类型属性时,Struts2标签会再次调用转换器的convertValue()方法,将Date类型转换成String类型。

    4、为Action配置转换器
        转换器还可以配置在struts.xml的Action中。这时候,转换器将只作用于当前的Action,而不是所有的Action。
        converter = “com.helloweenvsfei.struts2.convertor.DateTimeConvertor”

二、获取request、response

    1、利用ServletActionContext的静态方法
        非注射方式(非IoC方式)
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpSession session = request.getSession(trut);
        ServletContext application = ServletActionContext.getServletContext();

    2、利用相关的Aware接口
        注射方式(IoC方式)
        ServletContextAware、ServletRequestAware、SerlvetResponseAware、SessionAware。
        Struts在实例化一个Action实例时,如果发现它实现了相应的Aware接口,会把相关的资源通过Aware接口方法注射进去。(IoC方式)
        Aware接口其实是一种拦截器,拦截器代码会在执行Action之前执行,将相关的Servlet对象设置进来。

三、使用Validator校验数据

    Struts2提供的数据校验是配置式的,既可以用XML配置,也可以用Java注解(@Anonotation)配置。

    1、使用XML配置的数据校验Validator
        使用XML配置时,需要在Action类所在的package内添加一个XML文件,文件名格式为Action类名-validation.xml或者Action类名-Action别名-validation.xml。如果Action中有多个方法,一般使用后者。
        支持校验的Action必须实现Validateable接口,一般继承ActionSupport就可以了。
        <validators>
            <field name=”book.name”>
              <field-validator type=”requiredstring”>
                 <param name=”trim”>true</param>
                 <message>请输入书籍名称</message>
              </field-validator>
           </field>
           <field name=”book.publishedDate”>
              <field-validator type=”date”>
                 <param name=”min”>1900-01-01</param>
                 <param name=”min”>2200-01-01</param>
                 <message>
                    <![CDATA[日期格式必须位于1900-01-01与2200-01-01之间]]>
                 </message>
              </field-validator>
           </field>
        </validators>

    2、配置客户端Validator       
        Struts2也支持客户端JavaScript校验,再将JSP的<struts:form>标签添加validate=”true”属性即可。

    3、常用的Validator
        required 检查被校验域是否为null。
        requiredstring 检查被校验String是否为null或空,可选参数trim,在验证前对字符串执行trim操作。
        stringlength 检查被校验String的长度范围,可选参数trim、minLength、maxLength。
        int/double 检查输入是否为int/double,并且可判断数值范围,可选参数为min、max、minInclusive、maxInclusive、minExclusive、maxExclusive。
        date 检查date的范围,可选参数为min、max。
        email 检查输入是否为E-mail格式。
        url 检查输入是否为url格式。
        conversion 检查是否将出现数据转换错误。
        expression/fieldexpression 检查某个布尔表达式的值是否为true,后者绑定到某个字段上,参数为expression。
        visitor 使用预定义的validators进行校验,参数为context。
        regex 检查是否能匹配到正则表达式,参数为regex。

    4、使用@Java注解配置Validator
        @Validation
        public class BookAction extends ActionSupport {
            @Validations (
               requiredStrings = {
                  @RequiredStringValidator(
                     type = ValidatorType.SIMPLE,
                     trim = true,
                     fieldName = “book.name”,
                     message = “请输入书籍名称.*”
                  ),
                  @RequiredStringValidator(…)
               },
               dateRangeFields = {
                  @DateRangeFieldValidator(
                     type = ValidatorType.SIMPLE,
                     fieldName = “book.publishedDate”,
                     min = “1900-01-01”,
                     max = “2200-01-01”,
                     message = “日期必须大于${min}小于${mxa},当前值为${book.publishedDate}.”
                  )
               }
            )
            public String add(){…}
            @SkipVlidation
            public String list() {…}
        }