`

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 逻辑视图所指定的视图资源。










 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Struts2输入校验总结

    ### Struts2输入校验深度解析 #### 一、手动输入完成校验 在Struts2框架中,输入校验是确保数据完整性和安全性的重要环节。对于手动输入完成校验,Struts2提供了灵活的机制。 1. **普通处理方式**:在Action类中...

    struts2输入校验

    本文将深入探讨Struts2中的输入校验机制,以及如何对指定方法进行输入校验。 在Struts2中,输入校验通常分为两种方式:客户端校验和服务器端校验。客户端校验主要通过JavaScript在用户端进行,可以提供即时反馈,但...

    struts2输入校验深入总结

    本文将深入探讨Struts2中的输入校验机制,帮助开发者更好地理解和应用。 一、Struts2输入校验概述 在Struts2中,输入校验主要用于验证用户通过表单提交的数据,防止无效或恶意数据进入系统。Struts2提供了多种方式...

    Struts2的输入校验

    在Struts2中,输入校验是确保数据安全、准确和有效的重要环节。本篇文章将深入探讨Struts2的输入校验机制及其相关知识点。 **输入校验的重要性** 输入校验是Web应用开发中的关键步骤,它可以防止恶意用户提交无效或...

    Struts 2 输入校验

    Struts 2 输入校验

    Struts2 校验器

    在Struts2中,校验器(Validator)是处理用户输入验证的核心组件,确保提交到服务器的数据符合预设的业务规则。这篇博客文章可能是关于如何使用Struts2的内置校验机制以及自定义校验规则的探讨。 Struts2的校验框架...

    struts2的输入校验

    struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...

    Struts2 输入校验

    本篇文章将深入探讨Struts2中的输入校验机制。 一、Struts2 输入校验概述 Struts2提供了多种进行输入校验的方式,包括Action级别校验、Validator框架校验、拦截器校验以及使用JSR303/JSR349 Bean Validation标准。...

    struts2输入校验总结

    Struts2是一个流行的Java web开发框架,它提供了一套强大的输入校验机制,确保用户提交的数据符合业务逻辑的要求。在本文中,我们将深入探讨Struts2的输入校验功能,包括手动输入校验和基于验证框架的输入校验。 ##...

    struts2中的输入校验

    在Struts2中,输入校验是确保用户提交的数据符合预设规范的重要环节,可以防止非法数据进入系统,保护数据的完整性和安全性。本文将详细探讨Struts2中的输入校验机制。 首先,Struts2提供了两种主要的校验方式:...

    Struts2数据校验与国际化

    Struts2作为一款流行的Java Web框架,其在处理用户输入数据和实现多语言支持方面具有强大的功能。在“Struts2数据校验与国际化”这一主题中,我们将深入探讨Struts2如何通过不同的验证机制确保数据的有效性,以及...

    使用struts2进行输入校验

    在Struts2中,输入校验是一个至关重要的部分,它确保了用户从客户端提交的数据符合预设的业务规则,从而避免了无效或不合法数据进入系统。本篇文章将详细介绍如何在Struts2中进行输入校验,包括两种主要实现方式:...

    Struts2输入校验

    要求使用Struts2的内建校验器校验“书名”、“作者”、“出版日期”、“价格”和“库存数量”字段;要求手动编写代码校验“书号”的有效性;要求手动编写代码校验“出版社”字段中是否包含了“出版社”三个字。

    [原]Struts2输入校验

    在Struts2中,输入校验是确保数据安全性和应用稳定性的重要环节。它帮助开发者防止非法或无效的数据进入系统,从而减少潜在的错误和安全漏洞。 **Struts2输入校验机制** 1. **内置验证框架**: Struts2提供了内置的...

    struts的输入校验

    一、Struts输入校验概述 输入校验在Web应用中扮演着数据过滤和保护的角色,它可以避免脏数据进入数据库,提高系统的稳定性和安全性。Struts框架提供了多种方式进行输入校验,包括ActionForm校验、Validator框架以及...

Global site tag (gtag.js) - Google Analytics