Struts2学习笔记

 

一 概述 

       1  struts2是webwork和struts1的结合,其核心来自webwork。比struts1更灵活,更优雅。

       2  struts2的核心控制器是dispafliter 和action,而struts2的核心是拦截器Interceptor。

       3  <constant name="struts.action.extension" value="htm"/>可以完成请求后缀为htm。

二 数据类型转换(converter)和数据校验(validate)

      1  基本数据转换是struts2自动完成的,对于对象其他复杂类型转换,可继承StrutsTypeConverter类重写convertvalue()来完成,但是还需要配置放在校验action同目录的xxxAction-conversion.properties文件,其写法如下:   

                   被校验属性=包名.校验器名

全局的文件名称则为: xwork-converter.properties

其实StrutsTypeConverter类是继承了ognl.dufaultTypeConverter这个类,当然我们也可以直接来实现convertvalue()来完成。

     2  数据校验 在单独的方法里可使用validate()来校验,但是往往在开发中一个action类中有很多方法,这时候validate()就成了全局的校验,导致每个方法都校验,这并不是我们想要的,Struts2有个解决的方法就是用validatexxx()来校验xxx()方法,从而使每个校验对应一个方法。

     3   用struts2的标签的时候会自动给出错误提示,但是有时候并不是我们想要的,我们可以在表单中增加 theme="simple" 让表单的当前html样式失效,从而我们自己定义样式。错误提示有两种 <s:actionerror> 和 <s:fielderror> ,在validat()的时候由我们自己选择,把错误信息放入actionerror还是:fielderror。

    4  如果我们用fielderror级别的输出,最好配置 :

                <constant name="struts.custom.i18n.resources" value="message"></constant>

然后再写个message.properties文件 里面写这样的xwork.default.invalid.fieldvalue={0} error,

来说明我们那个属性输入有误,或者用局部的xxx.properties,其中xxx是action名字。里面配置如下面这样的内容

         invalid.fieldvalue.age=\年\龄\输\入\不\正\确

         invalid.fieldvalue.birthday=\生\日\输\入\有\误

         invalid.fieldvalue.graduation=\毕\业\日\期\输\入\有\误

其中前面是校验的属性,后面是中文字符的unicode编码,至于这个怎么来的,看看jdk给我们提供了native2ascii 这个工具 可以直接在自己安装的jdk bin目录下找到,运行后输入汉字,回车就可以看到unicod编码了,同时支持文件转换。

     5 除了编码方式校验外,struts2还提供了xml配置文件的校验,更得情况下我们采用配置文件的校验,配置文件的校验和编码方式的校验一样有两种方式,全局的和局部的,全局的就是对整个action校验,局部的则只对某个方法校验,写如下配置文件,都放在action相同的目录下:

           a.全局的如:RegisterAction-validation.xml

           b.局部的如:RegisterAction-test-validation.xml

第一个事对RegisterAction中的所有方法都校验,第二个则只对RegisterAction中的test方法做校验,大多数情况下我们的一个action类中又很多业务所以一般都做局部校验。xml的校验分字段校验和非字段校验两种,其实不管哪种底层实现都是一样的。具体配置可查看dtd文档和default.xml,如下,

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>

   

    <!-- 非字段校验 -->  

    <validator  type="requiredstring">

         <param name="fieldName">username</param>

         <message>username requred!</message>

    </validator>

   

    <validator type="stringlength">

         <param name="fieldName">username</param>

         <param name="minLength">6</param>

         <param name="maxLength">10</param>

         <message>username should be between ${minLength} and ${maxLength} !</message>

    </validator>

     <!-- 字段校验 -->

 

    <field name="username">

        <field-validator type="requiredstring">

            <message>username requred!</message>

        </field-validator>

       

        <field-validator type="stringlength">

            <param name="minLength">6</param>

            <param name="maxLength">10</param>

            <message>username should be between ${minLength} and ${maxLength} !</message>

        </field-validator>

    </field>

<validators>

 

       6 数据校验总结,struts2的数据校验是xwork来的,我们可以通过查看源码得到,field级别的错误是封装在一个LinkedHashMap里的,而Action级别的错误是封装在一个ArrayList里的,并且LinkedHashMap得key是Stirng,value是一个ArrayList。校验顺序是先从xml配置校验开始到编码校验,从全局校验到局部校验。

 

 

 

三 拦截器(interceptor)和监听器(listener)

     1 Struts2的拦截其是基于动态代理实现的,和spring的aop机制很像,源于xwork,所有的父接口com.opensymphony.xwork.interceptor,结构和servlet的过滤器一样,有个init(),destroy() ,主要的就是String interceptor(ActionInvocation invation)方法。ActionInvocation中有个invocke(),用于链式调用,com.opensymphony.xwork2.interceptor.AbstractInterceptor和com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象方法部分实现了父接口。MethodFilterInterceptor方法用于在拦截的时候过滤某些方法,excludeMethods和includMethods用来设置包含和排除那些方法,包含优先于排除的设置。

     2 所有的系统默认拦截器都定义在了struts-default.xml中,我们可以重新定义缺省配置,如果我们在action中引入自己定义的拦截器,那么系统默认拦截器将不再引入,所以要手动引入,在实际开发中,更多的是把默认拦截器引入我们自己定义的拦截器中,再使用我们自定义的拦截器,从而达到目的。拦截器栈里配置引入的拦截器是有顺序的,那个在前那个先执行,在特定的情况下会影响结果。

     3 拦截器在Struts2中的配置如下:

        <interceptors>

             <interceptor name="interceptor" class="com.shunwang.test.interceptor.Interceptor">

             </interceptor>

             <interceptor name="interceptor2" class="com.shunwang.test.interceptor.Interceptor2">

            </interceptor>

             <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3">

            </interceptor>

             <interceptor-stack name="myStack">

                 <interceptor-ref name="interceptor"></interceptor-ref>

                 <interceptor-ref name="interceptor2"></interceptor-ref>

                 <interceptor-ref name="interceptor3"></interceptor-ref>

                 <interceptor-ref name="defaultStack"></interceptor-ref>

             </interceptor-stack>

            

       </interceptors>

       

      <action name="register" class="com.shunwang.test.action.RegisterAction" method="test">

          <result name="success">/success.jsp</result>

          <result name="input">/register2.jsp</result>

          <interceptor-ref name="myStack"></interceptor-ref>

      </action>

 

都放在struts.xml中的<package>元素里面。和action并列。具体配置可查看Struts2.0 dtd文件,在

<interceptor-ref name="myStack"></interceptor-ref>和    <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3"></interceptor>里还可以配置参数,在运行时送到interceptor中。

      4 监听器是通过时拦截器注册实现的,要实现接口PreResultListener,来实现接口

void beforeResult(ActionInvation Invoation, String resultCode); 来完成某些动作的,在action方法后在试图渲染前执行。

 

 

四 文件上传和下载

      1 Struts2的文件上传是基于Apache自己的组件common-fileupload-1.x和common-io-1.x来实现的,而Struts2封装了相关的API,使得上传更简单,更方便。

posted @ 2013-08-23 13:52  alaricblog  阅读(117)  评论(0编辑  收藏  举报