webwork标签以及国际化内容

2009-10-31 15:01WebWork标签库分为七大类:
通用标签: 最常用, 最基本的标签;
组件化标签: 鼓励视图的组件化;
流程控制标签: 在JSP页面中管理控制流程;
迭代标签: 迭代元素并操作可迭代(iterable)的对象;
UI标签: 生成HTML表单字段和控件;
VUI标签: 在WebWork2.0版本之后,VUI 标签已经从WebWork里移除.因为它们在4年中基本没有被使用过;
国际化支持标签: 提供国际化视图支持.
通用标签


<ww:property /> 获取结果的属性值. 如果值未指定, 将返回栈顶值.

<ww:push />
将一个值压入值栈.

<ww:param />
设置父标签的参数. 仅用于其他标签内部, 用于设置父标签某些属性的值.

<ww:set />
将值栈中的某个对象的值设置到一个scope(page, stack, application, session)中. 如果值未给定, 将使用栈顶值. 如果scope未给定, 使用"webwork"的缺省scope.

<ww:url />
构建一个编码的URL.


组件化标签


<ww:action /> 在标签库的上下文环境中执行一个活动. 标签的主体用来显示活动执行的结果.

<ww:bean />
创建一个JavaBean, 初始化它的属性并放入ActionContext以便后续使用.

<ww:include />
包含另一个页面或活动.


流程控制标签
这个if-else的标签集合就像if-else脚本一样.


<ww:if /> 有条件执行路径. 换言之, 如果布尔条件是true的话, 就运算标签主体内容.

<ww:else />
if标签的反向执行路径. 换言之, 如果前一个if标签的布尔条件是false的话, 就运算标签主体内容.

<ww:elseif />
if标签的反向执行路径. 换言之, 如果前一个if标签的布尔条件是false且本标签的布尔条件是true的话, 就运算标签主体内容.


迭代标签


<ww:iterator /> 在一个集合(collection)上迭代.

<ww:generator />
生成迭代器(Iterator).

<ww:append />
添加几个迭代器.

<ww:subset />
获取一个迭代器的子集.

<ww:merge />
合并几个迭代器.

<ww:sort />
对迭代器进行排序.


UI标签
UI标签包装了HTML控件以便与核心框架紧密集成. 这些标签设计目标是最小化代码中的逻辑部分, 并用一个模版系统代理最终的HTML绘制. UI标签试图覆盖最普遍的情景(scenario), 并提供了一个component标签以创建定制组件. UI标签还内建支持显示内嵌的


<ww:form /> 所有其他UI标签的容器

<ww:textfield />
创建一个文本框

<ww:password />
创建一个密码输入框

<ww:textarea />
创建一个文本输入域

<ww:checkbox />
创建一个复选框

<ww:select />
创建一个下拉框

<ww:radio />
创建一组单选按钮

<ww:checkboxlist />
创建一组复选框

<ww:label />
创建一个标签

<ww:hidden />
创建一个隐藏域

<ww:doubleselect />
创建一组相关联的下拉框

<ww:combobox />
创建一个下拉输入框(既可以选择下拉框中的选项,也可以自己输入内容)

<ww:component />
创建一个自定义的控件(通过Velocity模版的信息)


国际化标签


<ww:text /> 输出一个经过国际化处理的字符串.

<ww:i18n />
将国际化资源包(resource bundle)放入值栈中, 为text标签使用.


Webwork的表单验证及其国际化

最近突然用到了Webwork的验证和国际化功能,于是翻遍了所有可以翻的地方,把心得写出来给大家分享.
我用的是webwork2.2.2,不同版本之间会有细微的差别,但都是webwork2差别不会很大.先说一下Webwork的验证方式,webwork2.2有如下几种验证方式:
第一种,直接在Action代码里验证.这种方式不值得推崇,因为没法复用,同时由于数据验证代码和真正业务逻辑混在一起,使程序的可读性差,但涉及到复杂的验证,这种直接的验证方式还是有它用武之地的.
第二种,让你的Action Class继承自ActionSupport,即实现validatable接口,在你的Action Class里实现public void validate()方法,覆盖掉其父类里的validate()方法,并让你xwork里的action加入workflow Interceptor,这样此Action Class里的所有的action都会由此validate()方法验证.如果此Action Class里的某个Action不需要验证,则在其xwork配置文件中,别放入workflow Interceptor即可.但此种方法下,该Action Class里的所有的Action方法都经过相同的验证,如果需要不同的验证,则此方法不适用.
第三种,也就是利用Xwork的验证框架来实现,需要建立ActionClassName-alias-validation.xml验证文件,但这 种方式要求强制使用ww标签,不使用ww标签是不能显示错误信息来的.而ww标签通常会把你的布局搞乱,所以这种方式在下不推荐,而且网上有大量的教程介 绍此种方式,所以在下这里不多描述.
以上部分我们介绍了webwork的验证方式.下面我着重介绍一下第2种方式在实际应用中的实现,当然我们提供验证信息的国际化,即通过读取资源文件的方式来提示错误信息,而在下认为第2种方式在实际应用中更加方便,而且受限制的条件也小.下面看具体的例子:
环境:webwork2.2.2
工具:eclipse及propertiesEditor插件
过程:通过访问Action返回一个Velocity的视图,在该视图显示出错误信息!
1.写资源文件(扩展名为properties)
资源文件名前缀要和ActionClass一致,并放于与ActionClass相同的包下,其后跟标准语言标识,假设我们的 ActionClass为UserService,则建立UserService-zh-CN.properties和UserService-en- US.properties,一定要用PropertiesEditor编辑它们,代码如下:
UserService-zh-CN.properties:


