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配置方式实现