转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html
注意:要想实现校验,action必须继承自ActionSupport类。
1.基于手工编码的校验
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <s:head/> 12 <h3>注册页面</h3> 13 <s:form method="post" action="reg" > 14 <s:bean name="com.asm.AgeAction" id="aa"></s:bean> 15 <s:textfield name="user.username" label="用户名"/> 16 <s:property value="errors.user.username"/> 17 <s:password name="user.password" label="密码"/> 18 <s:password name="user.password2" label="确认密码"/> 19 <s:select list="#aa.ageMap" name="user.age" label="年龄" headerValue="填写真实年龄" headerKey="0"/> 20 <s:reset value="重置" align="left" /> 21 <s:submit value="注册" align="left"/> 22 </s:form> 23 </body> 24 25 </html>
说明:<s:head/>可以用来对验证信息进行一些美化效果处理,另在此页面中我们用到了一个AgeAction用来动态生成“年龄”表单项,在前面的表单标签中已用过类似的做法。AgeAction的代码如下:
1 package com.asm; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import com.opensymphony.xwork2.ActionSupport; 7 8 public class AgeAction extends ActionSupport{ 9 private Map<Integer, String> ageMap; 10 public AgeAction() { 11 ageMap = new HashMap(); 12 for (int i = 1; i <= 120; i++) { 13 ageMap.put(new Integer(i), i + ""); 14 } 15 } 16 public Map<Integer, String> getAgeMap() { 17 return ageMap; 18 } 19 public void setAgeMap(Map<Integer, String> ageMap) { 20 this.ageMap = ageMap; 21 } 22 23 24 }
Reg action的配置如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 4 "http://struts.apache.org/dtds/struts-2.1.dtd"> 5 <struts> 6 <constant name="struts.custom.i18n.resources" value="myapp"></constant> 7 8 <package name="validate" extends="struts-default"> 9 10 <package name="validate" extends="struts-default"> 11 <action name="reg" class="com.asm.RegAndLoginAction" method="reg"> 12 <result name="success">/regSuc.jsp</result> 13 <result name="login">/reg.jsp</result> 14 </action> 15 </package> 16 17 18 19 </package> 20 </struts>
根据配置,我们来看它的对应Action: RegAndLoginAction,代码如下:
1 package com.asm; 2 3 import java.util.regex.Pattern; 4 5 import com.opensymphony.xwork2.ActionSupport; 6 7 public class RegAndLoginAction extends ActionSupport { 8 private User user; 9 10 public String reg() throws Exception { 11 if (user.getUsername() == null || user.getUsername().equals("")) { 12 this.addFieldError("user.username", "用户名不能为空"); 13 } else if (!Pattern.matches("^[a-zA-Z][a-zA-Z0-9_]{3,14}$", 14 user.getUsername())) { 15 this.addFieldError("user.username", 16 "用户名只能是以字母开头,后面可以跟字母、数字或下滑线,长度只能是4-15位"); 17 } else if (user.getPassword() == null || user.getPassword().equals("")) { 18 this.addFieldError("user.password", "密码不能为空"); 19 } else if (!user.getPassword().equals(user.getPassword2())) { 20 this.addFieldError("user.password2", "两次输入的密码不一致,请重新输入"); 21 } else if (user.getAge() < 16) { 22 this.addFieldError("user.age", "未满16岁,不能注册"); 23 } 24 25 if (this.hasFieldErrors()) { 26 return LOGIN; 27 } 28 System.out.println("reg success...."); 29 return SUCCESS; 30 } 31 32 public User getUser() { 33 return user; 34 } 35 36 public void setUser(User user) { 37 this.user = user; 38 } 39 40 41 }
说明:当reg.jsp提交给此Action对应的reg方法处理时,它会调用addFieldError把错误信息加到FiledError中去,关于这点,我们可以在前台reg.jsp页面中用<s:debug>调试时,可以看到值栈中的此Action对象中的fieldErrors对应着我们添加的错误信息,因此这点也就为我们取出验证信息提供一个参考,即是说我们可以取出此验证信息,对它进行美化处理,而不是按struts2默认来显示。 后面,我们接着对登录页面用login方法进行了类似的验证(在此省略),所以此action取名为regAndLoginAction.
补充:当我们把login.jsp页面的验证写完后,可以发现reg和login这两个方法显示相当的繁琐,对此我们可以专门把验证分别放在validateReg和validateLogin方法中去。我们新建一个Action来演示,新的
1 package com.asm; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class RegAndLogin2Action extends ActionSupport{ 6 private User user; 7 8 @Override 9 public void validate() { 10 System.out.println("校验的统一出口,对所有方法进行校验:这里可以放一些公共的验证"); 11 } 12 13 public void validateReg() { 14 System.out.println("aaa"); 15 } 16 17 public void validateLogin() { 18 System.out.println("bbbb"); 19 } 20 21 public String reg() throws Exception { 22 System.out.println("reg success...."); 23 return SUCCESS; 24 } 25 26 public String login() throws Exception { 27 System.out.println("login success...."); 28 return SUCCESS; 29 } 30 31 public User getUser() { 32 return user; 33 } 34 35 public void setUser(User user) { 36 this.user = user; 37 } 38 39 40 }
说明:当reg.jsp提交给此Action对应的reg方法处理时,它会首先调用此reg方法专属的验证方法valiadteReg(注意取名规则:validate+方法名<首字母大写>),此方法验证完成后,会调用validate方法,此方法完成后才会调用reg方法。因此一般情况下,我们会把一些公共的验证放在validate方法中,而这些所有的验证方法也只进行验证处理,并把错误信息封装到fieldError字段中(或者其它字段)。reg这些真正执行的方法只进行一些其它处理(比如把注册信息写进数据库)。测试时需要修改把前面的配置注释掉,写上下面的配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 4 "http://struts.apache.org/dtds/struts-2.1.dtd"> 5 <struts> 6 <constant name="struts.custom.i18n.resources" value="myapp"></constant> 7 8 <package name="validate" extends="struts-default"> 9 10 <action name="login" class="com.asm.RegAndLogin2Action" method="login"> 11 <result name="success">/logSuc.jsp</result> 12 <result name="input">/login.jsp</result> 13 </action> 14 <action name="reg" class="com.asm.RegAndLogin2Action" method="reg"> 15 <result name="success">/regSuc.jsp</result> 16 <result name="input">/reg.jsp</result> 17 </action> 18 19 20 </package> 21 </struts>