当前位置: 代码迷 >> Web前端 >> Webwork之Action配备详解
  详细解决方案

Webwork之Action配备详解

热度:139   发布时间:2012-10-27 10:42:25.0
Webwork之Action配置详解
Webwork之Action配置详解
                        作者:Davy Lee, davy.lee@126.com

Webwork的核心是负责web应用程序中具体逻辑实现的action,本文的目的就是对action的配置、xwok.xml文件的部署进行详细的阐述,本文先列出配置action的注意事项及技巧,最后将给出一个具体的配置实例。

1.  让你的xwork.xml文件包含webwork-default.xml,因为它里面包含了许多默认的配置
代码如下:
<include name=”webwork-default.xml”/>

2.使用隐式默认的result类型有助于减少必需的配置内容,代码如下:
<xwork>
<include name=”webwork-default.xml”/>
<package name=”default” extends=”webwork-default”>
<result-types>
<result-type name=”velocity” class=”com.opensymphony.webwork.dispatcher.VelocityResult”default=”true” />
</result-types>
<action name=”login”
       class=”dealLogin”  method=”doLogin”>
     <result name=”success”>userIndex.htm</result>
</action>
</package>
</xwork>

这样我们在default这个package中指定了默认的result-type为velocity,则在此包中配置的名为login这个action中,虽然结果result没有写type=”velocity”,webwork仍然会按照默认的结果类型即velocity进行调度。

3.运用全局的result映射减少重复的配置,你可以为每个package定义任意数量的全局result映射,即<global-results>,代码如下:
<xwork>
<include name=”webwork-default.xml”/>
<package name=”default” extends=”webwork-default”>
<result-types>
<result-type name=”velocity” class=”com.opensymphony.webwork.dispatcher.VelocityResult”default=”true” />
</result-types>
<global-results>
  <result name=”error” type=”velocity”>/error.htm</result>
</global-results>
<action name=”login”
       class=”dealLogin”  method=”doLogin”>
     <result name=”success”>userIndex.htm</result>
</action>
</package>
</xwork>

这样我们执行login.action如果返回的标识码为error,尽管我们没有单独对login这个action定义result=”error”接点,webwork还是会定向到/error.htm页去。这里要注意两点,第一,局部的映射会覆盖掉全局映射;第二,全局映射要用绝对地址。

4.使用默认的interceptor-ref减少拦截机(栈)的重复配置,可以为每个package定义一个默认的interceptor-ref,代码如下:
<xwork>
<include name=”webwork-default.xml”/>
<package name=”default” extends=”webwork-default”>
<result-types>
<result-type name=”velocity” class=”com.opensymphony.webwork.dispatcher.VelocityResult”default=”true” />
</result-types>
<global-results>
  <result name=”error” type=”velocity”>/error.htm</result>
</global-results>
<interceptors>
  <interceptor name=”param” class=”…”/>
  <interceptor name=”timer” class=””/>
</interceptors>
<default-interceptor-ref  name=”param”/>
<action name=”login”
       class=”dealLogin”  method=”doLogin”>
     <result name=”success”>userIndex.htm</result>
</action>
</package>
</xwork>

这样我们就为这个package 指定了默认的拦截机paramInterceptor,如果此包中的login这个action没有显式指定interceptor,则webwork会按照param拦截机来处理。这里提醒两点:第一,可以把多个interceptor按照顺序组合起来组成interceptor-stack,然后把这个interceptor设置成default-interceptor-ref;第二,如果为某个action如login.action定义了interceptor,则会覆盖掉default-interceptor-ref,webwork会忽略掉default-interceptor-ref,只会按照局部的interceptor来处理。

5.package,抽象package和namespace
(1).抽象package和package很类似,只是里面不能有具体的action的映射,它的作用是提供基础的package的配置,供其他package扩展(或说继承).可以通过设置布尔类型的abstract属性为true来标识一个package为抽象package.(这个我没有试验,大家可以试验一下,呵呵)。
(2).namespace,命名空间,如果某个package 没有指定namespace,则它的默认namespace为“ ”,webwork会把你的url拆分成namespace和action名字两部分,然后webwork就会从xwork.xml中查找namespace/action命名对,如果找不到,就到默认的namespace中去找;大型应用中,应该尽量减少定义在default namespace中的action的数目。

对于webwork的action的配置,我就介绍到这里,有不当之处欢迎大家指正。最后给大家的是一个具体的例子,来自《webwork in action》一书,只为演示,供大家参考。以下例子中有3个package,default package提供基础配置,secure package存放需要认证的action,public package 存放公开的action,详细配置文件如下:
------------------------------------------------------ xwork.xml -----------------------------------------------
<xwork>
<include name=”webwork-default.xml”/>
<package name=”default” extends=”webwork-default”>
<interceptors>
  <interceptor name=”auth” class=”org.hibernate.auction.web.interceptors.AuthenticationInterceptor”/>
  <interceptor name=”timer” class=””/>
</interceptors>
<global-results>
  <result name=”error” type=”velocity”>/error.htm</result>
</global-results>
</package>
</xwork>

------------------------------------------------------ xwork-public .xml ---------------------------------------
<xwork>
<package name=”public” extends=”default” namespace=”/public”>
<default-interceptor-ref name=” completeStack” />

<action>
  ……………
</action>
</package>
</xwork>

----------------------------------------------------xwork-secure.xml----------------------------------------
<xwork>
<package name=”secure” extends=”default” namespace=”/secure”>
  <interceptor-stack name=”default”>
   <interceptor-ref name=”auth”/>
   <interceptor-ref name=”completeStack”/>
</interceptor-stack>
<default-interceptor-ref name=”default” />
<!―受保护的action-->
<action>
  ……………
</action>
</package>
</xwork>

(全文完,作者:Davy Lee,邮件地址:davy.lee@126.com)

1 楼 tornyz 2007-07-23  
应该注明"(摘自<<Webwork in action>>一书)"...
2 楼 DavyLee 2007-07-23  
这不是原文,里面有我的话,条理结构也是我组织的,当然我的确是参照的《webwork in action》,而且文中也提到了!但要写“摘自某某”,我觉得我的笔墨就玷污了那本书了
3 楼 crazyasp 2008-06-18  
不错,有我想要的:<global-results>  <result name=”error” type=”velocity”>/error.htm</result> </global-results>
  相关解决方案