struts2 输入校验 (四)

六、 手动完成输入校验

 

对于一些特殊的检验要求,可能需要在 Struts 2 中进行手动校验。Struts 2 提供了良好的可扩展性,从而允许手动完成自定义校验

 

1. 重写 validate() 方法

 

要求 name 请求参数的值包含 leegang 字符串,现在通过从写 ActionSupport 类的 validate() 方法进行校验:

RegistAction.java

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import java.util.regex.*;
import java.text.*;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.*;


public class RegistAction extends ActionSupport
{
	private String name;
	private String pass;
	private int age;
	private Date birth;

	public void setName(String name) 
	{
		this.name = name; 
	}

	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 getName()
	{
		return (this.name); 
	}

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

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

	public Date getBirth()
	{
		return (this.birth); 
	}
	public void validate()
	{
		System.out.println("进入validate方法进行校验" + name == null);
		//要求用户名必衼E丒琹eegang子串
		if(!name.contains("leegang"))
		{
			addFieldError("user" , 
				"您的用户名必须包含 leegang!");
		}
	}
}
 

 在 validate() 方法中,一旦发现校验失败,就把校验失败提示通过 addFieldError 方法添加进系统的 FieldError 中 ,这与类型转换失败后的处理是完全一样的。除此之外,无须做额外处理,如果 Struts 2 发现系统的 FieldError 不为空,将会自动跳转到 input 逻辑视图,因此必须在 struts.xml 文件中为该 Action 的input 指定视图

struts.xml

<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="">
            <result>.</result>
        </action>
    </package>

 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>
 

 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 key="name.requried"/>
		</field-validator>
		<!-- 指定name属性必须匹配正则表达式 -->
		<field-validator type="regex">
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<message key="name.regex"/>
		</field-validator>
	</field>
	<!-- 校验Action的pass属性 -->
	<field name="pass">
		<!-- 指定pass属性必须满足必填规则 -->
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message key="pass.requried"/>
		</field-validator>
		<!-- 指定pass属性必须满足匹配指定的正则表达式 -->
		<field-validator type="regex">
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<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>
			<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>
			<message key="birth.range"/>
		</field-validator>
	</field>
</validators>

 上面 validate() 方法中,如果校验失败,提示信息,没有考虑国际化问题,这个无所谓,因为 ActionSupport 类里包含了一个 getText() 方法来取得国际化信息

 

 

2. 重写 validateXxx() 方法

 

      前面已经介绍过了, Struts 2 的 Action 类里可以包含多个处理逻辑,不同的处理逻辑对应不同的方法。即 Struts 2 的 Action 类里定义了几个类似于 execute() 的方法,只是方法名不是 execute

 

     如果我们的输入校验只想校验某个处理逻辑,也就是仅校验某个处理方法,则重写 validate() 方法显然不够,validate() 方法无法知道需要校验哪个处理逻辑。实际上,如果我们重写了 Action 的 validate() 方法,则该方法会校验所有的处理逻辑。

 

      为了实现校验指定处理逻辑的功能,Struts 2 的 Action 允许提供一个 validateXxx() 方法,其中 Xxx 即是 Action 对应的处理逻辑方法

 

RegistAction.java

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import java.util.regex.*;
import java.text.*;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.*;

public class RegistAction extends ActionSupport
{
	private String name;
	private String pass;
	private int age;
	private Date birth;

	public void setName(String name) 
	{
		this.name = name; 
	}

	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 getName()
	{
		return (this.name); 
	}

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

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

	public Date getBirth()
	{
		return (this.birth); 
	}

	public String regist()
	{
		return SUCCESS;
	}
	public void validate()
	{
		System.out.println("进入validate方法进行校验"
			+ name == null);
		//要求用户名必须包含leegang子串
		if(!name.contains("leegang"))
		{
			addFieldError("user" , 
				"您的用户名必须包含leegang!");
		}
	}
	public void validateRegist()
	{
		System.out.println("进入validateRegist方法进行校验"
			+ name == null);
		//要求用户名必须包含yeeku子串
		if(!name.contains("yeeku"))
		{
			addFieldError("user" , 
				"您的用户名必须包含yeeku!");
		}
	}
}
 

为了让该 Action 的 regist 方法来处理用户请求,必须在 struts.xml 文件中指定该方法。

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<!-- 指定Struts2应用的国际化资源文件 -->
	<constant name="struts.custom.i18n.resources" value="globalMessages"/>
	<!-- 指定Struts2应用编码的字符集 -->
	<constant name="struts.i18n.encoding" value="GBK"/>
	<package name="lee" extends="struts-default">
		<!-- 定义处理用户请求的regist Action,使用lee.RegistAction的regist
			方法处理用户请求 -->
		<action name="regist" class="lee.RegistAction" method="regist">
			<result name="input">/regist.jsp</result>
			<result>/show.jsp</result>
		</action>
        <action name="">
            <result>.</result>
        </action>
	</package>
</struts>
 

此时所有的验证信息都会起作用。包括上面validateRegist(),validate() 和下面的 RegistAction-validation.xml

顺序:

RegistAction-validation.xml--》 validateRegist()--》 validate()

 

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 key="name.requried"/>
		</field-validator>
		<!-- 指定name属性必须匹配正则表达式 -->
		<field-validator type="regex">
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<message key="name.regex"/>
		</field-validator>
	</field>
	<!-- 校验Action的pass属性 -->
	<field name="pass">
		<!-- 指定pass属性必须满足必填规则 -->
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message key="pass.requried"/>
		</field-validator>
		<!-- 指定pass属性必须满足匹配指定的正则表达式 -->
		<field-validator type="regex">
			<param name="expression"><![CDATA[(\w{4,25})]]></param>
			<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>
			<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>
			<message key="birth.range"/>
		</field-validator>
	</field>
</validators>
 

 globalMessages.properties

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 的输入校验流程

 

Struts 2 输入校验需要经过如下几个步骤:

 

    1. 类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成 Action 的属性值

 

    2. 在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到 ActionContext 中,conversionError 拦截器负责将其封装到 fieldError 里,然后执行第 3 步;如果转换过程没有异常信息,则直接进入第 3 步。

 

    3. 调用 Struts 2 内置的输入校验规则进行输入校验 (也就是根据各种 *validation.xml 文件里定义的校验进行输入校验)

 

    4.  通过反 射调用 validateXxx() 方法,其中 Xxx 是即将处理用户请求的处理逻辑所对应的方法名。

 

    5. 调用 Action 类里的 validate() 方法

 

    6. 如果经过上面 5 步 都没有出现 FieldError ,将调用 Action 里处理用户请求的处理方法;如果出现了 FieldError,系统将转入 input 逻辑视图所指定的视图资源。










 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值