又是验证功能。。。现在似乎很怕这个功能。。以前学struts1时。。其实很简单的验证模块花了我不少的时间。。现在学struts2也是一样。。花了一个下午的时间才把struts2客户端验证搞定。。
   在上篇中实现了服务端验证后。。要实现客户端验证就很简单。。。只要在form元素上加上validate=true就行。。另外,我也加入了国际化支持。

先说说遇到的问题
    1.在<s:form>中把action的属性写在action="regist.action",导致struts2没有进行客户端验证,就是提交给服务端处理了。。正确应该是action="register".不要加.action .. 这个问题花了我大半个下午才找出。。
    2.因为懒惰把<s:textfield name="username" label="用户名"/>就写在<s:textfield name="username" />没有加上label属性。。。运行时就不停地弹出Object error对话框。。。
    3.短路属性short-circuit=true目录只支持服务端验证。。还不支持客户端。。。。所以不要惊讶在客户提交时同一个域出现不止一条的提示信息。

代码如下:
   1.注册页面register.jsp
   

<%@ page contentType="text/html; charset=GBK" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>register</title>
</head>
<body>
<s:form action="regist" validate="true">
<s:textfield name="username" label="用户名"/>
<s:textfield name="pass" label="密码"/>
<s:textfield name="age" label="年龄"/>
<s:textfield name="birthday" label="生日"/>
<s:submit/>
</s:form>
</body>
</html>

2.ReigsterAction.java
package my;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Date;
public class RegisterAction extends ActionSupport
{
    
private String name;
    
private String pass;
    
private int age;
    
private Date birthday;
    
public void setName(String username)
    
{
        
this.name = username;
    }

    
public String getName()
    
{
        
return this.name;
    }


    
public void setPass(String pass)
    
{
        
this.pass = pass;
    }

    
public String getPass()
    
{
        
return this.pass;
    }

    
public void setAge(int age)
    
{
        
this.age = age;
    }

    
public int getAge()
    
{
        
return this.age;
    }

    
public void setBirthday(Date birthday)
    
{
        
this.birthday = birthday;
    }

    
public Date getBirthday()
    
{
        
return this.birthday;
    }

    
public String execute()throws Exception 
    
{
        
return SUCCESS;
    }

}
3.验证文件(RegisterAction-validation.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
>
    
<validators>
        
<field name="username" >
            
<field-validator type="requiredstring" short-circuit="true">
                
<param name="trim">true</param>
                
<message>${getText("username.required")}</message> 
            
</field-validator>
            
<field-validator type="regex">
                
<param name="expression"><![CDATA[(\w{4,25})]]></param>
                
<message>${getText("username.regex")}</message> 
            
</field-validator>
        
</field>

        
<field name="pass">
            
<field-validator type="requiredstring" short-circuit="true">
                
<param name="trim">true</param>
                
<message>${getText("pass.required")}</message> 
            
</field-validator>
            
<field-validator type="regex">
                
<param name="expression"><![CDATA[(\w{4,25})]]></param>
                
<message>${getText("pass.regex")}</message> 
            
</field-validator>
        
</field>
        
<field name="age">
            
<field-validator type="int">
                
<param name="min">1</param>
                
<param name="max">100</param>
                
<message>${getText("age.range")}</message>
            
</field-validator>
        
</field>
        
<field name="birthday">
            
<field-validator type="date">
                
<param name="min">1900-01-01</param>
                
<param name="max">2050-01-01</param>
            
<message>${getText("birthday.range")}</message> 
            
</field-validator>
        
</field>
    
</validators>

4.Struts2的配置文件struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
>
        
<struts>
            
<constant name="struts.custom.i18n.resources" value="globalMessage"/>
            
<package name="my" extends="struts-default">
            
<action name="regist" class="my.RegisterAction">
                
<result name="success">/show.jsp</result>
                
<result name="input">/register.jsp</result>
            
</action>
            
</package>
        
</struts>
 5.国际化支持文件globalMessage_zh_CN.properties(用native2ascii生成的)
username.required=\u4f60\u5fc5\u987b\u8f93\u5165\u7528\u6237\u540d
username.regex
=\u4f60\u8f93\u5165\u7684\u7528\u6237\u540d\u53ea\u80fd\u662f\u5b57\u6bcd\u4e0e\u6570\u5b57\uff0c\u4e14\u957f\u5ea6\u5fc5\u987b\u57284\u81f325\u4e4b\u9593
pass.required
=\u4f60\u5fc5\u987b\u8f93\u5165\u5bc6\u7801
pass.regex
=\u4f60\u8f93\u5165\u7684\u5bc6\u7801\u53ea\u80fd\u662f\u5b57\u6bcd\u4e0e\u6570\u5b57\uff0c\u4e14\u957f\u5ea6\u5fc5\u987b\u57284\u81f325\u4e4b\u9593
age.range
=\u4f60\u7684\u5e74\u9f84\u5fc5\u987b\u5728${min}\u548c${max}\u4e4b\u9593
birthday.range
=\u4f60\u7684\u751f\u65e5\u5fc5\u987b\u5728${min}\u548c${max}\u4e4b\u95f4

xwork.default.invalid.fieldvalue
={0}\u5b57\u6bb5\u65e0\u6548
6.注册成功页面show.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title>校验成功</title>
</head>
<body>
<H3>校验成功</H3>
用户名:
<s:property value="username"/><br>
密码:
<s:property value="pass"/><br>
年龄:
<s:property value="age"/><br>
生日:
<s:property value="birthday"/><br>
</body>
</html>