输入校验--手工编写代码实现

 

IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!


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


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

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

验证失败后,请求转发至input视图:
<result name="input">/page/regist.jsp</result>

在regist.jsp页面中使用<s:fielderror/>显示所有失败信息,使用<s:fielderror fieldName="userName"/>显示指定错误信息。


2.手工编写代码实现对action指定方法输入校验

通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
例子:

struts-validate.xml

<struts>
  <constant name="struts.configuration.xml.reload" value="true"></constant>
   <package name="validate" namespace="/validate" extends="struts-default">
         <action name="user_*" class="edu.action.RegistAction" method="{1}">
            <result name="input" >/page/regist.jsp</result>
            <result name="message">/page/message.jsp</result>
         </action>
   </package> 
</struts>
RegistAction.java

package edu.action;
import java.util.Date;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport{
    private String userName;
    private String userTel;
    private Date birthday;
    private String message;//存放方法调用状况信息,则message.jsp显示此信息
	public String getMessage() {
		return message;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public void setUserTel(String userTel) {
		this.userTel = userTel;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
    
	public String add() {
	   this.message = "success in add()";
	   return "message";
	}
	public String update(){
		this.message = "success in update()";
		return "message";
	}
	/*
	 * validateAdd()只会对add()方法进行校验,
	 * 如果既有validateAdd()又有validate(),则是对于update()方法,只会执行validate()校验,
	 *  而对于add()方法,则会先执行validate_add()校验,在执行validate()校验
	 */
	public void validateAdd() {
		System.out.println("进入validateAdd()方法");
		if (this.userName==null || "".equals(this.userName.trim()))
		{
			this.addFieldError("userName", "用户名不能为空");
			return ;
		}
		if (this.userTel==null || "".equals(this.userTel.trim())) {
			this.addFieldError("userTel", "联系方式不能为空");
		}else if(!Pattern.compile("^1[3458]\\d{9}$").matcher(userTel).matches()){
			this.addFieldError("userTel", "联系方式格式不对!");
		}
	}
	/*
	 * validate()对所有Action方法都会进行校验。
	 */
	@Override
	public void validate(){
		System.out.println("进入validate()方法");
		if(this.birthday==null)
			this.addFieldError("birthday", "生日不能为空或格式不正确!");
	}
	
}
regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'regist.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
     <form action="${pageContext.request.contextPath}/validate/user_add.action" method="get">
       UserName:<input type="text" name="userName"><font color="red"><s:fielderror fieldName="userName"/></font><br/>
       UserTel:<input type="text" name="userTel"><font color="red"><s:fielderror fieldName="userTel"/></font><br/>
       Birthday:<input type="text" name="birthday"><font color="red"><s:fielderror fieldName="birthday"/></font><br/>
       <input type="submit" value="regist"><br/>
    </form>
  </body>
</html>

3.输入校验的流程:

(1)类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

(2)如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。

(3)系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

(4)再调用action中的validate()方法。

(5)经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

4.注意:

  (1)对于类型转换异常,其也会添加到fieldErrors里,然后显示。这里要特别注意,比如日期类型数据类型转换异常后,其Date值为null,则有可能出现对于同一属性存在多个fieldErrors,struts2会将他们显示在<s:fielderror fieldName="birthday"/>

 浏览器:

表单提交路径改为http://localhost:8080/Struts2_05/validate/user_update.action后(即调用Action的update方法,则只会进行validate()方法的校验)



关于基于XML配置方式实现输入校验参见我的博客:输入校验--基于XML配置方式实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值