struts2 输入验证(服务器端)

在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
      对于输入校验struts2提供了两种实现方法:
      采用手工编写代码实现。
      基于XML配置方式实现。

输入校验的流程:

        1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
        2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
        3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
        4、再调用action中的validate()方法。
        5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。



1.手工编写代码实现对action中所有方法输入校验

       通过重写validate()方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,Struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。

验证例子如下:

package com.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
	private String UserName;
	private String message;
	public String getUserName() {
		return UserName;
	}
	public void setUserName(String userName) {
		UserName = userName;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
	public String execute(){
		this.message = "验证通过";
		return "success";
	}
	//重写validate()方法
	public void validate() {
		// TODO Auto-generated method stub
		<span style="color:#FF0000;">if(UserName==null || UserName.equals("")){
			this.addFieldError("UserName", "用户名不能为空");
		}</span>
	}
		
}

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>主页</title>
</head>
<body>
	<span style="color:#FF0000;"><s:fielderror></s:fielderror></span>
	<form method="post" action="/Validate/Validate/UserInfo">
		用户名:<input type="text" name="UserName"/>
		<input type="submit" value="提交"/>
	</form>
	${message}
	
</body>
</html>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	
	<package name="Validate" namespace="/Validate" extends="struts-default">
		<action name="UserInfo" class="com.action.UserAction" method="execute">
			<span style="color:#FF0000;"><result name="input">/UserInfo.jsp</result></span>
			<result name="success">/UserInfo.jsp</result>
		</action>
	</package>

</struts>

2.基于XML配置方式实现对action的所有方法进行输入校验

          使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:

            ActionClassName-validation.xml
            ActionClassName为action的简单类名
            validation为固定写法
如果Action类为cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。

            <field>指定action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。

            <message>为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key。
            在这个校验文件中,对action中字符串类型的username属性进行验证,首先要求调用trim()方法去掉空格,然后判断用户名是否为空。


例子如下:

package com.action;

import com.opensymphony.xwork2.ActionSupport;

public class <span style="color:#FF0000;">UserAction</span> extends ActionSupport{
	private String UserName;
	private String message;
	public String getUserName() {
		return UserName;
	}
	public void setUserName(String userName) {
		UserName = userName;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
	public String execute(){
		this.message = "验证通过";
		return "success";
	}
//	//重写validate()方法
//	public void validate() {
//		// TODO Auto-generated method stub
//		if(UserName==null || UserName.equals("")){
//			this.addFieldError("UserName", "用户名不能为空");
//		}
//	}
		
}
UserAction-validation.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!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="UserName">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空!</message>
        </field-validator>
    </field>
</validators>
Struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	
	<package name="ValidateXml" namespace="/ValidateXml" extends="struts-default">
		<action name="UserInfo" class="com.action.UserAction" method="execute">
			<result name="input">/UserInfo.jsp</result>
			<result name="success">/UserInfo.jsp</result>
		</action>
	</package>

</struts>

struts2提供的校验器列表

系统提供的校验器如下:
          required:必填校验器,要求field的值不能为null
          requiredstring:必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格
          stringlength:字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格
          regex:正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true
          int:整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值
          double:双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值
          fieldexpression:字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过。
          email:邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址
          url:网址校验器,要求如果field的值非空,则必须是合法的url地址
          date:日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值
          conversion:转换校验器,指定在类型转换失败时,提示的错误信息
          visitor:用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性
          expression:OGNL表达式校验器,expression参数用于指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时,校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中


posted @ 2015-11-10 17:37  老辉辉  阅读(634)  评论(0编辑  收藏  举报