二、 基本输入校验
MVC 框架必须处理 2 方面问题 ,类型转换和输入校验。之前已经看过 Servlet 以硬编码的方式进行输入校验。
Struts 2 提供了基于验证框架的输入校验 ,所有的输入校验只需要通过指定简单的配置文件即可
1. 编写校验规则文件
regist.jsp
<body>
<h3>请输入您的注册信息</h3>
<s:fielderror/>
<form method="post" action="regist.action">
用户名:<input type="text" name="name"><br />
密 码:<input type="text" name="pass"><br />
年 龄:<input type="text" name="age"><br />
生 日:<input type="text" name="birth"><br />
<input type="submit" value="注册">
</form>
</body>
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import java.util.regex.*;
import java.text.*;
public class RegistAction extends ActionSupport
{
//封装用户请求参数的四个属性
private String name;
private String pass;
private int age;
private Date birth;
//name属性的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
//pass属性的setter和getter方法
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}
//age属性的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
//birth属性的setter和getter方法
public void setBirth(Date birth)
{
this.birth = birth;
}
public Date getBirth()
{
return this.birth;
}
}
上面 action 继承了 ActionSupport,因此包含了一个 execute() 方法,该方法直接 return SUCCESS
采用 Struts 2 的校验框架时,只需为该 Action 指定一个 XML 校验文件。
规则:1) <Action 名字>-validation.xml ,
2) 该文件应该保存在与 Action class 文件相同的路径下。
RegistAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定校验配置文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验文件的根元素 --> <validators> <!-- 校验Action的name属性 --> <field name="name"> <!-- 指定name属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message>必须输入名字</message> </field-validator> <!-- 指定name属性必须匹配正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message>您输入的用户名只能是字母和数字 ,且长度必须在4到25之间</message> </field-validator> </field> <!-- 校验Action的pass属性 --> <field name="pass"> <!-- 指定pass属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message>必须输入密码</message> </field-validator> <!-- 指定pass属性必须满足匹配指定的正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message>您输入的密码只能是字母和数字 ,且长度必须在4到25之间</message> </field-validator> </field> <!-- 指定age属性必须在指定范围内--> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <message>年龄必须在1到150之间</message> </field-validator> </field> <!-- 指定birth属性必须在指定范围内--> <field name="birth"> <field-validator type="date"> <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 --> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <message>生日必须在${min}到${max}之间</message> </field-validator> </field> </validators>
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="globalMessages"/> <constant name="struts.i18n.encoding" value="GBK"/> <package name="lee" extends="struts-default"> <action name="regist" class="lee.RegistAction"> <!-- 指定输入校验失败后返回regist.jsp页面 --> <result name="input">/regist.jsp</result> <result>/show.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
提示: 如果 regist.jsp 中使用了 Struts 2 标签库来创建表单,就无需使用 <s:fielderror/> 标签,也可以输出校验失败的错误提示,因为 Struts 2 的表单标签默认就能输出校验失败的错误提示。
注意: 即使类型转换失败,系统并不是直接返回 input 逻辑视图,依然会调用 Struts 2 的输入校验机制进行输入校验。
2. 国际化提示信息
RegistAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定校验配置文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验文件的根元素 --> <validators> <!-- 校验Action的name属性 --> <field name="name"> <!-- 指定name属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 如果校验失败,输出name.requried对应的国际化信息 --> <message key="name.requried"/> </field-validator> <!-- 指定name属性必须匹配正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出name.regex对应的国际化信息 --> <message key="name.regex"/> </field-validator> </field> <!-- 校验Action的pass属性 --> <field name="pass"> <!-- 指定pass属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 如果校验失败,输出pass.requried对应的国际化信息 --> <message key="pass.requried"/> </field-validator> <!-- 指定pass属性必须满足匹配指定的正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出pass.regex对应的国际化信息 --> <message key="pass.regex"/> </field-validator> </field> <!-- 指定age属性必须在指定范围内--> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <!-- 如果校验失败,输出age.range对应的国际化信息 --> <message key="age.range"/> </field-validator> </field> <!-- 指定birth属性必须在指定范围内--> <field name="birth"> <field-validator type="date"> <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 --> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <!-- 如果校验失败,输出birth.range对应的国际化信息 --> <message key="birth.range"/> </field-validator> </field> </validators>
国际化资源文件中相应的 key :
globalMessages.properties (classpath 根目录下)
xwork.default.invalid.fieldvalue={0}字段无效 #违反用户名必须输入的提示信息 name.requried=您必须输入用户名! #违反用户名必须匹配正则表达式的提示信息 name.regex=您输入的用户名只能是字母和数字,且长度必须在4到25之间! #违反密码必须输入的提示信息 pass.requried=您必须输入密码! #违反密码必须匹配正则表达式的提示信息 pass.regex=您输入的密码只能是字母和数字,且长度必须在4到25之间! #违反年龄必须在指定范围的提示信息 age.range=您的年龄必须在${min}和${max}之间! #违反生日必须在指定范围的提示信息 birth.range=您的生日必须在${min}和${max}之间!
3.使用客户端校验
增加客户端校验,只需将输入页面的表单元素改为使用 Struts 2 标签来生成表单 ,并且为该表单增加 validate="true" 属性 即可。
regist.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>请输入您的注册信息</title>
<meta name="website" content="http://www.crazyit.org" />
<s:head/>
</head>
<body>
<h3>请输入您的注册信息</h3>
<!-- 使用Struts 2标签库生成表单 -->
<s:form action="regist" validate="true">
<!-- 使用s:textfield标签生成文本输入框 -->
<s:textfield label="用户名" name="name"/>
<s:password label="密码" name="pass"/>
<s:textfield label="年龄" name="age"/>
<s:textfield label="生日" name="birth"/>
<s:submit/>
</s:form>
</body>
</html>
上面 <s:head/> 标签,会导入一些 css 式样单等,标签会使用红色字体显示校验失败错误提示
注意: 以上的 jsp 配合 2 中的 RegistAction-validation.xml 会发成异常!
因为当要使用客户端校验时, 如果 RegistAction-validation.xml 中的 <message /> 元素指定了 key 属性,系统将无法从全局国际化资源文件中加载 key 对应的国际化信息。
解决方法: struts 2 提供了另一种输出国际化资源文件方法:${getText("消息 key")}
如下: RegistAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定校验配置文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验文件的根元素 --> <validators> <!-- 校验Action的name属性 --> <field name="name"> <!-- 指定name属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 如果校验失败,输出name.requried对应的国际化信息 --> <message>${getText("name.requried")}</message> </field-validator> <!-- 指定name属性必须匹配正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出name.regex对应的国际化信息 --> <message>${getText("name.regex")}</message> </field-validator> </field> <!-- 校验Action的pass属性 --> <field name="pass"> <!-- 指定pass属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 如果校验失败,输出pass.requried对应的国际化信息 --> <message>${getText("pass.requried")}</message> </field-validator> <!-- 指定pass属性必须满足匹配指定的正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出pass.regex对应的国际化信息 --> <message>${getText("pass.regex")}</message> </field-validator> </field> <!-- 指定age属性必须在指定范围内--> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <!-- 如果校验失败,输出age.range对应的国际化信息 --> <message>${getText("age.range")}</message> </field-validator> </field> <!-- 指定birth属性必须在指定范围内--> <field name="birth"> <field-validator type="date"> <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 --> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <!-- 如果校验失败,输出birth.range对应的国际化信息 --> <message>${getText("birth.range")}</message> </field-validator> </field> </validators>
上面的校验规则文件中,没有直接校验失败的提示信息,而是通过调用 ActionSupport 的 getText() 方法来取得国际化提示信息
注意: 客户端校验是基于 javascript 完成,所以不是所以服务器端校验都能转换成客户端校验的。
客户端校验仅仅支持如下几种 校验器:
1): required validator (必填校验器)
2): requiredstring validator (必填字符串校验器)
3): stringlength validator (字符串长度校验器)
4): regex validator (正则表达式校验器)
5): email validator (邮件校验器)
6): url validator (网址校验器)
7): int validator (整数校验器)
8): double validator (双精度数校验器)
客户端校验有 2 个值得注意的地方:
1): <s:form/> 中有一个 theme 属性,不要设置为 simple
2): 不要在校验规则文件错误提示信息中,直接使用 key 来制定国际化提示信息
三、 校验器的配置风格
Struts 2 提供了 2 种 方式配置校验规则:字段校验器风格 和非字段校验器风格 。
2者没什么本质不同,一种是字段优先,另一种是校验器优先
1.字段校验器配置风格
前面应用中校验规则都是采用字段校验器风格配置的 。如:
<!-- 校验Action的name属性 --> <field name="name"> <!-- 指定name属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 如果校验失败,输出name.requried对应的国际化信息 --> <message>${getText("name.requried")}</message> </field-validator> <!-- 指定name属性必须匹配正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出name.regex对应的国际化信息 --> <message>${getText("name.regex")}</message> </field-validator> </field>
每个<field> 元素指定一个 Action 属性必须遵守的规则,该元素 name 属性指定被校验的字段;如果需要满足多个规则,则在<field> 下增加多个 <field-validator> 元素。
每个 <field-validator> 元素指定一个校验规则,该元素的 type 属性指定了校验器名称,该元素可以包含多个 <param> 子元素,用于指定该校验器的参数;另外,每个 <field-validator> 元素都必须有一个 <message> 元素,该元素确定校验失败后的提示信息。
2.非字段校验器配置风格
非字段校验器配置风格,是一种以校验器优先的配置方式。这种配置下,校验规则文件的根元素下包含了多个 <validator> 元素,每个 <validator> 元素定义了一个校验规则。
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts2数据校验的规则文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- Struts2校验文件的根元素 --> <validators> <!-- 配置指定必填字符串的校验器 --> <validator type="requiredstring"> <!-- 使用该校验器校验name属性 --> <param name="fieldName">name</param> <param name="trim">true</param> <!-- 指定校验失败后输出name.required对应的国际化信息 --> <message>${getText("name.requried")}</message> </validator> <!-- 配置指定正则表达式的校验器 --> <validator type="regex"> <!-- 使用该校验器校验name属性 --> <param name="fieldName">name</param> <param name="trim">true</param> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 指定校验失败后输出name.required对应的国际化信息 --> <message>${getText("name.regex")}</message> </validator> <!-- 配置指定必填字符串的校验器 --> <validator type="requiredstring"> <!-- 使用该校验器校验pass属性 --> <param name="fieldName">pass</param> <param name="trim">true</param> <!-- 指定校验失败后输出pass.required对应的国际化信息 --> <message>${getText("pass.requried")}</message> </validator> <!-- 配置指定正则表达式的校验器 --> <validator type="regex"> <!-- 使用该校验器校验pass属性 --> <param name="fieldName">pass</param> <param name="trim">true</param> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 指定校验失败后输出pass.required对应的国际化信息 --> <message>${getText("pass.regex")}</message> </validator> <!-- 配置指定整数校验器 --> <validator type="int"> <!-- 使用该校验器校验age属性 --> <param name="fieldName">age</param> <!-- 指定整数校验器的范围--> <param name="min">1</param> <param name="max">150</param> <!-- 指定校验失败后输出age.range对应的国际化信息 --> <message>${getText("age.range")}</message> </validator> <!-- 配置指定日期校验器 --> <validator type="date"> <!-- 使用该校验器校验birth属性 --> <param name="fieldName">birth</param> <!-- 指定日期校验器的范围--> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <!-- 指定校验失败后输出birth.range对应的国际化信息 --> <message>${getText("birth.range")}</message> </validator> </validators>
相比之下,在一个 <field> 元素内定义字段校验器,比使用带有一个 fieldName 参数的 <validator> 元素好得多,而且 XML 代码本身也清晰多。
3.短路校验器
校验规则文件的 <validator> 元素和 <field-validator> 元素可以指定一个可选的 short-circuit 属性,这个属性是指定该校验器是否是短路校验器,默认 false
通常,如果浏览者完全没有在某个输入框输入任何内容,系统应该仅输出第一行提示信息,而不是一次输出全部校验信息提示。为了达到这个效果,应该使用短路校验器。
RegistAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!-- 指定校验配置文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验文件的根元素 --> <validators> <!-- 校验Action的name属性 --> <field name="name"> <!-- 指定name属性必须满足必填规则,将其配置成短路校验器 --> <field-validator type="requiredstring" short-circuit="true"> <param name="trim">true</param> <!-- 如果校验失败,输出name.requried对应的国际化信息 --> <message key="name.requried"/> </field-validator> <!-- 指定name属性必须匹配正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出name.regex对应的国际化信息 --> <message key="name.regex"/> </field-validator> </field> <!-- 校验Action的pass属性 --> <field name="pass"> <!-- 指定pass属性必须满足必填规则,将其配置成短路校验器 --> <field-validator type="requiredstring" short-circuit="true"> <param name="trim">true</param> <!-- 如果校验失败,输出pass.requried对应的国际化信息 --> <message key="pass.requried"/> </field-validator> <!-- 指定pass属性必须满足匹配指定的正则表达式 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <!-- 如果校验失败,输出pass.regex对应的国际化信息 --> <message key="pass.regex"/> </field-validator> </field> <!-- 指定age属性必须在指定范围内--> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <!-- 如果校验失败,输出age.range对应的国际化信息 --> <message key="age.range"/> </field-validator> </field> <!-- 指定birth属性必须在指定范围内--> <field name="birth"> <field-validator type="date"> <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 --> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <!-- 如果校验失败,输出birth.range对应的国际化信息 --> <message key="birth.range"/> </field-validator> </field> </validators>
注意 :struts 2 目前还不支持 客户端短路校验
4.校验顺序和短路
校验器的执行顺序有如下规则:
1. 所有非字段风格的校验器优先于字段风格的校验器
2. 所有非字段风格的校验器中,排在前面的会先执行
3. 所有字段风格的校验器中,排在前面的会先执行
校验器短路的原则是:
1. 所有非字段校验器是最优先执行,如果某个非字段校验器校验失败了,
则该字段上所有字段校验器都不会获得校验机会
2. 非字段校验器的校验失败,不会阻止其他非字段校验的执行
3. 如果一个字段校验器校验失败后,则该字段下的且排在该校验失败的
校验器之后的其他字段校验器不会获得校验的机会
3. 字段校验器永远都不会阻止非字段校验器的执行。
如果应用中所需的校验规则非常复杂,用户可以有2个选择:
1. 开放自己的校验器,
2. 重写 Action 的 validate() 方法。
四、 校验文件的搜索规则
Struts 2 的一个 Action 中可能包含多个处理逻辑,当一个 Action 包含多个类似与 execute() 方法时,每个方法都是一个处理逻辑。不同的处理逻辑可能需要不同的校验规则,Struts 2 也提供了对不同 Action 指定不同的校验规则支持。
当需要让一个 Action 可以处理多个请求时,应该在配置 <action> 元素时指定 method 属性 ,通过这种方式,就可以将一个 Action 处理类配置成多个逻辑 Action。
下面是 2 个逻辑的 Action:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="globalMessages"/> <constant name="struts.i18n.encoding" value="GBK"/> <package name="lee" extends="struts-default"> <action name="regist" class="lee.RegistAction"> <result name="input">/regist.jsp</result> <result>/show.jsp</result> </action> <action name="login" class="lee.RegistAction" method="login"> <result name="input">/login.jsp</result> <result>/show.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
假设上面 2 个Action 的校验规则不同。如果按照之前的校验规则文件,就分不清到底要校验哪个处理逻辑。为了能精确控制每个校验逻辑,Struts 2 允许通过为校验规则文件名增加 Action 别名来指定具体需要校验的处理逻辑。 如下:
<ActionClassName>-<ActionAliasName>-validation.xml
ActionClassName 是 Action 处理类名 ,ActionAliasName 是 Action 所包含处理方法在 struts-xml 文件中对应的 name 属性 。
例如: 我们需要为 login 处理单独指定校验规则,则名为: RegistAction-login-validation.xml (该文件与 RegistAction 的 class 文件 放在同一路径下):
RegistAction-login-validation.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验规则文件的根元素 --> <validators> <!-- 校验name属性 --> <field name="name"> <!-- 使用表达式校验器校验name属性 --> <field-validator type="fieldexpression"> <!-- 指定name属性和pass属性必须相等 --> <param name="expression"><![CDATA[(user == pass)]]></param> <message>${getText("nameexp")}</message> </field-validator> </field> </validators>
上面校验规则文件仅仅指定了 Action 的 name 属性必须和 pass 属性相同,但是系统中原有的校验规则依然会起作用:
RegistAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <validators> <field name="pass"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>${getText("pass.requried")}</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">150</param> <message>${getText("age.range")}</message> </field-validator> </field> <field name="birth"> <field-validator type="date"> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <message>${getText("birth.range")}</message> </field-validator> </field> </validators>
因此: 名为 login 的 Action 中包含的校验规则是 RegistAction-validation.xml 和 RegistAction-login-validation.xml 两个文件规则的总和。
除此之外: 系统如果包含 2 个Action ,BaseAction 和 RegistAction,RegistAction 继承了 BaseAction,且 2 个 Action 都指定了对应的配置文件,则 RegistAction 对应 Action 的校验规则是 RegistAction-validation.xml 和 BaseAction-validation.xml 两个文件的总和。
假设系统有两个 Action: BaseAction 和 RegistAction,则系统搜索规则文件顺序如下:
1. BaseAction-validation.xml
2. BaseAction-别名-validation.xml
3. RegistAction-validation.xml
4. RegistAction -别名 -validation.xml
即使找到第一个校验规则文件,系统还会继续搜索,不管什么情况,系统总是按固定顺序搜索
注意: Struts 2 搜索规则文件是从上而下的,如果 2 个校验文件中指定的规则冲突,则后面的覆盖前面的
BaseAction.java
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import java.util.regex.*;
import java.text.*;
public class BaseAction extends ActionSupport
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return (this.name);
}
}
RegistAction.java
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import java.util.regex.*;
import java.text.*;
public class RegistAction extends BaseAction
{
private String pass;
private int age;
private Date birth;
public void setPass(String pass)
{
this.pass = pass;
}
public void setAge(int age)
{
this.age = age;
}
public void setBirth(Date birth)
{
this.birth = birth;
}
public String getPass()
{
return (this.pass);
}
public int getAge() {
return (this.age);
}
public Date getBirth()
{
return (this.birth);
}
public String login()
{
return SUCCESS;
}
}
BaseAction-validation.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <validators> <field name="name"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>${getText("name.requried")}</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message>${getText("name.regex")}</message> </field-validator> </field> </validators>