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