- webwork.properties
Webwork属性配置文件。Webwork有个缺省的属性配置文件default.properties,在webwork.jar文件中,你可以建立一个webwork.properties
文件重新设置相关属性,相同属性的设置webwork.properties将覆盖default.properties的设置。下面是个default.properties内容,对其中
属性作点说明:
### 国别区域设置 中国就设为 zh_CN
webwork.locale=en_US
### 指定Webwork2采用哪个解析器解析以multipart/form-data 发送的Http请求
#webwork.multipart.parser=cos
webwork.multipart.parser=pell
# 设置Servlet上下文临时文件目录位置及上传文件大小的最大值
# 如果没有指定saveDir,将使用容器的临时目录
webwork.multipart.saveDir=
webwork.multipart.maxSize=2097152
### Load custom property files (does not override webwork.properties!)
webwork.custom.properties=application,com/webwork/extension/custom
# Action的后缀名称
webwork.action.extension=action
# 标准UI主题,用于定义缺省主题模板在哪个位置,相对于/
webwork.ui.theme=xhtml
webwork.ui.templateDir=template
### 设置当xwork.xml文件发生改变时是否重新载入
webwork.configuration.xml.reload=false
### 指定velocity模板引擎的属性文件
webwork.velocity.configfile = velocity.properties
### 链到WebWorkVelocityContext的VelocityContext类名列表,用逗号分割
webwork.velocity.contexts =
- webwork-default.xml
webwork-default.xml 包含在webwork.jar中,是一个基本配置文件,里面配置了标准的Result Type、Interceptors以及两个interceptors stacks
defaultStack和validationWorkflowStack,可以Include到xwork.xml文件直接使用而不必进行Copy。如:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="default" extends="webwork-default">
...
</package>
</xwork>
下面是Webwork2.1的webwork-default.xml文件内容:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<package name="webwork-default">
<result-types>
<result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
<result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
<result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
<result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
<result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
<result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
</result-types>
<interceptors>
<interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
<interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
<interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
<interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
<interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
</package>
</xwork>
- validators.xml
Webwork2的验证完全利用XWork的验证框架,用于Action执行前的输入数据验证。
Validators应用前首先要进行注册,由于XWork的ValidatorFactory完成这项工作。在程序中可以用
ValidatorFactory.registerValiator(String name,String className)
静态方法进行Validator的注册;或者将Validator.xml文件放在/WEB-INF/classes下,其内容如下:
<validators>
<validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
</validators>
第二步是将其与需要执行验证的Action关联起来,就是给相应Action指定ValidationInterceptor,这个过程在进行Action配置(xwork.xml)
时完成,具体就是将ValidationInterceptor-refs加在Action配置中:
<interceptor name="validator" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<action name="MyAction" class="com.opensymphony.webwork.example.MyAction">
<result name="success" type="velocity">
<param name="location">/success.vm</param>
</result>
<interceptor-ref name="validator"/>
</action>
缺省的validationWorkflowStack已包含validator。
验证规则:
每个Action类可以指定一个ActionName-validation.xml
每个Action别名可以指定一个ActionName-Alias-validation.xml
扩展类和接口实现类Action,Webwork将向上搜索继承树,查找Action的父类和被实现接口的缺省Validator
最后在相应的xxx-validation.xml中指定验证内容。下面是个示例: SimpleAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="bar">
<field-validator type="required">
<message>You must enter a value for bar.</message>
</field-validator>
<field-validator type="int">
<param name="min">6</param>
<param name="max">10</param>
<message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
</field-validator>
</field>
<field name="date">
<field-validator type="date">
<param name="min">12/22/2002</param>
<param name="max">12/25/2002</param>
<message>The date must be between 12-22-2002 and 12-25-2002.</message>
</field-validator>
</field>
<field name="foo">
<field-validator type="int">
<param name="min">0</param>
<param name="max">100</param>
<message key="foo.range">Could not find foo.range!</message>
</field-validator>
</field>
<validator type="expression">
<param name="expression">foo > bar</param>
<message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
</validator>
</validators>
解析 SimpleAction-validation.xml文件。
我们看到,field-validator、validator元素都有一个 type 属性,它其实就是由ValidatorFactiory注册的Validator的名子。
param参数是可选的,message元素是必须的。message元素可以有个key属性,通过key可以在Action验证失败时显示国际化信息。这里关于
通过 key 获取国际化信息的说法在Webwork2的Reference中有点不准确,LocaleAware接口是Webwork2的迁移版本。在Webwork2.1正式
版是通过action调用getText()方法来取得国际化文本,不过这个action必须扩展ActionSupport或实现LocaleProvider、TextProvider
接口。${...}中的值可以来自validator或action,如
bar must be between ${min} and ${max}, current value is ${bar}.
其中${min} ${max}来自validator,而${bar}来自action。
> components.xml
Ioc配置文件。在Webwork2中,Ioc用于实现Component管理。要利用IIoc功能必须进行下面三步设置。
1. 配置 web.xml文件
要允许该功能,必对 web.xml进行下列配置:
<filter>
<filter-name>container</filter-name>
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>container</filter-name>
<url-pattern>*.action</url-pattern> <!-- modify appropriately -->
</filter-mapping>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
关于web.xml文件的配置请查阅servlet规范或web.xml的DTD。
上面设置允许Webwork2管理application , session, request作用域的,既是在你的应用中只用到一个作用域的对象,上面三个
filter都必须正确设置。
2.配置xwork.xml
ComponentInterceptor 用来应用Ioc模式到XWork的Action,在xwork.xml的Interceptors元素中应包含下面内容:
<interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
应当确保所有需要注入Componenet的Action都 有这个Interceptor的引用。关于如何进行配置Interceptor参见上面xwork.xml文件
配置说明。
想要在别的对象或Component上应用Ioc,需要直接使用ComponentManager对象。
defaultStack 内含ComponentInterceptor,所以如果你的 action 应用了defaultStack,ComponentInterceptor也就包含到里面了。
3.配置components.xml文件
该文件用来指定哪个component将应用Ioc模式来注入给 action,该配置由XWork的ComponentManager对象来加载,然后应用给任何
实现 enabler 接口的 action。该文件必须放在/WEB-INF/classes下,下面是个组件Counter的配置示例,Counter对象的生命与
session的相同,该Component将传给任一实现CounterAware接口的action类。
<components>
<component>
<scope>session</scope>
<class>com.opensymphony.webwork.example.counter.Counter</class>
<enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
</component>
</components>
每个 component 必须有下面三属性设置:
scope: 有效值是 application,session,request,不同的值决定component的生存期。其含义与ASP、JSP中的相应对象相同。
class: component类。在指定的scope期间,该类的一个实例将对象需要该组件的action 有效。该组件是lazy-loaded的,只有
真正需时才被创建,组件的实现必须有一个不带参数的构造器。
enabker: 任何实现该接口的action都将会被注入该组件对象的实例。
需要说明的是,当components依赖另外的components时, 后者的scope不能比前者窄。比如上面的session component不能依赖于一个
request scope的component。
Webwork属性配置文件。Webwork有个缺省的属性配置文件default.properties,在webwork.jar文件中,你可以建立一个webwork.properties
文件重新设置相关属性,相同属性的设置webwork.properties将覆盖default.properties的设置。下面是个default.properties内容,对其中
属性作点说明:
### 国别区域设置 中国就设为 zh_CN
webwork.locale=en_US
### 指定Webwork2采用哪个解析器解析以multipart/form-data 发送的Http请求
#webwork.multipart.parser=cos
webwork.multipart.parser=pell
# 设置Servlet上下文临时文件目录位置及上传文件大小的最大值
# 如果没有指定saveDir,将使用容器的临时目录
webwork.multipart.saveDir=
webwork.multipart.maxSize=2097152
### Load custom property files (does not override webwork.properties!)
webwork.custom.properties=application,com/webwork/extension/custom
# Action的后缀名称
webwork.action.extension=action
# 标准UI主题,用于定义缺省主题模板在哪个位置,相对于/
webwork.ui.theme=xhtml
webwork.ui.templateDir=template
### 设置当xwork.xml文件发生改变时是否重新载入
webwork.configuration.xml.reload=false
### 指定velocity模板引擎的属性文件
webwork.velocity.configfile = velocity.properties
### 链到WebWorkVelocityContext的VelocityContext类名列表,用逗号分割
webwork.velocity.contexts =
- webwork-default.xml
webwork-default.xml 包含在webwork.jar中,是一个基本配置文件,里面配置了标准的Result Type、Interceptors以及两个interceptors stacks
defaultStack和validationWorkflowStack,可以Include到xwork.xml文件直接使用而不必进行Copy。如:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="default" extends="webwork-default">
...
</package>
</xwork>
下面是Webwork2.1的webwork-default.xml文件内容:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<package name="webwork-default">
<result-types>
<result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
<result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
<result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
<result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
<result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
<result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
</result-types>
<interceptors>
<interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
<interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
<interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
<interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
<interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="static-params"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
</package>
</xwork>
- validators.xml
Webwork2的验证完全利用XWork的验证框架,用于Action执行前的输入数据验证。
Validators应用前首先要进行注册,由于XWork的ValidatorFactory完成这项工作。在程序中可以用
ValidatorFactory.registerValiator(String name,String className)
静态方法进行Validator的注册;或者将Validator.xml文件放在/WEB-INF/classes下,其内容如下:
<validators>
<validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
</validators>
第二步是将其与需要执行验证的Action关联起来,就是给相应Action指定ValidationInterceptor,这个过程在进行Action配置(xwork.xml)
时完成,具体就是将ValidationInterceptor-refs加在Action配置中:
<interceptor name="validator" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<action name="MyAction" class="com.opensymphony.webwork.example.MyAction">
<result name="success" type="velocity">
<param name="location">/success.vm</param>
</result>
<interceptor-ref name="validator"/>
</action>
缺省的validationWorkflowStack已包含validator。
验证规则:
每个Action类可以指定一个ActionName-validation.xml
每个Action别名可以指定一个ActionName-Alias-validation.xml
扩展类和接口实现类Action,Webwork将向上搜索继承树,查找Action的父类和被实现接口的缺省Validator
最后在相应的xxx-validation.xml中指定验证内容。下面是个示例: SimpleAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="bar">
<field-validator type="required">
<message>You must enter a value for bar.</message>
</field-validator>
<field-validator type="int">
<param name="min">6</param>
<param name="max">10</param>
<message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
</field-validator>
</field>
<field name="date">
<field-validator type="date">
<param name="min">12/22/2002</param>
<param name="max">12/25/2002</param>
<message>The date must be between 12-22-2002 and 12-25-2002.</message>
</field-validator>
</field>
<field name="foo">
<field-validator type="int">
<param name="min">0</param>
<param name="max">100</param>
<message key="foo.range">Could not find foo.range!</message>
</field-validator>
</field>
<validator type="expression">
<param name="expression">foo > bar</param>
<message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
</validator>
</validators>
解析 SimpleAction-validation.xml文件。
我们看到,field-validator、validator元素都有一个 type 属性,它其实就是由ValidatorFactiory注册的Validator的名子。
param参数是可选的,message元素是必须的。message元素可以有个key属性,通过key可以在Action验证失败时显示国际化信息。这里关于
通过 key 获取国际化信息的说法在Webwork2的Reference中有点不准确,LocaleAware接口是Webwork2的迁移版本。在Webwork2.1正式
版是通过action调用getText()方法来取得国际化文本,不过这个action必须扩展ActionSupport或实现LocaleProvider、TextProvider
接口。${...}中的值可以来自validator或action,如
bar must be between ${min} and ${max}, current value is ${bar}.
其中${min} ${max}来自validator,而${bar}来自action。
> components.xml
Ioc配置文件。在Webwork2中,Ioc用于实现Component管理。要利用IIoc功能必须进行下面三步设置。
1. 配置 web.xml文件
要允许该功能,必对 web.xml进行下列配置:
<filter>
<filter-name>container</filter-name>
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>container</filter-name>
<url-pattern>*.action</url-pattern> <!-- modify appropriately -->
</filter-mapping>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
关于web.xml文件的配置请查阅servlet规范或web.xml的DTD。
上面设置允许Webwork2管理application , session, request作用域的,既是在你的应用中只用到一个作用域的对象,上面三个
filter都必须正确设置。
2.配置xwork.xml
ComponentInterceptor 用来应用Ioc模式到XWork的Action,在xwork.xml的Interceptors元素中应包含下面内容:
<interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
应当确保所有需要注入Componenet的Action都 有这个Interceptor的引用。关于如何进行配置Interceptor参见上面xwork.xml文件
配置说明。
想要在别的对象或Component上应用Ioc,需要直接使用ComponentManager对象。
defaultStack 内含ComponentInterceptor,所以如果你的 action 应用了defaultStack,ComponentInterceptor也就包含到里面了。
3.配置components.xml文件
该文件用来指定哪个component将应用Ioc模式来注入给 action,该配置由XWork的ComponentManager对象来加载,然后应用给任何
实现 enabler 接口的 action。该文件必须放在/WEB-INF/classes下,下面是个组件Counter的配置示例,Counter对象的生命与
session的相同,该Component将传给任一实现CounterAware接口的action类。
<components>
<component>
<scope>session</scope>
<class>com.opensymphony.webwork.example.counter.Counter</class>
<enabler>com.opensymphony.webwork.example.counter.CounterAware</enabler>
</component>
</components>
每个 component 必须有下面三属性设置:
scope: 有效值是 application,session,request,不同的值决定component的生存期。其含义与ASP、JSP中的相应对象相同。
class: component类。在指定的scope期间,该类的一个实例将对象需要该组件的action 有效。该组件是lazy-loaded的,只有
真正需时才被创建,组件的实现必须有一个不带参数的构造器。
enabker: 任何实现该接口的action都将会被注入该组件对象的实例。
需要说明的是,当components依赖另外的components时, 后者的scope不能比前者窄。比如上面的session component不能依赖于一个
request scope的component。