一. 配置Action

    1. 基本配置

       . action名
       . action类
       . result类型

   

    <xwork>
        <include file="webwork-default.xml">
        <package extends="webwork-default" name="default">
        <default-action-ref name="home">

        <action>
                       
                        name="helloWorld"
                       
                        class="ch2.example1.HelloWorld">
                   
            <result name="input">login.jsp</result>
            <result type="redirect" name="success">/index.jsp</result>
        </action>
        </default-action-ref>
    </package>       

        以上例子中,如果helloWorld action返回的result code是SUCCESS,那么用户将会重定向到/index.jsp。如果返回的
        result code是INPUT,将会显示login.jsp页面。

    2.  配置别名重用action

        将多个名字映射到相同的action类;这个名字称为别名。这时多个请求访问相同的execute()方法;

        在别名基础上,可增加一个可选的method属性,指定webwork该调用哪个方法。所指定的方法格式与execute()方法一样。
        这时多个请求访问不同的方法;

        <action class="ch2.example1.Cal" name="add">
            <result name="success">cal.jsp</result>          
        </action>
       
        <action method="minus" class="ch2.example1.Cal" name="minus">
            <result name="success">cal.jsp</result>          
        </action>        

        注:WebWork通过xwork.xml映射至方法有两种途径:
            . 通过查找与method属性的值一致的方法;
            . 通过查找doMethod()形式的方法;

            WebWork先找method属性一致方法,如找不到,再找doMethod()形式方法;

    3.  不配置别名重用action

        通过name!method.action形式请求访问action,其中name为action的映射名字。这时不需额外配置。

        注:优先推荐,但要预防不怀好意的用户通过该途径使用你不想让用户调用的方法;

    4.  通过参数自定义action

        可通过在配置文件中设置参数传递给action. 从而达到非常灵活设置的目的。

        a. 在xwork.xml文件的action配置位置处配置以下信息(配置参数名称为url):

           <action class="ch2.example1.ParamTest" name="paramTest">
              <result name="success">paramTest.jsp</result>
             
           </action> 

        b. action

           在action中定义与参数名同名的属性以及对应的setter/getter方法,webwork在action执行时会自动调用
           setter方法为属性赋在xwork.xml文件中所配置的参数值;

        c. jsp

           通过标记: <ww:property value="属性名">  获取参数值;

二. 配置Result

    1.  基本配置:

        <result type="redirect" name="success">paramTest.jsp</result>

        result由两个部分组成:
        . result映射: 通过name属性指定result的逻辑名,name的属性值与action中execute()方法中的返回值相同;
                       result标记本体内容指定跳转的路径,既可以为绝对路径(/代表包含namespace内容在内的web应用根路径),
                       也可以为相对路径;
        . result类型: 通过type属性指定,默认值为dispatcher,可以指定为redirect。如指定为redirect,则产生
                       一个新的请求跳转至目的地址;

    2.  使用全局result映射减少重复配置

        设定全局result,服务于多个action配置,减少重复配置;

        <global-results>
            <result type="redirect" name="success">paramTest.jsp</result>
    </global-results>
        <action class="ch2.example1.ParamTest" name="paramTest">

三. 配置interceptor

    interceptor(拦截器)是一种很特殊的对象,它围绕着action及result的执行过程。它可以在action之前或之后及result
    之后工作,实现了某些逻辑的松耦合,譬如安全、日志和校验。

    1.  定义interceptor

        . 定义

          <package name="webwork-default">
               <interceptors>
                    <interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger">
                    <interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer">
               </interceptor>
          </interceptor>

          注:一般不需自行定义,在webwork-default.xml文件中已定义了很多interceptor。webwork-default.xml位于
              webwork-2.2.4.jar文件根目录中;

        . 使用

          <package name="webwork-default">
               <interceptors>
                    <interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger">
                    <interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer">
               </interceptor>
               <action class="ch2.example1.ParamTest" name="paramTest">
                    <interceptor-ref name="timer">
                    <interceptor-ref name="logger">
               </interceptor-ref> 
          </interceptor-ref>
       
        这样设置后,当paramTest.action被调用的时侯,timer和logger两个interceptor也会相应地被调用。

    2.  将多个interceptor组合为栈

        将多个interceptor组合到一起,而不需要为每一个action声明数量众多的<interceptor-ref>。一个interceptor栈包含
        一组interceptor,并且按照它们本身在栈中定义的顺序来执行。

        . 定义

          <package name="webwork-default">
               <interceptors>
                    <interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger">
                    <interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer">
               </interceptor>
           
               <interceptor-stack name="myStack">
                    <interceptor-ref name="logger">
                    <interceptor-ref name="timer">
               </interceptor-ref>
          </interceptor-ref>         

        . 使用       

          <package name="webwork-default">
               <interceptors>
                    <interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger">
                    <interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer">
               </interceptor>
           
               <interceptor-stack name="myStack">
                    <interceptor-ref name="logger">
                    <interceptor-ref name="timer">
               </interceptor-ref>

               <action class="ch2.example1.ParamTest" name="paramTest">
                    <interceptor-ref name="myStack">
               </interceptor-ref>
          </action>         

    3.  使用默认interceptor-ref减少重复配置

        通过使用default-interceptor-ref元素,package中每一个action都不再需要定义任何interceptor。

           <package name="webwork-default">
               <interceptors>
                    <interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger">
                    <interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer">
               </interceptor>
           
               <interceptor-stack name="myStack">
                    <interceptor-ref name="logger">
                    <interceptor-ref name="timer">
               </interceptor-ref>

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

               <action class="ch2.example1.ParamTest" name="paramTest">
          </action>      

        注:如为一个action定义了interceptor,那么这个action将不再使用默认的interceptor。

