zoukankan      html  css  js  c++  java
  • struts2学习笔记(7)---数据验证之validateXxx()方法

    validateXxx()方法

    上一篇文章写了使用Action的validate()方法,validate()仅仅能对action的所有方法进行验证。而要实现对action中特定的方法进行验证,就须要使用validateXxx()方法。

    validateXxx()仅仅会校验action中方法名为xxx的方法。当中Xxx的第一个字母要大写。

    源码

    UserAction.java

    package org.dny.action;
    
    import org.dny.model.User;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    public class UserAction extends ActionSupport implements ModelDriven<User>{
        private User user;
    
        @Override
        public User getModel() {
            if(this.user == null)
                this.user = new User();
    
            return this.user;
        }
    
        public String login() {  //登录
            System.out.println("UserAction login");
            System.out.println("userName:"+user.getUserName());
            System.out.println("paswword:"+user.getPassword());
    
            return "loginSuccess";
        }
    
        public void validateLogin() {
            System.out.println("UserAction validateLogin");
            if(user.getUserName() == null || user.getUserName().trim().equals(""))
                this.addFieldError("loginUserName", "帐号不能为空");   //给loginUserName属性加入错误消息“帐号不能为空”
            if(user.getPassword() == null || user.getPassword().trim().equals(""))
                this.addFieldError("loginPassword", "密码不能为空");
        }
    
        public String register() {  //注冊
            System.out.println("UserAction register");
            System.out.println("userName:"+user.getUserName());
            System.out.println("paswword:"+user.getPassword());
    
            return "registerSuccess";
        }
    
        public void validateRegister() {
            System.out.println("UserAction validateRegister");
            if(user.getUserName() == null || user.getUserName().trim().equals(""))
                this.addFieldError("registerUserName", "帐号不能为空");   //给registerUserName属性加入错误消息“帐号不能为空”
            if(user.getPassword() == null || user.getPassword().trim().equals(""))
                this.addFieldError("registerPassword", "密码不能为空");
        }
    
        @Override
        public void validate() { 
            System.out.println("UserAction validate");
    
        }
    }
    

    这里的UserAction中有login()和register()两个方法,以及与二者相应的validateLogin()和validateRegister()验证方法。

    struts.xml配置

    <action name="user_*" class="org.dny.action.UserAction" method="{1}">
                <result name="loginSuccess">/success.jsp</result>
                <result name="registerSuccess">/success.jsp</result>
                <result name="input">/index.jsp</result>
    </action>

    登陆成功或者注冊成功都会跳转到success.jsp页面。而验证失败时会跳转到index.jsp页面。

    index.jsp页面

    <center>
            登录<br>
            <!-- 登录 -->
            <form action="user_login" method="post">
                <table>
                    <tr>
                        <td>帐号:</td>
                        <td><input type="text" name="userName"></td>
                        <td>
                            <!-- 通过EL表达式取出 fieldErrors中loginUserName的值 -->
                            ${fieldErrors['loginUserName'][0]}
                        </td>
                    </tr>
                    <tr>
                        <td>密码:</td>
                        <td><input type="password" name="password"></td>
                        <td>
                            <!-- 通过EL表达式取出 fieldErrors中loginPassword的值 -->
                            ${fieldErrors['loginPassword'][0]}
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td align="left"><input type="submit" value="登录"> <input
                            type="reset" value="重置">
                    </tr>
                </table>
            </form>
        </center>
    
        <hr>
    
        <center>
            错误信息<br>
            <!-- 通过EL表达式取出 fieldErrors中所有的错误消息 -->
            通过EL表达式取出 fieldErrors中所有的错误消息:<br> ${fieldErrors}<br>
            <br>
            <!-- 通过struts标签取出fielderror中所有的错误消息 -->
            通过struts标签取出fielderror中所有的错误消息:
            <s:fielderror />
        </center>
    
        <hr>
    
        <center>
            注冊<br>
            <!-- 注冊 -->
            <form action="user_register" method="post">
                <table>
                    <tr>
                        <td>帐号:</td>
                        <td><input type="text" name="userName"></td>
                        <td>
                            <!-- 通过EL表达式取出 fieldErrors中registerUserName的值 -->
                            ${fieldErrors['registerUserName'][0]}
                        </td>
                    </tr>
                    <tr>
                        <td>密码:</td>
                        <td><input type="password" name="password"></td>
                        <td>
                            <!-- 通过EL表达式取出 fieldErrors中registerPassword的值 -->
                            ${fieldErrors['registerPassword'][0]}
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td align="left"><input type="submit" value="注冊"> <input
                            type="reset" value="重置">
                    </tr>
                </table>
            </form>
        </center>
    
        <hr>
    
        <center>
            <s:debug />
        </center>

    运行结果及截图

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    验证流程

    1、类型转换器对请求參数运行类型转换。并把转换后的值赋给action中的属性。
    2、假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息加入到fieldErrors里。

    无论类型转换是否出现异常,都会进入第3步。


    3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
    4、再调用action中的validate()方法。
    5、经过上面4步。假设系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自己主动将请求转发至名称为input的视图。

    假设系统中的fieldErrors没有不论什么错误信息。系统将运行action中的处理方法。

    參考链接:
    http://blog.csdn.net/houpengfei111/article/details/9038233

  • 相关阅读:
    USACO提交方法
    洛谷 P1967 【货车运输】
    一本通 P1386 【打击犯罪】
    洛谷 P5767 【最优乘车】
    洛谷 P5658 【括号树】
    洛谷 P5657 【格雷码】
    洛谷 P2272 【最大半连通子图】
    二分图匈牙利算法
    最小生成树Kruskal算法
    觉得写出了抽象类和接口,以及概括了设计模式的宗旨
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7017344.html
Copyright © 2011-2022 走看看