webwork 类型转换器 与 struts2

webwork 类型转换器
派生WebworkTypeConverter实现Date的类型转换
用webwork的datepicker时, 如果格式是"%Y-%m-%d"工作很正常, 但是有些格式需要带上时间的:
"%Y-%m-%d %H:%M", 这时用webwork默认的类型转换就不行了,需要自己实现, 根据javaeye论坛某高手的建议用正则表达式来判断form传过来的日期字符串是"%Y-%m-%d"还是"%Y-%m-%d %H:%M",再用相应的SimpleDateFormat来parse分析字符串生成Date对象, 代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;

import com.opensymphony.webwork.util.WebWorkTypeConverter;

public class DateConverter
extends WebWorkTypeConverter
{
private static final Logger log = Logger.getLogger( DateConverter.class );

private final static String regex_time = "[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}";

private final static SimpleDateFormat sdf_time = new SimpleDateFormat(
"yyyy-MM-dd HH:mm" );

private final static String regex_date = "[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2}";

private final static SimpleDateFormat sdf_date = new SimpleDateFormat(
"yyyy-MM-dd" );

@Override public Object convertFromString( Map context, String[] values,
Class toClass )
{
if ( values.length == 1 )
{
Date date = null;
try
{
date = convertToDate( values[0] );
}
catch ( ParseException e )
{
log.warn( e.getMessage() );
}
return date;
}

Date[] results = new Date[values.length];

for ( int i = 0; i < values.length; i++ )
{
String value = values[i];
try
{
results[i] = convertToDate( value );
}
catch ( ParseException e )
{
log.warn( e.getMessage() );
}
}

return results;
}

private Date convertToDate( String value )
throws ParseException
{
if ( value.matches( regex_time ) )
return sdf_time.parse( value );
else if ( value.matches( regex_date ) )
return sdf_date.parse( value );

return null;
}

@Override public String convertToString( Map context, Object o )
{
if ( o instanceof Date )
{
Date date = (Date) o;
return sdf_time.format( date );
}

return o.toString();
}

public static void main( String[] args )
{
System.out.println( "2006-07-11".matches( regex_date ) );
System.out.println( "2006-07-11 00:21".matches( regex_time ) );
}
}
要让这个类来代替webwork默认的转换你还需要在classpath目录, 一般就是classes目录放置配置文件
xwork-conversion.properties:
java.util.Date=DateConverter
这种方法是对整个application起作用,.
如果要只对单个action起作用, 在action同一个package写一个ActionClassName-conversion.properties:
startDate=DateConverter
09:42 浏览 (151) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 国际化
全局资源文件
可以在struts.properties中配置全局资源文件,示例如下:

java 代码
struts.custom.i18n.resources = application
查找顺序
struts按照如下顺序查找资源文件
1.ActionClass.properties
2.BaseClass.properties (all the way to Object.properties)
3.Interface.properties (every interface and sub-interface)
4.ModelDriven's model (if implements ModelDriven), for the model object repeat from 1
5.package.properties (of the directory where class is located and every parent directory all the way to the root directory)
6.search up the i18n message key hierarchy itself
7.global resource properties

访问资源
有三种方式访问资源文件
使用getText

xml 代码
<s:property value="getText('some.key')" />
使用text标记

xml 代码
<-- Fourth Example -->
<s:text name="some.key" />

<-- Fifth Example -->
<s:text name="some.invalid.key" >
The Default Message That Will Be Displayed
</s:text>
使用I18n标记

xml 代码
<s:i18n name="some.package.bundle" >
<s:text name="some.key" />
</s:i18n>
I18n Interceptor
此拦截器的主要功能是支持动态改变会话的Local。实现原理是会拦截每一个请求参数,如果请求参数包含request_locale键(可配置),拦截 器会将其值解析出Local对象储存到会话的属性,缺省健值为WW_TRANS_I18N_LOCALE(可配置),然后会将此Local传递给当前 Action实例。
以便Action实现的LocalProvider和TextProvider接口立即使用此Local获取资源文件。


注意:资源属性文件应该使用ISO8859-1编码,涉及中文字符使用16进制编码,Eclipse有专门处理Properties文件的插件可以简化此操作。
11:04 浏览 (224) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 验证
概述
Struts 2.0目前支持基本验证,客户端验证,Ajax验证,因为Ajax验证需要DWR和Dojo的支持,Dojo的性能一向不是很好,而且使用相当复杂,因此 个人倾向于仅使用基本验证功能,下面介绍如何使用基本验证。

