46.验证机制-基于手工编码的校验

转自: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>
原文地址:https://www.cnblogs.com/sharpest/p/5591608.html