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 代码
  1. error.username=请输入用户名   
  2. error.password=请输入密码  
UserService-en-US.properties:
java 代码
  1. error.username=user name is required   
  2. error.password=user password is required  

2.写UserService.java文件,代码如下:
java 代码
  1. public class UserService extends ActionSupport   
  2. {   
  3.   private IUser user;   
  4.   //action 方法,插入用户对象   
  5.   public String insert() throws Exception   
  6.   {   
  7.  //这里省略了具体业务逻辑代码   
  8.      return SUCCESS;   
  9.   }   
  10.   //重载父类里的validate()方法   
  11.   public void validate()   
  12.  {   
  13.     IUser user = this.getUser();   
  14.     String username = user.getName();   
  15.     String password = user.getPassword();   
  16.     if(usename.equals(""))   
  17.    {   
  18.       this.addFieldError("username",getText("error.username"));   
  19.    }   
  20.     if(password.equals(""))   
  21.     {   
  22.       this.addFieldError("password",getText("error.password"));   
  23.     }   
  24.  }   
  25.   //setters and getters   
  26.   
  27. }  

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

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

你可能感兴趣的:(UI,应用服务器,workflow,velocity,Webwork)