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>