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)和一个负责"处理"的类.
<
action
name
="formTest"
class
="com.opensymphony.webwork.example.FormAction"
method
="processForm"
>
可选属性"method"用来告诉WebWork调用action的那个方法.如果method属性为空,WebWork调用默认调用*execute*()方法.如果Action类中既没有execute()方法也没有在xml文件中指定其他方法,WebWork会抛出异常.
您也可以在您的表单中用"actionName!something"的方式告诉WebWork调用Action类中的"something"方法.例如"formTest!save.action"会调用FormAction类中的"save"方法.这个方法必须是public且没有参数.
"actionName"的所有配置包括拦截器和返回类型等都会被"actionName!something"使用.
public
String save()
throws
Exception
...
{
...
return SUCCESS;
}
Action的类属性可以像下面一样省略:
在这种情况下,会缺省使用com.opensymphony.xwork.ActionSupport 类,它有一个execute()方法,缺省返回SUCCESS.
<
action
name
="myAction"
>
....
</
action
>
从Webwork2.2.1开始您也可以指定一个当xwork.xml中找不到指定的action时执行的默认action.这一特性主要是用来满足为创建非常简单或相似的action类或元素的需求.默认action名可以在package元素里面这样配置:
<
package
name
="myPackage"
....
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
...
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
default-action-ref
name
="simpleViewResultAction"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<!--
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
...
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
package
>
Result Configuration (结果配置)
Result是Action返回的表示Action执行情况的字符串常量.WebWork定义了一些默认结果:error, input, login, none and success.开发者当然也可以根据应用情况自由的定义结果.结果以"名字-值"的形式影射到结果类型.
结果标签告诉WebWork在action被调用以后下一步做什么.这里是WebWork定义好的一些结果编码:
String SUCCESS
=
"
success
"
;
String NONE
=
"
none
"
;
String ERROR
=
"
error
"
;
String INPUT
=
"
input
"
;
String LOGIN
=
"
login
"
;
您可以自己扩展.大多数情况下你会用到 SUCCESS 或 ERROR ,当返回 SUCCESS 时跳转到下应用程序的一个页面.
<
result
name
="success"
type
="dispatcher"
>
<
param
name
="location"
>
/thank_you.jsp
</
param
>
</
result
>
...如果返回*ERROR*转向错误页面或回到前面的页面.
<
result
name
="error"
type
="dispatcher"
>
<
param
name
="location"
>
/error.jsp
</
param
>
</
result
>
结果在xwork.xml文件中定义,嵌套在<action>标签里.如果location参数是唯一的参数,你可以这样简单的定义:
<
action
name
="bar"
class
="myPackage.barAction"
>
<
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执行前同时做登陆检查,安全检查和记录日志,可以定义一个拦截器的包.
拦截器必须事先定义(命名)好,然后可以连在一起组成一个栈.
<
interceptors
>
<
interceptor
name
="security"
class
="com.mycompany.security.SecurityInterceptor"
/>
<
interceptor-stack
name
="defaultComponentStack"
>
<
interceptor-ref
name
="component"
/>
<
interceptor-ref
name
="defaultStack"
/>
</
interceptor-stack
>
</
interceptors
>
在action中这样使用.
<
action
name
="VelocityCounter"
class
="com.opensymphony.webwork.example.counter.SimpleCounter"
>
<
result
name
="success"
>
...
</
result
>
<
interceptor-ref
name
="defaultComponentStack"
/>
</
action
>
注意:引用名既可以是拦截器名也可以是栈名
xwork.xml code:
<
xwork
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
include
file
="webwork-default.xml"
/>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
action
name
="date"
class
="com.opensymphony.webwork.showcase.DateAction"
>
<
result
name
="success"
>
/date.jsp
</
result
>
</
action
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
package
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
package
name
="skill"
extends
="default"
namespace
="/skill"
>
<
default-interceptor-ref
name
="crudStack"
/>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
package
name
="employee"
extends
="default"
namespace
="/employee"
>
<
default-interceptor-ref
name
="crudStack"
/>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
</
xwork
>
Views (表现层)
WebWork支持JSP和Velocity(译者注:还有Freemaker,Xslt,Groovy等)作为表现层技术.这个例子中我们使用JSP文件.WebWork提供了一套标签库(taglibs).你可以在JSP文件中把这些标签作为组件使用.这里是form.jsp页的一部分.
<%
...
@ taglib prefix="ww" uri="webwork"
%>
<
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
>