原文链接:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398008.html
输入校验流程
1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到filedErrors里。不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术调用action中的ValidateXxx()方法,Xxx为action里面的方法名。
4、再调用action中的alidate()方法。
5、经过上面4步,如果系统中的filedErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发到名称为input的视图。如果系统中的filedErrors没有任何错误信息,系统将执行action中的处理方法。
index.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Struts2手工编写代码实现对Action中所有方法输入校验</title>
</head>
<body>
<form action="message_update" method="post">
用户名:<input type="text" name="username" /><br/>
手机号码:<input type="text" name="mobile"/><br/>
<input type="submit" value="提交" />
</form>
<s:fielderror />
</body>
</html>
success.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>结果</title>
</head>
<body>
${message }
</body>
</html>
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>
<!-- Add packages here -->
<package name="default" namespace="/" extends="struts-default">
<action name="message_*" method="{1}" class="cn.validate.action.MessageAction">
<result name="input">/index.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
MessageAction.java
package cn.validate.action;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class MessageAction extends ActionSupport {
private String username;
private String mobile;
public void setUsername(String username) {
this.username = username;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String update() {
ActionContext.getContext().put("message", "update success!");
return "success";
}
public String sace() {
ActionContext.getContext().put("message", "save success!");
return "success";
}
@Override
public void validate() {
// 重写ActionSupport的alidate方法
// 验证提交数据是否合法
if (this.username == null || "".equals(this.username.trim())) {
this.addFieldError("username", "用户名不能为空!");
}
if (this.mobile == null || "".equals(this.mobile.trim())) {
this.addFieldError("moblie", "手机号码不能为空!");
} else {
//正则表达式判断手机号码的输入格式是否正确
if (!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile)
.matches()) {
this.addFieldError("mobile", "手机号码输入格式不正确!");
}
}
}
}
validate方法会校验action里面所有的方法,当某个数据校验失败时,我们应该调用addFiledError()方法添加校验失败信息,Struts2会将请求发送到名为input的result,在input视图中,我们用<s:filederror />显示失败信息。当然,这不符合逻辑,那么我们怎么指定方法校验呢?很简单,我们只需要用validateXxx()校验即可 Xxx代表Action里面你要校验的方法名,首字母大写。看代码:
public void validateUpdate() {
// 验证提交数据是否合法
if (this.username == null || "".equals(this.username.trim())) {
this.addFieldError("username", "用户名不能为空!");
}
if (this.mobile == null || "".equals(this.mobile.trim())) {
this.addFieldError("moblie", "手机号码不能为空!");
} else {
//正则表达式判断手机号码的输入格式是否正确
if (!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile)
.matches()) {
this.addFieldError("mobile", "手机号码输入格式不正确!");
}
}