zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    MongoClient类
    MongoDB基本操作(增删改查)
    为什么MongoDB适合大数据的存储?
    npm的使用
    nodejs安装教程
    c#byte数组和string类型转换
    C#中数组、ArrayList和List三者的区别
    eclspse魔板
    mysql的备份
    shell的使用
  • 原文地址:https://www.cnblogs.com/sharpest/p/5591608.html
Copyright © 2011-2022 走看看