注册验证器
如果需要添加自定义的验证器实现,必须进行注册,最简单的注册方法是创建一个validators.xml,保存在WEB-INF/classes目录 下,如果仅使用系统提供的验证器,这一步可以省略。

启动拦截器
要使验证生效,需要针对请求配置验证拦截器。注意:框架提供的验证拦截器会在发生验证错误时,继续执行Action,很怪异的行为。如果验证失败要阻止继续执行,可以在执行每个Action之前判断是否有字段错误决定是否继续执行。

定义验证规则
验证规则可以针对每一个Action,比如 ActionName-validation.xml ,也可以针对Action的接口和超类。目前有两种验证器,通用验证器和字段验证器,通用验证器有更高的优先级。

配置验证器时可以指定short-circuite属性,以终止其他验证器执行。 如果发生验证错误,通用验证器将停止其他验证器的运行,而字段验证器只会停止针对同一个字段的其他验证器的执行。

检索验证错误
Action提供getFieldErrors和getActionErrors方法用来获取字段验证错误,和通用验证错误。另外Struts提供和标记用于检索错误。

注意:

此标记需要Freemark的支持,请确认freemark库文件的存在。
UI标记只在特定的theme才能生效。
比如使用XHTML标记,需要在HTML文件的head区域使用如下标记标识使用的theme:

xml 代码
<head>
<s:head theme="xhtml"/>
head>

<body>
<s:fielderror/>
body>
实践
笔者是使用spring整合struts的,在执行验证时发现,如果同一个字段多次验证失败,会保存多个相同的验证消息,也就是上一次请求的错误信息并没有清除点,进一步讲应该是两次请求使用的是同一个Action实例,是什么原因呢?

解决方案:后来发现是spring配置的action实例缺省是基于会话的,也就是在内存中会缓存action实例,更改配置的scope属性即可,示例如下:

xml 代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="byName" default-lazy-init="true">
<bean id="customerAction" class="org.quickj.samples.web.CustomerAction" scope="request"/>
</beans>

11:01 浏览 (252) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 UI标记/模板/主题
概述
Struts2.0提供一些UI标记,封装了错误显示,提示等逻辑(用起来还不错),这些UI标记是基于模板技术实现的,缺省是基于Freemark模板 技术,如果有能力可以实现自己的模板引擎,很少有这种需求。

该模板引擎会将标记与对应的模板文件联系起来,然后解析为HTML片断返回。这些模板文件会封装相应的逻辑。

框架缺省提供基于xhtml,xhmtl-css,ajax等几套模板,一套模板就称为一个主题(theme)。

模板路径
全局模板路径由struts.properties文件的action.ui.templateDir 属性决定,也可以针对某个具体的标记改变模板加载位置。

