xwork.xml
Package(包)
Packages是把Actions, Results, Result Types, Interceptors和Stacks分组成逻辑单元的一种方式,以分享一些共同设置.包跟对象一样可以扩展,也可以被"子"包覆盖部分属性.
"name"属性是package的必需,在这个package被引用时作为key. "extends"属性是可选的,使一个package可以继承一个或多个前面package中的拦截器,拦截器栈,action等配置.注意,配置文件是被至上而下处理的,所以"被继承"的包必需定义在"继承"包的上面. "abstract"是可选的表示一个包为抽象包,这样的包可以被继承,但是不能有action的定义.
属性 | 必需 | 描述 |
---|---|---|
name | 是 | 被其它包引用时的key |
extends | 否 | 继承其它包 |
namespace | 否 | 参见名称空间的配置 |
abstract | 否 | 把包声明为抽象(包中没有action定义) |
"namespace"名称空间属性允许把action配置分成不同的名称空间,这样您可以在具有不同类和参数名称空间中使用相同的名字的action了.这一点是和Webwork1.x不同,在Webwork1.x中所有的action名字都是全局的不能再一个应用程序中重用.Webwork中有以"/"命名的根名称空间,它是请求直接来自应用程序根路径的时候的名称空间.和其他名称空间一样,如果在根名称空间中没有所需的action别名,系统会回到默认名称空间中查找.
注意:
应该保证在每个名称空间中只有一个默认action被配置.因此如果你在同一个空间里配置了多个默认aciton,系统就不知道那个是默认的了.
Include configuration (包含xml文件)
为了方便的管理大型项目(非常多的action和配置),Webwork允许您在xwork.xml中包含其他的配置文件.被包含的文件必须是xwork.xml的格式(有doctype和其他每样东西),而且必须放在classpath下(通常是/WEB-INF/classes或/WEB-INF/lib下的jar文件中).
Action configuration
Action是Webwork的基础"工作单元".一个action一般就是一个请求(或点击按钮或提交表单).action元素(tag就和JSP太同义了)有两部分,一个友好的名字(URL相关,如saveForm.action)和一个负责"处理"的类.
可选属性"method"用来告诉WebWork调用action的那个方法.如果method属性为空,WebWork调用默认调用*execute*()方法.如果Action类中既没有execute()方法也没有在xml文件中指定其他方法,WebWork会抛出异常.
您也可以在您的表单中用"actionName!something"的方式告诉WebWork调用Action类中的"something"方法.例如"formTest!save.action"会调用FormAction类中的"save"方法.这个方法必须是public且没有参数.
"actionName"的所有配置包括拦截器和返回类型等都会被"actionName!something"使用.
...
return SUCCESS;
}
Action的类属性可以像下面一样省略:
在这种情况下,会缺省使用com.opensymphony.xwork.ActionSupport 类,它有一个execute()方法,缺省返回SUCCESS.
....
</ action >
从Webwork2.2.1开始您也可以指定一个当xwork.xml中找不到指定的action时执行的默认action.这一特性主要是用来满足为创建非常简单或相似的action类或元素的需求.默认action名可以在package元素里面这样配置:
...
< default-action-ref name ="simpleViewResultAction" >
<!--
An example of a default action that is just a simple class
that has 3 fields: successUrl, errorUrl, and inputUrl. This action
parses the request url to set the result values. In the normal case
it just renders velocity results of the same name as the requested url.
-->
< action name ="simpleViewResultAction" class ="SimpleViewResultAction" >
< result type ="velocity" > ${successUrl} </ result >
< result name ="error" type ="velocity" > ${errorUrl} </ result >
< result name ="input" type ="velocity" > ${inputUrl} </ result >
</ action >
...
</ package >
Result Configuration (结果配置)
Result是Action返回的表示Action执行情况的字符串常量.WebWork定义了一些默认结果:error, input, login, none and success.开发者当然也可以根据应用情况自由的定义结果.结果以"名字-值"的形式影射到结果类型.
结果标签告诉WebWork在action被调用以后下一步做什么.这里是WebWork定义好的一些结果编码:
String NONE = " none " ;
String ERROR = " error " ;
String INPUT = " input " ;
String LOGIN = " login " ;
您可以自己扩展.大多数情况下你会用到 SUCCESS 或 ERROR ,当返回 SUCCESS 时跳转到下应用程序的一个页面.
< param name ="location" > /thank_you.jsp </ param >
</ result >
...如果返回*ERROR*转向错误页面或回到前面的页面.
< param name ="location" > /error.jsp </ param >
</ result >
结果在xwork.xml文件中定义,嵌套在<action>标签里.如果location参数是唯一的参数,你可以这样简单的定义:
< result name ="success" type ="dispatcher" >
< param name ="location" > foo.jsp </ param >
</ result >
</ action >
注意:
第一个result的属性省略了,WebWork缺省会把它当作"success".如果没有指定<result ...>标签的type属性,WebWork默认为dispatcher类型(类似于Servlet标准中的SerlvetDispatcher的forward)
Interceptor Configuration
拦截器允许您定义一些能在一个action执行的前后执行的代码.它是做web应用程序时很有用的工具.最常见的拦截器实现可以是:
- 安全检查(确保访问者是登陆用户)
- 跟踪日志(记录每个action)
- 效率瓶颈检查(记录每个action开始和结束的时间以检查程序中的瓶颈)
您也可以把拦截器连在一起组成 拦截器栈.如果您想在action执行前同时做登陆检查,安全检查和记录日志,可以定义一个拦截器的包.
拦截器必须事先定义(命名)好,然后可以连在一起组成一个栈.
< interceptor name ="security" class ="com.mycompany.security.SecurityInterceptor" />
< interceptor-stack name ="defaultComponentStack" >
< interceptor-ref name ="component" />
< interceptor-ref name ="defaultStack" />
</ interceptor-stack >
</ interceptors >
在action中这样使用.
< result name ="success" > ... </ result >
< interceptor-ref name ="defaultComponentStack" />
</ action >
注意:引用名既可以是拦截器名也可以是栈名
xwork.xml code:
< include file ="webwork-default.xml" />
< package name ="default" extends ="webwork-default" >
< interceptors >
< interceptor-stack name ="crudStack" >
< interceptor-ref name ="params" />
< interceptor-ref name ="defaultStack" />
</ interceptor-stack >
</ interceptors >
< default-action-ref name ="showcase" />
< action name ="showcase" >
< result > showcase.jsp </ result >
</ action >
< action name ="date" class ="com.opensymphony.webwork.showcase.DateAction" >
< result name ="success" > /date.jsp </ result >
</ action >
</ package >
< package name ="skill" extends ="default" namespace ="/skill" >
< default-interceptor-ref name ="crudStack" />
< action name ="list" class ="com.opensymphony.webwork.showcase.action.SkillAction" method ="list" >
< result > /empmanager/listSkills.jsp </ result >
< interceptor-ref name ="basicStack" />
</ action >
< action name ="edit" class ="com.opensymphony.webwork.showcase.action.SkillAction" >
< result > /empmanager/editSkill.jsp </ result >
< interceptor-ref name ="params" />
< interceptor-ref name ="basicStack" />
</ action >
< action name ="save" class ="com.opensymphony.webwork.showcase.action.SkillAction" method ="save" >
< result name ="input" > /empmanager/editSkill.jsp </ result >
< result type ="redirect" > edit.action?skillName=${currentSkill.name} </ result >
</ action >
< action name ="delete" class ="com.opensymphony.webwork.showcase.action.SkillAction" method ="delete" >
< result name ="error" > /empmanager/editSkill.jsp </ result >
< result type ="redirect" > edit.action?skillName=${currentSkill.name} </ result >
</ action >
</ package >
< package name ="employee" extends ="default" namespace ="/employee" >
< default-interceptor-ref name ="crudStack" />
< action name ="list" class ="com.opensymphony.webwork.showcase.action.EmployeeAction" method ="list" >
< result > /empmanager/listEmployees.jsp </ result >
< interceptor-ref name ="basicStack" />
</ action >
< action name ="edit" class ="com.opensymphony.webwork.showcase.action.EmployeeAction" >
< result > /empmanager/editEmployee.jsp </ result >
< interceptor-ref name ="crudStack" >< param name ="validation.excludeMethods" > execute </ param ></ interceptor-ref >
</ action >
< action name ="save" class ="com.opensymphony.webwork.showcase.action.EmployeeAction" method ="save" >
< result name ="input" > /empmanager/editEmployee.jsp </ result >
< result type ="redirect" > edit.action?empId=${currentEmployee.empId} </ result >
</ action >
< action name ="delete" class ="com.opensymphony.webwork.showcase.action.EmployeeAction" method ="delete" >
< result name ="error" > /empmanager/editEmployee.jsp </ result >
< result type ="redirect" > edit.action?empId=${currentEmployee.empId} </ result >
</ action >
</ package >
</ xwork >
Views (表现层)
WebWork支持JSP和Velocity(译者注:还有Freemaker,Xslt,Groovy等)作为表现层技术.这个例子中我们使用JSP文件.WebWork提供了一套标签库(taglibs).你可以在JSP文件中把这些标签作为组件使用.这里是form.jsp页的一部分.
< html >
< head >< title > Webwork Form Example </ title ></ head >
< body >
< ww:form name ="myForm" action ="'formTest'" namespace ="/" method ="POST" >
< table >
< ww:textfield label ="First Name" name ="'formBean.firstName'" value ="formBean.firstName" />
< ww:textfield label ="Last Name" name ="'formBean.lastName'" value ="formBean.lastName" />
< ww:submit value ="Save Form" />
</ table >
</ ww:form >
</ body >