• struts2验证(手工)


    struts2校验有两种实现方法:

          1. 手工编写代码实现(基本验证)

          2. 基于XML配置方式实现(验证框架)

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

       Action中

    要继承ActionSupport

    重写Validateable接口中的validate()方法 ,在该方法中完成验证

    * 步骤如下:  

        * validate()方法在其他的业务方法之前执行

                    * 验证出错转向的页面

                             struts.xml配置<result name="input">/validate/login.jsp</result>  

                             其中input转向是在action中已经定义好的.

                             public static final String INPUT = "input";                 

                     *  什么时候表示验证出错(转向input所指向的页面)

                             *  this.addFieldError("sss", "错误信息");方法指向的是一个集合

                             *  当集合不为空时,转向错误页面.

     1 public class ValidateAction extends ActionSupport {
     2  
     3  private String username;
     4  private String psw;
     5  
     6  //1 接收表单参数的方法
     7  public void setUsername(String username) {
     8     System.out.println("setUsername方法 "+username);
     9     this.username = username;
    10  }
    11  
    12  //2 验证方法
    13  public void validate(){
    14      //对用户名和密码的检测,,,
    15  }
    16 
    17  //3 业务方法
    18  public String login(){
    19   System.out.println("login方法***********************"+username);
    20   return "success";
    21  }

      •要进行验证,action必须继承ActionSupport或者实现Validateable

      •重写Validateable该接口中的validate()方法

        该方法与setUsername()方法和login()方法的执行顺序是

    setUsername(String username)
    validate()
    login()
      • 如果验证没有通过,要转向错误处理页面,由result标签的name=“input”指定 <result name="imput">/validate/login.jsp</result>

      什么时候表示验证没有通过?

          * 验证通过:1、集合存在,但集合中的内容为空;2、集合不存在

          * 验证不通过:集合存在,并且集合中的内容不为空

      如何往集合中存放错误信息this.addFieldError("username","用户名错误");

          * 参数1key(用户字段名,Action中的属性名)fieldName="username"

          * 参数2:错误信息,errorMessage="用户名错误"

     底层代码:

    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集合中放置错误信息
        }
    

     显示错误Jsp页面:

            使用<s:fielderror/>显示错误消息

           注:使用<s:fielderror/>标签即可将错误提示信息输出到页面中。 

     

    *  validate()方法会校验action中所有与execute方法签名相同的方法。

    *  要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。

    *  当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败 信息(为了使用addFieldError()方法,action可以继承ActionSupport ),

      如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。

    *  在input视图中可以通过<s:fielderror/>显示失败信息。

    1 public String add() throws Exception{
    2     return "success";
    3 }
    4 对应的验证方法    
    5 public void validateAdd(){
    6           //验证代码
    7 }

    针对指定方法进行校验的这个名为什么要这样组成呢?validateAdd()

       在ValidationInterceptor拦截器中可以看到以validate开始的方法

       

     输入校验的流程

    1 1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
    2 
    3 2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。
    4 
    5 3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。
    6 
    7 4。调用action中的validate()方法。
    8 
    9 5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

    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框架底层拼接,如果不这样写,底层就找不到对应方法名

      

    样例代码:

    1、jsp

      login.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> </td>
                  <td><s:submit value="登陆"/></td>
               </tr>
             </table>
         </s:form>
      </body>
      
      <a href="${pageContext.request.contextPath}/validate/validateAction_test.action">test其他的方法</a>
      
    </html>
    

      success.jsp

    <%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>    
        <title>My JSP 'login.jsp' starting page</title>
      </head>
      <body>
      <br>
            <h1>验证成功</h1>
      </body>
    </html>

    2、java

      ValidateAction.java

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    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 void setUsername(String username) {
    		System.out.println("ValidateAction ************ setUsername()");
    		this.username = username;
    	}
    	
    	/*
    	 * 验证方法:
    	 * 	* 该动作类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之间!");
    			}
    			
    		}
    		
    	}
    	
    	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";
    	}
    
    	public String getUsername() {
    		return username;
    	}
    
    	public String getPsw() {
    		return psw;
    	}
    
    	public void setPsw(String psw) {
    		this.psw = psw;
    	}
    	
    }
    

     3、xml

      struts_validate.xml

    <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>
    

      struts.xml

    <include file="cn/zengfansheng/struts/validate/struts_validate.xml"></include>
    

     

    by hacket
  • 相关阅读:
    [Next] 六.next的优化
    [Next] 五.next自定义内容
    Mac解决端口占用
    [Next] 四.在next中引入redux
    [Next] 服务端渲染知识补充
    [Next] 三.next自定义服务器和路由
    哪些使用UDP、TCP、IP协议
    IDEA配置git
    ssm整合配置
    git传输远程仓库
  • 原文地址:https://www.cnblogs.com/hacket/p/3083423.html
Copyright © 2020-2023  润新知