模板文件可以保存在类路径,也可以保存在应用上下文路径,模板引擎会首先查找应用上下文路径。缺省的模板文件路径为template/{theme} /*.ftl,其中{theme}表示主题名称,比如xhtml。

每个UI标记都有theme属性,可以用来选择采用的theme,缺省使用的主题由struts.properties文件的application.ui.theme 属性决定。

扩展模板
有时候框架生成的UI可能不能满足要求,这时候可以进行扩展。如果要基于框架提供的主题进行扩展,通常的作法是将类路径下的主题文件拷贝到应用程序上下 文,再改写相应的部分。因为引擎会首先查找应用程序上下文。

包装已有主题
xthml主题提供几个很好的例子,simple主题提供基本的控件,而许多xhtml标记只是在此基础上添加一个头部或尾部,示例如下:

xml 代码
<#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />
<#include "/${parameters.templateDir}/simple/xxx.ftl" />
<#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
扩展已有主题
包含一个主题的所有模板文件的目录下可以包含一个theme.properties文件,可以添加一个parent入口指定需要扩展的主题,然后只要提供 需要改写的模板文件即可,比如ajax主题就使用这种技术扩展xhtml主题,示例如下:

xml 代码
parent = xhtml

10:59 浏览 (340) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 拦截器
Token拦截器
问题描述
提交表单时,可能出现这样的情况,如果上次提交成功,按浏览器的返回按钮,再提交一次会出现同一份数据提交两次的情况。如果这份表单不幸两次写入数据库,可能会赞成问题。
Struts提供两个拦截器用来阻止这种用户无意的行为可能导致的重复提交问题。

实现过程
1.在提交的表单中,添加标记。
2.配置TokenInterceptor或TokenSessionInterceptor。
3.配置invoke.token结果,决定如果遇到重复提交时需要返回的页面。

另外可以在struts.properties文件中提供struts.messages.invalid.token健值决定如果发生Token的错误信息。

TokenInterceptor实现原理
标记的作用是在显示表单页面时,服务器(由TokenHelper类实现)会生成一个唯一的令牌键值对,并在提交表单时发送给服务器。
服务器会检测客户端提交的令牌和缓存的令牌进行比较,如果是有效的则清除服务器端缓存并继续处理,如果是无效的,则返回invalid.token结果(通常显示一个提示页面)。

TokenSessionStoreInterceptor实现原理
TokenSessionStoreInterceptor扩展至TokenInterceptor,改写了处理无效令牌的机制,不是返回一个 invalid.token结果,而是返回上一次成功提交后的结果页面,这是如何做到的呢?
TokenSessionStoreInterceptor会针对每次拦截成功执行的ActionInvocation根据令牌的健值为标识符进行缓存, 如果发生重复提交,则取出缓存的ActionInvocation中的Result对象返回。

ExecuteAndWaitInterceptor
此拦截器主要目的是给一些长任务请求更好的用户体验,在长任务执行过程中显示给用户一个等待页面,可以通过配置wait结果页面提供一个自定义的等待页 面,否则框架将提供一个缺省的比较丑陋的等待页面。
注意:
此拦截器必须放在拦截器堆栈的最后。
此拦截器基于会话的,这意味着同一个会话中同时只能执行一个此请求。


实现原理
1.拦截器会将当前请求包装在一个后台线程中执行(由BackgroundProcess类实现)。
2.在后台线程执行的过程中,拦截器会每隔100微秒检查一下,后台线程是否执行结束。
3.如果在指定的延迟后,后台线程依然没有结束,将返回一个等待页面。
4.如果在指定的延迟后,后台线程运行结束,将返回请求的结果页面。


注意:
因为Action运行在一个后台进程,Action无法使用ActionContext,因为ActionContext是线程本地的。如果必须访问比如 会话数据,你必须让Action实现SessionAware接口,而不是调用ActionContext.getSession方法。

10:58 浏览 (258) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 整合Sitemesh
概述
Struts 2.0提供一个Sitemesh插件,允许在Sitemesh模板中使用Struts标记。

要使用Sitemesh需要包含Freemark,Sitemesh和Sitemesh插件库文件。

配置过滤器
如果需要使用Freemark模板文件作为装饰器文件,需要在web.xml文件中添加如下配置:

xml 代码
<filter>
<filter-name>struts-cleanupfilter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUpfilter-class>
filter>
<filter>
<filter-name>sitemeshfilter-name>
<filter-class>org.apache.struts2.sitemesh.FreeMarkerPageFilterfilter-class>
filter>
<filter>
<filter-name>strutsfilter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcherfilter-class>
filter>

<filter-mapping>
<filter-name>struts-cleanupfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>sitemeshfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter-mapping>
<filter-name>strutsfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
注意ActionContextCleanUp过滤器必须在FilterDispatcher之前配置,ActionContextCleanUp的主要 功能是通知FilterDispatcher执行完毕不要清除ActionContext,以便sitemesh装饰器可以访问Struts值堆栈。

配置装饰器
在WEB-INF目录下创建一个decorator.xml文件,指定装饰器需要匹配哪些文件,下述示例指定main.flt将装饰所有的jsp文件:

xml 代码
<!--sp-->xml version="1.0" encoding="ISO-8859-1"?>

<decorators defaultdir="/decorators">
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
<pattern>/exclude.jsppattern>
<pattern>/exclude/*pattern>
excludes>

<decorator name="main" page="main.ftl">
<pattern>/*.jsppattern>
decorator>
decorators>
如果需要自定义装饰器映射器,需要在WEB-INF目录下创建一个sitemesh.xml文件(通常从发布包中拷贝过来更改相应部分)。这一步骤是可选 的,通常缺省的配置就能够满足要求。

定义装饰器文件
缺省情况下,sitemesh假定装饰器文件保存在应用上下文根路径下的decorators目录下,如果采用如上配置,装饰器文件应该是ftl格式,如 果需要使用其他格式,需要更改过滤器配置。

访问被装饰页面
在Freemark装饰器文件中,可以通过如下变量访问被装饰页面的相关部分:

xml 代码
${title}......访问被装饰页面的标题。

${head}......访问被装饰页面的头信息,标题除外。

${body}......访问被装饰页面的body内容。

${page.properties.meta.author}......访问被装饰页面的属性。
内部变量
Freemark和Struts整合提供如下内部变量:

xml 代码
stack......值堆栈本身,示例${stack.findString('ognl expr')}

action......Action实例

response/res......响应对象

request/req......请求对象

session......会话对象

application......ServletContext

base......请求的上下文路径

下面介绍访问应用程序各范围属性的语法示例:

Application范围
假定Application范围有一个属性 myApplicationAttribute :

java 代码
<#if Application.myApplicationAttribute?exists> ${Application.myApplicationAttribute} if> 或

java 代码<@s.property value="%{#application.myApplicationAttribute}" /> Session范围
假定会话范围内有一个属性mySessionAttribute:

java 代码
<#if Session.mySessionAttribute?exists> ${Session.mySessionAttribute} if> 或

java 代码
<@s.property value="%{#session.mySessionAttribute}" />
Request范围
假定请求范围有一个属性myRequestAttribute

java 代码
<#if Request.myRequestAttribute?exists> ${Request.myRequestAttribute} if> 或

java 代码<@s.property value="%{#request.myRequestAttribute}" /> Request参数
假定请求参数myParameter

java 代码<#if Parameters.myParameter?exists> ${Parameters.myParameter} if> or

java 代码<@s.property value="%{#parameters.myParameter}" /> Context参数
假定框架上下文有一参数myContextParam

java 代码${stack.findValue('#myContextParam')} 或

java 代码
<@s.property value="%{#myContextParam}" />
10:55 浏览 (539) 评论 (0) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 文件上传/下载
文件上传
基本原理
上传文件是由FileUploadInterceptor实现的,基本原理是这样的,FileUploadInterceptor会从上传的数据中解析出 上传的文件名称,文件类型和文件内容,调用Action相应的方法进行设置。

假定上传表单中File控件的名称是upload,则Action必须实现如下三个设值方法:

setUploadFile……保存上传的文件内容
setUploadFileName……保存上传的文件名称
setUploadContentType……保存上传的文件类型

拦截器支持针对上传表单同一名称的文件控件有多个的情况,也就是同时上传多个文件,此时要求上述方法的参数是一个列表或者数组,下面描述同时上传多个文件的实现步骤:

构建上传表单
下面的示例代码中,名称为upload的File控件有多个,表示要同时上传多个文件。


"upload" action="customer/upload.action" method="POST"
enctype="multipart/form-data">
"File (1)" name="upload" />
"File (2)" name="upload" />
"FIle (3)" name="upload" />



实现Action
这里重点列举必须实现的三个设值方法,我们可以注意到,方法名称是单数形式,但是参数是一个列表。

java 代码
public void setUploadContentType( List uploadContentTypes)
{
this.uploadContentType = uploadContentTypes;
}

public void setUploadFileName( List uploadFileNames)
{
this.uploadFileName = uploadFileNames;
}

public void setUpload( List uploads)
{
this.upload = uploads;
}
配置拦截器
具体的配置不再赘述,需要提一下的是此拦截器支持allowTypes和maximumSize属性,支持限制文件类型及文件大小。

另外在捕获错误时,会设置几个字段错误,字段错误的消息可以在资源文件中配置,支持的三种错误类型的键值如下:

struts.messages.error.uploading……当文件不能被上传时的错误信息。
struts.messages.error.file.too.large……文件大小超限时的错误信息。
struts.messages.error.content.type.not.allowed……文件类型不允许时的错误信息。

全局配置
可以在struts.properties文件中设置上传文件保存的临时目录,最大大小等。

下载
下载是通过StreamResult类来实现,这是一个自定义结果类型,主要作用是直接向HttpServletResponse对象发送原始数据。 StreamResult假定Action会提供一个输入流的访问方法,并将这个输入流输出到响应对象中。

SteamResult还提供如下配置属性。

contentType……发送数据的MIME类型,比如text/plain
contentLength……内容长度,单位为字节,浏览器会基于此值显示进度条
contentDispostion……设置响应头Content-disposition的值,缺省为inline
bufferSize……从输入流中读取到输出流的缓存大小
inputName……action中提供输入流的属性名称,缺省为inputStream

下面是一个StreamResult的配置示例:


xml 代码
<action name="download2" class="org.apache.struts2.showcase.filedownload.FileDownloadAction">
<param name="inputPath">\images\struts-gif.zip</param>
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename="struts-gif.zip"</param>
<param name="bufferSize">4096</param>
</result>
</action>
注意:Result对象中可以通过OGNL语法访问值堆栈,这意味着可以通过Action或其他方式传递值来设置Result配置参数,比如上述配置中contentDisposition通常是动态的,这可以通过action传递。

10:52 浏览 (659) 评论 (1) 分类: WebWork 收藏 2007-08-01
缩略显示Struts 2.0 问题解决记录
问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误:

java 代码
javax.servlet.ServletException: Error applying decorator: null
解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:

java 代码
protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
if (invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}
改正后的代码如下:

java 代码
protected Locale getLocale(ActionInvocation invocation, Configuration configuration) {
if (invocation != null && invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}


问题描述:使用Struts2.0.6+Sitemesh2.2.3,我有一个请求/customer/page.action,其结果页面为WEB-INF/jsp/customer/list.jsp,我希望使用main装饰器对返回结果进行装饰,如果配置如下:


xml 代码
<decorator name="main" page="main.ftl">
<pattern>/WEB-INF/jsp/customer/list.jsppattern>
decorator>
则无法成功进行装饰,如果配置如下:

xml 代码
<decorator name="main" page="main.ftl">
<pattern>/*pattern>
decorator>
则可以成功进行装饰。

解决方案:经过调试发现,原来装饰器是根据请求的URI路径匹配需要装饰的页面的,而且此URI路径是相对于上下文路径的,因此针对上述需求正确的配置如下:


xml 代码
<decorator name="main" page="main.ftl">
<pattern>/customer/page.actionpattern>
decorator>
问题描述: 使用Struts2.0.6+Sitemesh2.2.3+Hibernate3.2.2,配置如下:

xml 代码
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<!--Hibernate Open Session in View Filter-->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>
org.apache.struts2.sitemesh.FreeMarkerPageFilter
</filter-class>
</filter>
<!-- Struts filter -->
<filter>
<filter-name>struts</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
会导致如下错误

java 代码
System Runtime Error:
Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
如果去除对OpenSessionInViewFilter的配置则CRUD正常。
如果去除FreeMarkerPageFilter和ActionContextCleanUp过滤器,仅保留OpenSessionInViewFilter,CRUD也不能正常工作。

解决方案:待解决

10:50 浏览 (425) 评论 (1) 分类: WebWork 收藏 2007-05-23
缩略显示webwork.properties
文件说明
default.properties是Webwork的缺省配置文件,可以被classpath根目录下的 webwork.properties 文件覆盖

配置工厂
指定用来配置webwork的 Configuration.
用户可以扩展 com.opensymphony.webwork.config.Configuration 来创建自己的方式来获取配置参数以传给webwork

# webwork.configuration=com.opensymphony.webwork.config.DefaultConfiguration指定locale,编码
用来设置你的缺省 locale和编码方案

# webwork.locale=en_USwebwork.i18n.encoding=UTF-8Object Factory
如果指定了,缺省的ojbect factory在这里可以被覆盖
注意:缩写在某些情况下是支持的,例如 "spring" .作为代替,你可以提供一个 com.opensymphony.xwork.ObjectFactory 子类的名称

# webwork.objectFactory = spring自动装配策略
指定当使用SpringObjectFactory时的自动装配逻辑.
合法值包括: name, type, auto, 和 constructor (缺省为 name )

webwork.objectFactory.spring.autoWire = name类缓存
标识webwork-spring集成,如果类实例应该被缓存
这可能,直到将来Spring版本让它变得可能,否则就保持它为true
除非你确切的知道你在做什么,否则不要改变
合法的值包括: true, false (true 是缺省的)

webwork.objectFactory.spring.useClassCache = true缺省对象类型裁决者
如果设定了,缺省的对象类型裁决者可以被覆盖

注意: 缩写在某些情况下支持,例如 "tiger" or "notiger"
作为代替,你可以提供一个 com.opensymphony.xwork.util.ObjectTypeDeterminer 实现类的名字
注意: 如果在classpath里有 xwork-tiger.jar, GenericsObjectTypeDeterminer 缺省会被使用
关闭tiger支持,在这里使用 "notiger" 属性值.

#webwork.objectTypeDeterminer = tiger#webwork.objectTypeDeterminer = notiger文件上传设置
用来处理HTTP POST请求,编码使用MIME-type multipart/form-data方式的

# webwork.multipart.parser=cos# webwork.multipart.parser=pellwebwork.multipart.parser=jakarta保存的目录缺省使用 javax.servlet.context.tempdir
webwork.multipart.saveDir=webwork.multipart.maxSize=2097152定制配置
装载定制的属性文件(不会覆盖webwork.properties!)

# webwork.custom.properties=application,com/webwork/extension/custom缺省URL映射处理器
用来处理request URL如何映射到action,或者相反的映射(用户可以实现自己的处理)

webwork.mapper.class=com.opensymphony.webwork.dispatcher.mapper.DefaultActionMapper缺省后缀
DefaultActionMapper使用的设置
你可以提供一个逗号分割的列表,例如 webwork.action.extension=action,jnlp,do

webwork.action.extension=action是否静态文件由FilterDispatcher服务
FilterDispatcher使用的设置
如果为true,那么WebWork将会为它jar包内的静态文件提供服务.
如果为false,那么静态文件必须在<context_path>/webwork下面可以访问

webwork.serve.static=true标签语法设定
使用 alternative syntax 在大多数地方需要 %{} 来计算标签的字符串属性的值

webwork.tag.altSyntax=true开发模式设定
当设置为true时,WebWork会对开发者更友好.这包括:

webwork.i18n.reload = true
webwork.configuration.xml.reload = true
引发不同的调试信息或者忽略的问题为错误信息
例如: 正常情况下,一个请求 foo.action?someUnknownField=true 会被忽略(从web过来的任何值,都是不可信的).
因此,在开发的时候,当这些错误发生时立刻提醒,这可能是有用的
webwork.devMode = false 译注:设置为true时,所有有名字(name)的input都必须有对应的setter,否则会报错.如果不需要,请删除name.


国际化资源设定
当设置为true,资源包会在每个请求时自动重新载入.
这在开发时很方便,但是不应该在生产状态下使用

webwork.i18n.reload=falsetheme和模板设定
标准的UI theme
改变这个会映射缺省由那个路径的模板来输出JSP控件标签

webwork.ui.theme=xhtmlwebwork.ui.templateDir=template设置缺省模板类型,可以是ftl,vm,jsp

webwork.ui.templateSuffix=ftl配置自动更新设定
配置自动重新装载,这会导致配置来重新载入xwork.xml, 当它改变的时候

webwork.configuration.xml.reload=falseVelocity配置设定
velocity.properties 文件的位置.缺省是 velocity.properties

# webwork.velocity.configfile = velocity.properties逗号分割的 VelocityContext 类名来链接到 WebWorkVelocityContext

# webwork.velocity.contexts =URL相关设定
用来构建URL,例如UrlTag

webwork.url.http.port = 80webwork.url.https.port = 443自定义国际化资源
装载自定义的缺省资源包(如果有多个,用逗号分割)

# webwork.custom.i18n.resources=testmessages,testmessages2应用服务器相关设定
有些app server不能处理HttpServletRequest.getParameterMap(),经常使用的是WebLogic,Orion和OC4J

webwork.dispatcher.parametersWorkaround = falseFreeMarker相关设定
配置要用的 Freemarker Manager 类
允许用户插入自定义的 Freemarker Manager ,如果需要的话
必须扩展 com.opensymphony.webwork.views.freemarker.FreemarkerManager

#webwork.freemarker.manager.classname=com.opensymphony.webwork.views.freemarker.FreemarkerManager浏览 WebWorkBeanWrapper 的javadoc 了解更多信息

webwork.freemarker.wrapper.altMap=trueXSLTResult相关设定
配置 XSLTResult 类使用 stylesheet 缓存.
开发时设置为true,生产时设置为false.

webwork.xslt.nocache=false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值