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