zoukankan      html  css  js  c++  java
  • Struts2框架(8)---Struts2的输入校验

    Struts2的输入校验

    在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验:

       客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻服务器的负担,但是客户端校验并不是安全的,简单来讲就是防君子防不了小人。

       服务器端校验:最大特点就是数据安全,但是如果只有服务器端校验,会大大增加服务器端的负担。

    所以一般在我们开发中,是客户端和服务器端校验相结合作用的。

    那这篇文章,我只讲服务器端校验,在Struts2支持两种校验方式:

        代码校验 在服务器通过编辑java代码完成数据校验

       配置校验: xml配置校验 通过xml配置文件完成数据的校验

    (1)代码校验:

        代码校验分为三个步骤:  

    步骤一、封装数据

    步骤二、实现要校验的Action  必须继承ActionSupport

    步骤三、覆盖Validate方法  然后完成业务逻辑数据的校验

    用户界面 register.jsp

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
     3 <%@ taglib uri="/struts-tags" prefix="s" %>
     4 <html>
     5   <head>
     6     <title>用户注册</title>
     7   </head> 
     8   <body style="text-align: center;">
     9     <table align="center" width="50%">
    10         <tr>
    11             <td style="color: red">
    12                 <!-- <s:fielderror></s:fielderror>  --> <!-- 这里是显示错误的地方 -->
    13             </td>
    14         </tr>  
    15     </table>
    16   
    17         <form action="${pageContext.request.contextPath }/login" method="post"  >
    18         
    19             用户名:<input type="text"  name="username"><br><br>
    20             密     码:<input type="text"  name="password"><br><br>
    21                     确认密码:<input type="text"  name="password2"><br><br>
    22                         <input type="reset" value="清空">
    23                         <input type="submit" value="注册">
    24                 
    25         </form>
    26   </body>
    27 </html>

    struts.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 <struts>  
     6       <!-- 配置常量信息 -->
     7       <constant name="struts.devMode" value="true"></constant>       
     8       
     9      <package name="struts2" extends="struts-default" >
    10          <action name="login" class="com.study.Login.RegisterAction">
    11          <result name="success">/success.jsp</result>
    12          <!-- 在input视图中可以通过<s:fielderror/>显示失败信息 -->
    13          <result name="input">/register.jsp</result>
    14          </action>
    15      </package>         
    16 </struts>
    RegisterAction.java
     1 import com.opensymphony.xwork2.ActionSupport;
     2 public class RegisterAction extends ActionSupport{
     3 
     4     private String username;
     5     private String password;
     6     private String password2;
     7     //这里我通过set方法封装数据    
     8   public void setUsername(String username) {
     9         this.username = username;
    10     }
    11     public void setPassword(String password) {
    12         this.password = password;
    13     }
    14     public void setPassword2(String password2) {
    15         this.password2 = password2;
    16     }
    17 
    18     @Override
    19     public String execute() throws Exception {
    20         return NONE;
    21     }
    22     
    23     //在服务器端需要完成对数据的校验
    24     @Override
    25     public void validate() {
    26         //测试是否得到属性值,证实已经得到
    27     System.out.println(username+"---"+password+"---"+password2);
    28     if(username==null || username.length()<6 || username.length()>20){
    29         //把错误信息保存到字段中
    30         this.addFieldError("username", "有户名输入不合法");
    31     }
    32     
    33     if(password==null || password.length()<6 || password.length()>20){
    34         //把错误信息保存到字段中
    35         this.addFieldError("password", "密码输入不合法");
    36     }else if( password2==null || password2.length()<6 || password2.length()>20){
    37         this.addFieldError("password2", "密码输入不合法");
    38     }else if(!password.equals(password2)){
    39         this.addFieldError("password2", " 两次密码不一致");
    40     }
    41     
    42         super.validate();
    43     }
    44 }
    运行结果:

     (2)框架校验

     框架校验也就是通过XML配置方式进行数据校验 ,这也是我们在企业开发的主流校验。

    XML校验原理: 将很多规则代码已经写好只需要在xml文件中定义需要使用的校验规则即可。,所以大大减少了我们的开发时间。

     我先把步骤写一下:

         步骤一:编写JSP

         步骤二:编写Action 继承ActionSupport或者Validateable接口

       步骤三:封装请求参数

       步骤四:编写xml校验规则文件

        Xml校验文件的命名规则:   Action类名-validation.xml 对Action中所有的方法都执行校验

          举例命名规则RegisterAction-validation.xml

           同时要满足:Xml校验文件和Action类要在同一包下

     步骤一: register.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>用户注册</title>
      </head>
      
      <body style="text-align: center;">
        <table align="center" width="50%">
            <tr>
                <td style="color: red">
                    <s:fielderror></s:fielderror>
                </td>
            </tr>
          
        </table>
      
      
      
            <form action="${pageContext.request.contextPath }/login.action" method="post"  >
                <table width="60%" >
                    <tr>
                        <td>用户名</td>
                        <td>
                            <input type="text" name="username" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>密码</td>
                        <td>
                            <input type="password" name="password" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>确认密码</td>
                        <td>
                            <input type="password" name="password2" >
                        </td>
                    </tr>
                    
                   <tr>
                        <td>年龄</td>
                        <td>
                            <input type="text" name="age" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>邮箱</td>
                        <td>
                            <input type="text" name="email" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>生日</td>
                        <td>
                            <input type="text" name="birthday" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>毕业日期</td>
                        <td>
                            <input type="text" name="graduation" >
                        </td>
                    </tr>
                    
                    <tr>
                        <td>
                            <input type="reset" value="清空">
                        </td>
                        <td>
                            <input type="submit" value="注册">
                        </td>
                    </tr>
                
                </table>
            </form>
        
        
      </body>
    </html>
    register.jsp

       步骤二:RegisterAction.java

    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    public class RegisterAction extends ActionSupport implements ModelDriven<User>{
    
     //手动创建一个对象
        private User user =new User();
    
        @Override
        public String execute() throws Exception {
            return NONE;
        }
    
        public User getModel() {
            return user;
        }        
    }

    步骤三:封装请求参数

    上面手动校验的案例我是用set方法封装数据,那这里我采用的是使用ModelDriven接口,对请求数据进行封装,

    在之前我讲过封装数据的三种方法不清楚的可以看下这篇文章:Struts框架(6)---action接收请求参数

    User.java

     1 import java.util.Date;
     2 public class User {
     3     
     4     private String username;
     5     private String password;
     6     private String password2;
     7     private Integer age;
     8     private String email;
     9     private Date birthday;
    10     private Date graduation;
    11     
    12     /*
    13      * 给属性提供get和set方法
    14      */
    15 }

     步骤四:RegisterAction-validation.xml

    <!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator 1.0.2//EN"
            "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
     <validators>
      <!--dtd约束在xwork-core-**.jar包中 -->   
          <field name="username">
                  <field-validator type="requiredstring">
                      <param name="trim">true</param>
                      <message>用户民不能为空</message>
                  </field-validator>
                  
                  <field-validator type="stringlength">
                    <param name="minLength">6</param>
                    <param name="maxLength">15</param>
                    <message>有户名长度必须在 ${minLength} 和 ${maxLength}之间 </message>
                  </field-validator>
          </field> 
          
          
            <field name="password">
                  <field-validator type="requiredstring">
                      <param name="trim">true</param>
                      <message>密码不能为空</message>
                  </field-validator>
                  
                  <field-validator type="stringlength">
                    <param name="minLength">6</param>
                    <param name="maxLength">15</param>
                    <message>密码必须在 ${minLength}和${maxLength}之间 </message>
                  </field-validator>
           </field> 
           
          <field name="password2">
              <field-validator type="fieldexpression">
                 <param name="expression"><![CDATA[password==password2]]></param>
                 <message>两次密码不一致</message>
              </field-validator>
          </field>
          
          <field name="age">
              <field-validator type="required">
                  <param name="trim">true</param>
                  <message>年龄不能为空</message>
              </field-validator>
              <field-validator type="int">
                  <param name="min">1</param>
                  <param name="max">150</param>
                  <message>年龄必须在 ${min} 和 ${max}之间</message>
              </field-validator>
            
          </field>
          
          <field name="email">
               <field-validator type="email">
                   <message>不是一个合法的邮箱地址</message>
               </field-validator>
          </field>
          
           <field name="birthday">
              <field-validator type="date">
                  <param name="min">2001-01-01</param>
                  <param name="max">2003-12-31</param>
                  <message>生日必须在 ${min} 和${max}之间</message>
              </field-validator>        
          </field> 
          
     </validators>

    struts.xml不需要任何改变,和之前一样就可以了

    运行结果:

       如果你觉得提示错误的位置有点丑,那你可以运用Struts2的<s:form>标签,效果会更好

    现在两种方式都讲了,现在对xml配置的要点一些知识要点进行归纳。

    xml校验文件详解:  

    <validators>: 根元素

    <field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字

    <field-validator>:指定校验器, type 指定验证规则

         上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求

          的校验器,这些校验器的定义可以在xwork-2.x.jar中的

          com.opensymphony.xwork2.validator.validators下的default.xml中找到。

    <param>:子元素可以向验证程序传递参数

    <message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message

                              指定key属性,key的值为属性文件中的key。

    struts2校验规则:

    系统提供的校验器如下:

    required (必填校验器,要求被校验的属性值不能为null)

    requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

    stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

    regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

    int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

    double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

    fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

    email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)

    url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)

    date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

    conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

    visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)

    expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

    最后讲一个细节:

    编写校验文件时,不能出现帮助信息

    在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:

    windwos->preferences->myeclipse->files and editors->xml->xmlcatalog

    点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的srcjava目录中选择xwork-validator-1.0.3.dtd,

    回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd 

    本文章就讲到这里,有不足之处,欢迎大家留言指点,谢谢!

  • 相关阅读:
    推箱子(简易版)
    [LeetCode] Word Ladder II
    [LeetCode] Path Sum
    [LeetCode] Word Ladder
    DFS & BFS
    [LeetCode] Surrounded Regions
    [LeetCode] Add Binary
    [LeetCode] Plus One
    [LeetCode] Single Number II
    [LeetCode] Single Number
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6538727.html
Copyright © 2011-2022 走看看