Struts2手动验证

struts2手动验证

* 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法

* 要继承ActionSupport类或者实现Validateable接口

* 重写Validateable接口的validate()方法
    * 前提是:要保证setUsername()、validate()、login()方法要按照这个先后顺序执行

* 如果登录失败,如何处理:
    * this.addFieldError( key, value);
        * key:错误提示字段
        * value:错误提示信息

* 什么时候才是验证通过?
    * 验证通过:1、map集合不存在;2、map集合存在并为空
    * 验证不通过:map集合存在并且不为空

* 分析需求:
    * 用户名不能为null ,""
    * 密码不能为null, "" ,并且密码的长度6-12之间 

* 针对所有业务方法进行验证还是针对某个指定业务方法进行验证?
    * 重写的validate()方法,针对所有业务方法进行验证
    * 重写的validate()方法加上要验证的指定的业务方法名(业务方法名的首字母大写),实现针对某个指定的业务方法进行验证
        * 为什么要这样进行拼接?因为struts2框架底层拼接,如果不这样写,底层就找不到对应方法名

  • validate()方法会校验action中所有与execute方法签名相同的方法。
  • 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中
    方法名为Xxx的方法。其中Xxx的第一个字母要大写。
  • 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败
    信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统
    的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。
  • 在input视图中可以通过显示失败信息。
    validateXxx()方法使用例子:

底层代码(ValidationInterceptor拦截器)

这里写图片描述

输入校验的流程

1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。

3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。

4。调用action中的validate()方法。

5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法


基本验证(对action的所有方法进行校验)

  • Action中
    • 要继承ActionSupport
    • 重写Validateable接口中的validate()方法 ,在该方法中完成验证
package cn.itcast.validate;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class ValidateAction  extends ActionSupport{

    private String username;
    private String psw;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        System.out.println("ValidateAction ************ setUsername()");
        this.username = username;
    }
    public String getPsw() {
        return psw;
    }
    public void setPsw(String psw) {
        this.psw = psw;
    }


    public String login(){
        System.out.println("ValidateAction ********* login()");

        System.out.println("username = "+username);

        System.out.println("password = "+psw);

        return "success";
    }

    public String test(){
        System.out.println("ValidateAction ********* test()");
        return "success";
    }

    /*
     * 验证方法:
     *  * 该动作类action必须继承ActionSupport或者实现Validateable接口
     *  * 必须重写Validateable接口提供的validate()方法
     * 
     *  * 必须要保证setUsername()、validate()、login()方法的执行顺序如下:
     *      * setUsername()
     *      * validate()
     *      * login()
     * 
     *  * 如果登录失败,如何处理:
     *      * this.addFieldError( key, value);
     *          * key:错误提示字段
     *          * value:错误提示信息
     * 
     *  * 通过底层代码说明:
     *      public synchronized void addFieldError(String fieldName, String errorMessage) {
                final Map<String, List<String>> errors = internalGetFieldErrors();      //声明一个map集合
                List<String> thisFieldErrors = errors.get(fieldName);                   //声明一个list集合,放入对应错误提示信息

                if (thisFieldErrors == null) {                                          //如果list集合为空
                    thisFieldErrors = new ArrayList<String>();                          //重新创建一个list集合
                    errors.put(fieldName, thisFieldErrors);                             //把list集合放入到map集合中
                }

                thisFieldErrors.add(errorMessage);                                      //把错误提示信息放入到list集合中
            }
     * 
     *  * 什么时候才是验证通过?
     *      * 验证通过:1、map集合不存在;2、map集合存在并为空
     *      * 验证不通过:map集合存在并且不为空
     * 
     *  * 分析需求:
     *      * 用户名不能为null ,""
            * 密码不能为null, "" ,并且密码的长度6-12之间 
     * 
     *  * 针对所有业务方法进行验证还是针对某个指定业务方法进行验证?
     *      * 重写的validate()方法,针对所有业务方法进行验证
     *      * 重写的validate()方法加上要验证的指定的业务方法名(业务方法名的首字母大写),实现针对某个指定的业务方法进行验证
     *          * 为什么要这样进行拼接?因为struts2框架底层拼接,如果不这样写,底层就找不到对应方法名
     *  
     */
    public void validateLogin() {
        System.out.println("ValidateAction ************ validate()");

        if(username==null||username.equals("")){
            this.addFieldError("error", "用户名不能为空!");
        }
        if(psw==null||psw.equals("")){
            this.addFieldError("error", "密码不能为空!");
        }else{

            String pattern = "^[0-9a-zA-Z]{6,12}$";

            Pattern p = Pattern.compile(pattern);

            Matcher m = p.matcher(psw);

            boolean b = m.matches();

            if(!b){
                this.addFieldError("error", "密码的长度必须在6至12之间!");
            }

        }
    }

}
  • struts.xml配置
<struts>
    <package name="validate" namespace="/validate" extends="struts-default">
        <action name="validateAction_*" class="cn.itcast.validate.ValidateAction" method="{1}">
            <result name="success">/validate/success.jsp</result>
            <result name="input">/validate/login.jsp</result>
        </action>
    </package>
</struts>
  • 显示错误Jsp页面:
<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>
  <br>
      <s:fielderror/>
      <s:form name="loginForm" method="post"  namespace="/validate"  action="validateAction_login.action" theme="simple" >
         <table border="1">
           <tr>
              <td>用户名</td>
              <td> <s:textfield name="username" /></td>
           </tr>
           <tr>
              <td>密码</td>
              <td><s:password name="psw" /></td>
           </tr>
           <tr>
              <td>&nbsp;</td>
              <td><s:submit value="登陆"/></td>
           </tr>
         </table>
     </s:form>
  </body>

  <a href="${pageContext.request.contextPath}/validate/validateAction_test.action">test其他的方法</a>

</html>

这里写图片描述

  • 测试
    这里写图片描述
    这里写图片描述
    这里写图片描述

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值