struts2 输入校验 (二)

 

二、 基本输入校验

 

      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 />
	密&nbsp;&nbsp;码:<input type="text" name="pass"><br />
	年&nbsp;&nbsp;龄:<input type="text" name="age"><br />
	生&nbsp;&nbsp;日:<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>
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值