struts2的输入检验

一、输入校验简介


一个健壮的Web应用程序必须确保用户输入是合法的。比如在注册用户的时候,将用处注册信息保存到数据库之前一般我们会判断用户输入的密码长度是否过短,或者用户的email地址格式是否正确。
验证程序可以分为两大类别:字段验证器(Field validators)和非字段验证器(Non-field validator)。
字段验证用户程序与表单中的某个字段想关联,其验证行为发生在把一个值赋给一个动作属性之前。例如输入的用户名不满足要求(如要求全英文却含有中文),则在属性赋值之前,就会提示输入不符合要求。这通常是由客户端通过javascript来完成验证。
非字段验证程序(普通验证器)不与某个特定的字段相关联,他们用来测试某种特定的条件是否得到了满足,这一版是由服务器完成验证的。例如用户名注册时检测到用户名已被其他人注册,则提示更换用户名。
Struts2内建的验证器基本上都是字段验证器。Validation拦截器负责加载和执行已经注册的验证器,由于Validation拦截器是defaultStack拦截器栈中的一员,因此我们可以不用声明就可以直接使用内建的验证器。

二、输入校验的实现

数据校验包含两种方式,第一种是手动编码完成数据校验方式,第二种是通过配置文件完成数据校验方式。
1、手动编码校验方式
开发的步骤
步骤一: 封装数据 
步骤二: 实现校验Action ,必须继承ActionSupport 类 
步骤三: 覆盖validate方法,完成对Action的业务方法数据校验 this.addFieldError。该方法由(ActionSupport提供)
步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息

例如Action编写可以如下所示:



//省略的导入包语句
public class RegistAction extends ActionSupport
{
	private String name;
	private String pass;
	private int age;
	private Date birth;
	//省略了get和set方法
	public void validate() //重写validate方法
	{
		System.out.println("进入validate方法进行校验" + name == null);
		//要求用户名必须包含test子串
		if(!name.contains("test"))
		{
			addFieldError("user" , 
				"您的用户名必须包含test!");//添加到系统的FieldError中
		}
	}
}



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=gb2312"/>
<title>请输入您的注册信息</title>
</head>
<body>
<H1>请输入您的注册信息</H1>
错误提示信息:<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"><p>
	<INPUT TYPE="submit" value="注册">
</FORM>
</body>
</html>



除此之外,struts2无需做其他处理。只需要在struts.xml中配置input所指向的逻辑视图即可。因为struts2一旦发现FieldError不为空,就会自动跳转到input逻辑视图。并通过 <s:fieldError/> 显示错误信息。


以上我们通过覆盖validate方法完成数据校验是针对的是Action中所有的方法进行校验。我们可以也可以针对Action中某个方法完成校验。实现原理类似于Action的动态实现。我们可以为Action设计一个validateXxx方法,其中Xxx是Action要处理的逻辑方法。
例如可以在在Action中编写一个方法,方法名是validateAdd(),只用于校验add方法。再编写一个validateSave(),只用于校验save的方法。
可以把上面的RegistAction改成如下形式:


public class RegistAction extends ActionSupport
{
	private String name;
	private String pass;
	private int age;
	private Date birth;
        //省略了get和set方法
	public String regist()
	{
		return SUCCESS;
	}
	public void validate()
	{
		System.out.println("进入validate方法进行校验" + name == null);
		//要求用户名必须包含leegang子串
		if(!name.contains("test"))
		{
			addFieldError("user" , 
				"您的用户名必须包含test!");
		}
	}
	public void validateRegist()
	{
		System.out.println("进入validateRegist方法进行校验" + name == null);
		//要求用户名必须包含yeeku子串
		if(!name.contains("name"))
		{
			addFieldError("user" , 
				"您的用户名必须包含name!");
		}
	}
}



除此之外,还必须在struts.xml文件中指定校验方法。
<action name="regist" class="lee.RegistAction" method="regist">
        <result name="input">/regist.jsp</result>
        <result>/show.jsp</result>
</action>
通过上述配置,指定了regist方法来处理名为regist的Action请求。这样,用户提交数据时,不仅validate方法会进行数据校验,validateRegist也会进行数据校验。而且validateRegist优先执行。


2、通过XML配置文件的方式完成数据的校验
xml配置校验原理 : 将很多校验规则代码已经写好,只需要在xml中定义数据所使用校验规则就可以了 
开发的步骤
步骤一 :编写jsp
步骤二 :编写Action 继承ActionSupport 或者 实现 Validateable 接口 
步骤三 :封装请求参数,使用xml校验 必须提供get方法
步骤四 :编写校验规则xml文件 

具体的配置文件相关标签和属性详解

<validators>
      <field name="password">
                    <!-- 校验器类型 -->
                    <field-validator type="requiredstring">
                        <message>密码不能为空</message>
                    </field-validator>
                    <!-- 规定密码的长度 -->
                    <field-validator type="stringlength">
                        <param name="minLength">3</param>
                        <param name="maxLength">8</param>
                        <message>密码在3-8位之间</message>
                    </field-validator>
      </field>
<validators>



如果是针对Action中所有的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-validation.xml。并且需要引入指定的DTD的约束:xwork-core-2.3.15.3.jar/xwork-validator-1.0.3.dtd

如果是针对Action中某个的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-方法对应的访问路径-validation.xml。引入DTD文件等。例如:RegistAction-regist-validation.xml

3、Struts2框架提供的XML校验规则
一般而言,每个struts2框架的校验器都有一个fieldName的属性值,可以用来设置校验器的类型时非字段类型还是字段类型。不指定该属性值时默认是字段校验器,即服务器端完成校验。

例如输入密码的非字段验证器配置如下:


<validators>
      
             <!-- 校验器类型 -->
             <validator type="requiredstring">
                    <!-- 设置校验器类型为非字段校验器 -->
                    <param name="fieldName">password</param>  
                    <message>密码不能为空</message>
             </validator>
<validators>


常见的校验器如下:
    * required (必填校验器,要求被校验的属性值不能为null),空格没问题。
    * requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去除前后的空格)
    * stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
    * regex (正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
    * int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
    * double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
    * fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
    * email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
    * url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
    * date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

posted on 2017-03-02 15:37  想作会飞的鱼  阅读(317)  评论(0编辑  收藏  举报

导航