四. 高级配置

    1.  package

        WebWork中的package和Java中的package在很多方面非常相似,它将多个action组织成一个模块。简化维护工作,提高
        重用性。一个package中包含了所有将用到的action, result, interceptor的定义。

    2.  扩展package

        WebWork中的package可以扩展另外的package:为其extends属性指定一个用逗号分隔的package列表,从而扩展该列表的
        package。当一个WebWork package扩展另外一个package时,将会从被包含的package中复制所有的定义,并在自己本身
        已有的定义基础上增加这些配置。这让你可以将配置的公共部分集中起来,减少package中重复定义的内容。

        <package extends="webwork-default" name="default">
        ...
        </package>

    3.  映射namespace

        WebWork通过action名字和所属的namespace标识action。如果package没定义namespace属性,将使用默认的namespace: "/"。
        当WebWork接收到一个请求的时侯,WebWork会将请求的URL分为namespace和action名字两个部分,然后从xwork.xml中查找
        namespace/action内容,如果没有找到,则从默认的namespace中查找action。

        <package namespace="/enterinfo" extends="webwork-default" name="default">
            <action class="ch2.example1.ParamTest" name="paramTest">
                   
                <result type="redirect" name="success">paramTest.jsp</result>
                </action>
        </package>

        以上访问paramTest,通过URL: http://localhost:8080/enterinfo/paramTest.action,其中:
        . /enterinfo为namespace的名字;
        . paramTest为action的名字;

        多个package可以使用相同的namespace。

    4.  使用include标签实现组件化

        为了支持将应用程序划分为更容易管理的模块,WebWork提供了一种包含机制,可以将xwork.xml划分为多个文件,而每一个
        子文件又是与一个模块相联系的。可以通过使用<include>标签指定文件名的方法将子文件包含到xwork.xml中,而WebWork
        就会在应用程序的classpath中查找指定的子文件。

       
        <xwork>
             <include file="webwork-default.xml">            
             <package namespace="/enterinfo" extends="webwork-default" name="default">
             ...
             </package>
        </include>
 
五. 其它配置

    1. web.xml

   
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4">
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <servlet>
            <servlet-name>webwork</servlet-name>
            <servlet-class>
                com.opensymphony.webwork.dispatcher.ServletDispatcher
            </servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>webwork</servlet-name>
            <url-pattern>*.action</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
        <jsp-config>
            <taglib>
                <taglib-uri>webwork</taglib-uri>
                <taglib-location>
                    /WEB-INF/lib/webwork-2.2.4.jar
                </taglib-location>
            </taglib>
        </jsp-config>
    </web-app>      

    2. webwork.properties

       xwork.xml定义了action映射,并且将interceptor和result应用到这些action上。而webwork.properties用来定义
       application范围的设置,以及能够改变框架功能的配置参数。

       WebWork首先会装载位于WebWork JAR文件中的default.properties,然后再装载webwork.properties,并且根据
       webwork.properties内容改写之前装载的配置设定。</xwork></include></default-interceptor-ref></interceptor-ref></interceptor-stack></interceptor></interceptors></package> </interceptor-ref></interceptor-stack></interceptor></interceptors></package> </interceptor-stack></interceptor></interceptors></package> </interceptor-ref></action></interceptor></interceptors></package> </interceptors></package> </action></ww:property></include></xwork>