Webwork的表单验证及其国际化??? 最近突然用到了Webwork的验证和国际化功能,于是翻遍了所有可以翻的地方,
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:
- <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标记的情况,希望能对有这种需要的朋友有所帮助. 1 楼 zhao 2007-11-06 遇到一个问题:某个字段是double型,当用conversion校验时, 当填入的不是数字时都有二个这样的提示,
如何把1去掉,只留2
1.Invalid field value for field "protocol.money".
2.金额必须是数字,请重新输入。
其中,1是webwork默认提示的,2是我自己写的一个提示message,我想把默认提示去掉,如何做? 2 楼 yuan_2004 2007-11-14 这是在客户端验证的吧.请问:"如何在服务器验证呢?" 3 楼 xellos 2007-11-14 yuan_2004 写道这是在客户端验证的吧.请问:"如何在服务器验证呢?"
这怎么成了在客户端验证的了? 4 楼 xellos 2007-11-14 另外想请教一下楼主:
你说用到了国际化功能,我想打听一下这是个什么项目.与技术无关的,我只是想了解一下,什么样的项目有国际化需求. 5 楼 DavyLee 2007-11-15 xellos 写道另外想请教一下楼主:
你说用到了国际化功能,我想打听一下这是个什么项目.与技术无关的,我只是想了解一下,什么样的项目有国际化需求.
呵呵,这是做的一个运营的项目,因为项目不仅仅面向我们中国的用户,还要面向英语语种的用户,所以要用到国际化了!作为开发者,我们还是有必要了解一下国际化的!
以上的东西写的并不完整,比较简单,我想可能除了我,象上面这种用法的可能不多.而且以上说的是验证的国际化!这只是国际化的一个方面,是代码层的;另一个重要的方面就是UI国际化了.补充一点吧,完全按照以上所描述的实现方式,UI的国际化就简单了,即可在Action返回的Velocity的视图(我的扩展名是htm,而不是vm)层写$action.getText("label.xxx")即可.这里的$action就是当前Action的实例,或者说,$action是实例化了的Action对象的reference.
写的浅薄了些,当作抛砖引玉,有感兴趣的朋友一起交流吧! 6 楼 DavyLee 2007-11-15 yuan_2004 写道这是在客户端验证的吧.请问:"如何在服务器验证呢?"
这已经是服务端验证了,是服务端验证的一种方式,但不是标准方式,服务端验证的标准方式是使用webwork自带的验证框架使用ActionClassName-alias-validation.xml文件的方式进行验证,但这种方式强制视图层使用ww标签显示验证的提示信息,这就要求必须使用jsp做视图,与我的初衷不吻合,所以我简单一带而过.这种标准验证方式网上有好多,在下就不重复了. 7 楼 xiaoqiang 2007-11-30 zhao 写道遇到一个问题:某个字段是double型,当用conversion校验时, 当填入的不是数字时都有二个这样的提示,
如何把1去掉,只留2
1.Invalid field value for field "protocol.money".
2.金额必须是数字,请重新输入。
其中,1是webwork默认提示的,2是我自己写的一个提示message,我想把默认提示去掉,如何做?
这个1的校验,是在执行你2之前做的。在你的validation interceptor之前,有一个conversionError 的拦截器,只要把这个拦截器去掉就可以了 8 楼 xiaoqiang 2007-11-30 DavyLee 写道yuan_2004 写道这是在客户端验证的吧.请问:"如何在服务器验证呢?"
这已经是服务端验证了,是服务端验证的一种方式,但不是标准方式,服务端验证的标准方式是使用webwork自带的验证框架使用ActionClassName-alias-validation.xml文件的方式进行验证,但这种方式强制视图层使用ww标签显示验证的提示信息,这就要求必须使用jsp做视图,与我的初衷不吻合,所以我简单一带而过.这种标准验证方式网上有好多,在下就不重复了.
的确,这是一种服务器校验。
PS:在此谢谢楼主的这番讲解,我又重新看了下源代码,条理又明白了很多 :) 9 楼 dh_java 2008-02-20 DavyLee 写道xellos 写道另外想请教一下楼主:
你说用到了国际化功能,我想打听一下这是个什么项目.与技术无关的,我只是想了解一下,什么样的项目有国际化需求.
呵呵,这是做的一个运营的项目,因为项目不仅仅面向我们中国的用户,还要面向英语语种的用户,所以要用到国际化了!作为开发者,我们还是有必要了解一下国际化的!
以上的东西写的并不完整,比较简单,我想可能除了我,象上面这种用法的可能不多.而且以上说的是验证的国际化!这只是国际化的一个方面,是代码层的;另一个重要的方面就是UI国际化了.补充一点吧,完全按照以上所描述的实现方式,UI的国际化就简单了,即可在Action返回的Velocity的视图(我的扩展名是htm,而不是vm)层写$action.getText("label.xxx")即可.这里的$action就是当前Action的实例,或者说,$action是实例化了的Action对象的reference.
写的浅薄了些,当作抛砖引玉,有感兴趣的朋友一起交流吧!
10 楼 dreamer_0924 2008-02-20 写的不错,虽说简陋了点,但言简意赅 11 楼 kjj 2008-03-19 普通的html都可以啊。为什么说必须要ww标签呢 12 楼 DavyLee 2008-03-22 引用
普通的html都可以啊。为什么说必须要ww标签呢
呵呵,你试验一下吧 13 楼 kjj 2008-04-24 楼上我试验过了,目前我等表单都是用input 等,html表单组件做的,也没发现ww的区别在哪里