• (5)表单Action后台验证


    /day31/src/cn/itcast/web/struts2/user/UserAction.java

    package cn.itcast.web.struts2.user;
    
    import com.opensymphony.xwork2.ActionContext;
    
    public class UserAction {
            //表单参数
            private String username;
            private String password;
            //提供对应的setter方法(拦截器会将表单参数通过setter方法自动注入进来)
            public void setUsername(String username) {
                this.username = username;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            //注册的业务控制方法 
            public String registerMethod(){
                System.out.println("用户名:" + username);
                System.out.println("密码:" + password);
                //将用户名和密码绑定到域对象
                ActionContext.getContext().put("username",username);
                ActionContext.getContext().put("password",password);
                return "success";
            }
    }

    /day31/WebRoot/register.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>
        <script type="text/javascript" src="js/jquery-1.8.2.js"></script>
        <script type="text/javascript" >
            $(function(){
                $("form").submit(function(){
                    var flag=false;
                    var username=$(":text:first").val();
                    var password=$(":text:last").val();
                    username=$.trim(username);
                    password=$.trim(password);
                    if(username!=null&&username.length>0&&password!=null&password.length>0){
                        flag=true;
                    }else{
                        alert("不能为空");
                    }
                    return flag;
                });
            });
        </script>
    </head>
    
      <body>
       <form action="/day31/register" method="post">
              <table border="2" align="center">
                  <caption><h3>新用户注册(struts2版本)</h3></caption>
                  <tr>
                      <th>用户名</th>
                      <td><input type="text" name="username" maxlength="10"/></td>
                  </tr>
                  <tr>
                      <th>密码</th>
                      <td><input type="text" name="password" maxlength="6"/></td>
                  </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <input type="submit" value="注册"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
    </html>

    /day31/WebRoot/WEB-INF/register_success.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        注册成功<br/>
        用户名:${requestScope.username}<br/>    
        密  码:${requestScope.password}<br/>  
      <!-- 底层调用get方法 --> </body> </html>

    二:/day31/src/cn/itcast/web/struts2/user/UserAction.java

    package cn.itcast.web.struts2.user;
    
    public class UserAction {
            //表单参数
            private String username;
            private String password;
            //提供对应的setter方法(拦截器会将表单参数通过setter方法自动注入进来)
            public void setUsername(String username) {
                this.username = username;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            //EL取值,提供对应的getter方法 和拦截器栈有关
            public String getUsername() {
                return username;
            }
            public String getPassword() {
                return password;
            }
            //注册的业务控制方法 
            public String registerMethod(){
                System.out.println("用户名:" + username);
                System.out.println("密码:" + password);
                return "success";
            }
    }

    拦截器会默认将Action类的实例变量绑定在request域对象中,默认是空值,框架让拦截器将实例变量的值注入(setUsername("qe")),将转发改为重定向

    <result name="success" type="redirect">
    /register_success.jsp
    </result>

    改之后在success.jsp中不能取出值(重定向不是一个request)

    [问题:用redirect时放在WEB-INF下访问不到]


    *六)Action中业务方法的验证【数据格式的验证,属于后台验证】
    (1)在Action中写多个类似的业务控制方法
    相类似的业务控制方法,应该放在同一个Action中。

    /day31/WebRoot/login.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
       <form action="/day31/login" method="post">
              <table border="2" align="center">
                  <caption><h3>用户登录(struts2版本)</h3></caption>
                  <tr>
                      <th>用户名</th>
                      <td><input type="text" name="username" maxlength="10"/></td>
                   </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <input type="submit" value="登录"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
    </html>

    /day31/WebRoot/WEB-INF/login_success.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
        登录成功<br/>
        用户名:${requestScope.username}<br/>    
      </body>
    </html>

    /day31/src/cn/itcast/web/struts2/validator/ValidatorUserAction.java

    package cn.itcast.web.struts2.validator;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    //演示表单验证【后台】
    public class ValidatorUserAction {
        private String username;//哈哈
        private String password;//NULL
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
        //---------------------------------------以下是业务控制方法
        
        //注册业务控制方法[再] 
        public String registerMethod(){
            return "registerSuccess";
        }
        //登录业务控制方法[后] 
        public String loginMethod(){
            return "loginSuccess";
        }
    }

    /day31/src/cn/itcast/web/struts2/validator/struts_validator.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>
        <package name="validator" extends="struts-default" namespace="/">
        
            <!-- 用户注册 -->
            <action 
                name="register" 
                class="cn.itcast.web.struts2.validator.ValidatorUserAction" 
                method="registerMethod">
                <result name="registerSuccess" type="dispatcher">
                    /WEB-INF/register_success.jsp    
                </result>    
            </action>        
    
            <!-- 用户登录-->
            <action 
                name="login" 
                class="cn.itcast.web.struts2.validator.ValidatorUserAction" 
                method="loginMethod">
                <result name="loginSuccess" type="dispatcher">
                    /WEB-INF/login_success.jsp    
                </result>        
            </action>        
            
        </package>    
    </struts>  

    struts.xml包含

    <include file="cn/itcast/web/struts2/validator/struts_validator.xml"/>


    (2)验证Action中所有业务控制方法【validate()】
    validate()针对Action中的每一个业务控制方法而言。

    (4)收集Action中验证失败的消息,在jsp页面中显示【<s:fielderror fieldName="username"/>】
    【用户注册和登录】

    /day31/src/cn/itcast/web/struts2/validator/ValidatorUserAction.java

    package cn.itcast.web.struts2.validator;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    //演示表单验证【后台】
    public class ValidatorUserAction extends ActionSupport{
        private String username;//哈哈
        private String password;//NULL
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        //---------------------------------------以下是针对所有业务控制的验证方法
        
            @Override
            public void validate() {
                //在set方法传入之后由框架(栈中的某个拦截器)调用,会把错误消息放到一个集合中,如果集合为空或长度为0则验证成功
                //验证成功,调用下面的业务控制方法;验证失败,调用input属性所指明的页面
                //ActionSupport的TextProvider接口负责错误消息的绑定
                if(this.username!=null && this.username.trim().length()>0){
                    ;
                }else{
                    //收集错误消息
                    this.addFieldError("username","用户名必填");//("域名称","错误消息")
                }
                if(this.password!=null && this.password.trim().length()>0){
                    ;
                }else{
                    this.addFieldError("password","密码必填");
                }
            }    
        //---------------------------------------以下是业务控制方法
        
        //注册业务控制方法[再] 
        public String registerMethod(){
            return "registerSuccess";
        }
        //登录业务控制方法[后] 
        public String loginMethod(){
            return "loginSuccess";
        }
    }

    /day31/src/cn/itcast/web/struts2/validator/struts_validator.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>
        <package name="validator" extends="struts-default" namespace="/">
        
            <!-- 用户注册 -->
            <action 
                name="register" 
                class="cn.itcast.web.struts2.validator.ValidatorUserAction" 
                method="registerMethod">
                <result name="registerSuccess" type="dispatcher">
                    /WEB-INF/register_success.jsp    
                </result>
                <!-- 出错后,框架会调用input属性所对应的页面 -->
                <result name="input" type="dispatcher">
                    /register.jsp
                </result>    
            </action>        
    
            <!-- 用户登录-->
            <action 
                name="login" 
                class="cn.itcast.web.struts2.validator.ValidatorUserAction" 
                method="loginMethod">
                <result name="loginSuccess" type="dispatcher">
                    /WEB-INF/login_success.jsp    
                </result>    
                <!-- 出错后,框架会调用input属性所对应的页面 -->
                <result name="input" type="dispatcher">
                    /login.jsp
                </result>    
            </action>        
            
        </package>    
    </struts>      

    /day31/WebRoot/register.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>
        <script type="text/javascript" src="js/jquery-1.8.2.js"></script>
        <script type="text/javascript" >
            $(function(){
                $("form").submit(function(){
                    var flag=false;
                    var username=$(":text:first").val();
                    var password=$(":text:last").val();
                    username=$.trim(username);
                    password=$.trim(password);
                    if(username!=null&&username.length>0&&password!=null&password.length>0){
                        flag=true;
                    }else{
                        alert("不能为空");
                    }
                    return flag;
                });
            });
        </script>
    </head>
    
      <body>
       <form action="/day31/register" method="post">
              <table border="2" align="center">
                  <caption><h3>新用户注册(struts2版本)</h3></caption>
                  <tr>
                      <th>用户名</th>
                      <td><input type="text" name="username" maxlength="10"/></td>
                      <td>
                              <!-- 将出错的消息,取得并显示 -->
                              <s:fielderror fieldName="username"/>
                        </td>
                  </tr>
                  <tr>
                      <th>密码</th>
                      <td><input type="text" name="password" maxlength="6"/></td>
                         <td>
                              <s:fielderror fieldName="password"/>
                        </td>
                  </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <input type="submit" value="注册"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
    </html>

    /day31/WebRoot/login.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <body>
       <form action="/day31/login" method="post">
              <table border="2" align="center">
                  <caption><h3>用户登录(struts2版本)</h3></caption>
                  <tr>
                      <th>用户名</th>
                      <td><input type="text" name="username" maxlength="10"/></td>
                      <td>
                          <!-- 将出错的消息,取得并显示 -->
                          <s:fielderror fieldName="username"/>
                      </td>
                   </tr>
                  <tr>
                      <td colspan="2" align="center">
                          <input type="submit" value="登录"/>
                      </td>
                  </tr>
              </table>
          </form>
      </body>
    </html>

    定义一个Action类时的几种语法方式: 
    (1) 直接实现自己的Action(2) 实现Action接口 (3) 继承ActionSupport接口  

    ActionSupport接口实现的接口: 
    (1) Action接口:提供5个常量和一个excute()方法。 
    (2) Validateable接口:提供validate()方法,重写此方法可以对表单数据进行验证。 

    (3) ValidationAware接口:该接口定义了一些方法来对Action执行过程中产生的信息进行处理。 
    (4) TextProvider接口:该接口提供了一系列getText()方法,用于获取国际化资源信息。 
    (5) LocalProvider接口:提供一个getLocal()方法,用于国际化时获取语言。

    (3)验证Action中某个业务控制方法【validateXxx()】

    validateXxx()针对Action中的某一个业务控制方法而言。Xxx表示业务控制方法的名称,第一X大写。业务控制方法,就是与execute同签名的方法

    当一个Action中,同时出现validate()和validateXxx()方法时,按如下次序执行:
    validateXxx()    validate()    registerMethod()[如果验证成功了,才会执行xxx方法]

     /day31/src/cn/itcast/web/struts2/validator/ValidatorUserAction.java

    package cn.itcast.web.struts2.validator;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    //演示表单验证【后台】
    public class ValidatorUserAction extends ActionSupport{
        private String username;//哈哈
        private String password;//NULL
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        //---------------------------------------以下是争对所有业务控制的验证方法
        @Override
        public void validate() {
        }    
        //---------------------------------------以下是争对某个业务控制的验证方法
        
        //专用于注册验证方法[先]
        public void validateRegisterMethod(){
            if(this.username!=null && this.username.trim().length()>0){
                if(this.username.matches("[u4E00-uFA29]+")){
                    ;
                }else{
                    this.addFieldError("username","用户名必填是中文");
                }
            }else{
                this.addFieldError("username","用户名必填");
            }
            if(this.password!=null && this.password.trim().length()>0){
                if(this.password.matches("[0-9]{6}")){
                    ;
                }else{
                    this.addFieldError("password","密码必须是6位数字");
                }
            }else{
                this.addFieldError("password","密码必填");
            }
        }        
        //专用于登录验证方法[先]
        public void validateLoginMethod(){
            if(this.username!=null && this.username.trim().length()>0){
                if(this.username.matches("[u4E00-uFA29]+")){
                    
                }else{
                    this.addFieldError("username","用户名必填是中文");
                }
            }else{
                this.addFieldError("username","用户名必填");
            }
        }            
            
        //---------------------------------------以下是业务控制方法
        
        //注册业务控制方法[再] 
        public String registerMethod(){
            return "registerSuccess";
        }
        //登录业务控制方法[后] 
        public String loginMethod(){
            return "loginSuccess";
        }
    }
    在平凡中坚持前行,总有一天,会遇见优秀的自己
  • 相关阅读:
    delegate
    Event
    SQL:删除重复数据,只保留一条
    c#符号
    linux下vim命令详解【转】
    Probabilistic latent semantic analysis【转】
    Ubuntu下如何使用虚拟机安装WindowsXP?(2)【转】
    C文件操作fopen打开标记设置问题【学习笔记】
    Plate notation【转】
    最大似然估计(Maximum likelihood estimation) 【转】
  • 原文地址:https://www.cnblogs.com/mao-19/p/5710091.html
Copyright © 2020-2023  润新知