java 代码
error.username=请输入用户名
error.password=请输入密码
UserService-en-US.properties:

java 代码
error.username=user name is required
error.password=user password is required

2.写UserService.java文件,代码如下:

java 代码
public class UserService extends ActionSupport
{
private IUser user;
//action 方法,插入用户对象
public String insert() throws Exception
{
//这里省略了具体业务逻辑代码
return SUCCESS;
}
//重载父类里的validate()方法
public void validate()
{
IUser user = this.getUser();
String username = user.getName();
String password = user.getPassword();
if(usename.equals(""))
{
this.addFieldError("username",getText("error.username"));
}
if(password.equals(""))
{
this.addFieldError("password",getText("error.password"));
}
}
//setters and getters

}

3.编写Xwork配置文件:

xml 代码
xml 代码
<action name="insertUser" class="com.davy.UserService" method="insert">
<result name="success" type="velocity">
<param name="location">/success.htmparam>
result>
<result name="input" type="velocity">
<param name="location">/input.htmparam>
result>
<interceptor-ref name="chain"/>
<interceptor-ref name="params"/>
<interceptor-ref name="workflow"/>
action>
需要注意的是workflow Interceptor一定要在Xwork.xml中声明过.
4.编写页面input.htm,注意虽然Velocity的默认扩展名为vm,但我们仍然可以改为htm,Velocity也会支持的.input.htm的代码如下:
xml 代码
<form id="form1" name="form1" method="post" action="insertUser.action">
<input name="user.name" type="text" id="user.name" />$!fieldErrors.username.get(0)
<input name="user.password" type="text" id="user.password" />$!fieldErrors.password.get(0)
<input type="submit" name="Submit" value="提交" />
form>

这样,我们的工作就完成了,接下来就可以在浏览器里测试了,如果浏览器设置为中文,则出现的提示信息问中文,如果浏览器语言设置为英语,则提示信息为英文.例子是简陋了一些,但适用于不使用ww标记的情况.


webwork的国际化资源访问方式
webwork的国际化资源文件可以放在多个位置上:

特定的Action的资源文件ActionName_locale.properties,例如 TestAction_zh_CN.properties
具有共同父类的Action共享的资源文件,定义在父类ActionName_locale.properties,例如 WEB-INF/classes/com/opensymphony/xwork/ActionSupport_zh.properties
全局共享资源文件,由webwork.properties指定资源文件位置,例如在webwork.properties里面定义: webwork.custom.i18n.resources=xwork.application-i18n
那么资源文件在WEB-INF/classes/xwork/application-i18n_zh.properties

资源访问的优先级
按照就近原则,首先寻找当前Action的资源文件,然后寻找Action的父类中的资源文件,最后寻找webwork.properties里面定义的全局共享资源文件。


资源访问方式
首先Action必须继承ActionSupport,因为ActionSupport实现了资源访问接口TextProvider,如果你不希望Action继承ActionSupport,那么必须自己实现TextProvider接口,以获得资源访问能力。

webwork的JSP Tag提供了访问资源的方式,例如:

<ww:text name="title"/>
对于资源文件中包含参数,可以嵌套参数Tag:

<ww:text name="title"> <ww:param>Webwork</ww:param> <ww:param>JSP Tag</ww:param></ww:text>
由于webwork的view访问资源的方式,实际上是通过调用ognlStack堆栈栈顶的action对象的getText(...)方法实现的,所以我们可以直接运用这种方式,例如:

<ww:textfield label="%{getText('title')}" name="username"/>
由于JSP Tag不能嵌套,因此当遇到上面这种情况,需要在Tag里面访问资源的时候,我们就必须采用这种直接通过ognlStack访问action的方式

当我们使用FreeMakrer作为view的时候,两种方式都可以采用
采用Tag方式:

<@ww.text name="title"/><@ww.text name="title"> <@ww.param>webwork</@ww.param> <@ww.param>jsp tag</@ww.param></@ww.text>
采用ognlStack方式:

${action.getText("title")}
对比两种方式:

<@ww.textfield label="%{getText('title')}" name="username" /><@ww.textfield label="${action.getText('title')}" name="username" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值