zoukankan      html  css  js  c++  java
  • 【转】Struts2 表单验证与验证框架

    版权声明:好笔头不如烂记性 https://blog.csdn.net/zsbgood/article/details/81114038

    表单数据验证是很常见的功能,通常前端页面会有一次 js验证,但是后台也需要进行一次验证,这不依赖于前台验证,是保险的做法。
    同时,我们后台验证输入数据的合法性,如果按照以前的servlet方法,显而易见是非常麻烦的,我们既要获取表单数据,又要进行String类型的表单数据进行数据类型转换,再进行数据合法性验证,然后还要将非法数据的提示信息打印到页面上提示用户输入非法,这显得很忙,很累。
    因此,Struts2为我们提供了一些数据验证手段,特别是Struts2的验证框架, 可以有效为我们减少重复性的操作,非常值得学习。


    1.Action重写的validate()方法或使用validateXXX()方法

    validate的意思就是验证。我们的Action通常会集成ActionSupport这个类,这个类有很多有用的方法,其中,validate()验证方法就是其中之一。validate()方法会在action前自动执行。
    这里写图片描述

    这样重写validate()方法后,对于Action里的任何方法,都会先执行validate()方法验证。实际上,一个Action里会有很多个方法,但是并不是每个方法都需要同样的验证方式,因此,就出现了根据方法不同设定不同验证方法的方式。
    validateXXX(),可以针对特定的方法使用特定的验证方法,其余没有什么变化。这个方法直接定义即可,同样会在XXX()方法前执行验证。
    如果两个验证方法都存在,执行顺序是先执行validateXXX(),再执行通用的validate()方法。

    validateAction

     1 public class ValidateAction extends ActionSupport {
     2     private String username;
     3     private String password;
     4 
     5     @Override
     6     public String execute() throws Exception {
     7         return super.execute();
     8     }
     9 
    10     public String test() throws Exception{
    11         return "success";
    12     }
    13 
    14     public void validateTest(){
    15         System.out.println("test单独验证中");
    16         if(getUsername()==null||"".equals(getUsername().trim())){
    17             this.addFieldError("usernameMsg", "用户名不能为空!");
    18         }else {
    19             Pattern p = Pattern.compile("\{6,20}");
    20             Matcher m = p.matcher(getUsername().trim());
    21             if(!m.matches()){
    22                 this.addFieldError("usernameMsg","用户名有下划线,字母,数字构成,长度6-20");
    23             }
    24         }
    25     }
    26 
    27 
    28     @Override
    29     public void validate() {
    30         System.out.println("全局验证中");
    31         if(getUsername()==null||"".equals(getUsername().trim())){
    32             this.addFieldError("usernameMsg", "用户名不能为空!");
    33         }else {
    34             Pattern p = Pattern.compile("\{6,20}");
    35             Matcher m = p.matcher(getUsername().trim());
    36             if(!m.matches()){
    37                 this.addFieldError("usernameMsg","用户名由下划线,字母,数字构成,长度6-20");
    38             }
    39         }
    40 
    41         if(getPassword().trim().length()==0){
    42             this.addFieldError("passwordMsg","密码不能为空!");
    43         }else{
    44             int s = getPassword().trim().length();
    45             if(s<6 || s>30){
    46                 this.addFieldError("passwordMsg","密码长度应在6-30之间");
    47             }
    48         }
    49     }*/
    50 
    51     public String getUsername() {
    52         return username;
    53     }
    54 
    55     public void setUsername(String username) {
    56         this.username = username;
    57     }
    58 
    59     public String getPassword() {
    60         return password;
    61     }
    62 
    63     public void setPassword(String password) {
    64         this.password = password;
    65     }
    66 }

    login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%--用于输出提示信息,必须的--%>
        <s:fielderror></s:fielderror>
    
        <s:form name="form1" action="validateAction.action" method="post" validate="true">
            <s:textfield name="username" label="用户名"/>
            <s:textfield name="password" label="密码"/>
            <s:submit value="登陆"/>
        </s:form>
    </body>
    </html>

    strtus.xml片段

    <action name="validateAction" class="com.zsb.action.ValidateAction" method="test">
                <result name="success">success.jsp</result>
                <!--配合validate方法的result,确定验证失败后的去向-->
                <result name="input">validateLogin.jsp</result>
    </action>

    2. 使用Struts2验证框架

    尽管使用validate()方法比起自己实现验证要方便的多,但是依然存在代码不能重用的缺点,很多aciton方法都需要同样的验证,但又要在不同的action里重复写多次validate()方法。
    因此,就出现了Struts2的验证框架。
    这里写图片描述
    本来,还以为很简单的,但是,使用了校验框架后,却一直没有效果。
    对于校验文件的头部,我在struts2-core的包里找到了。

    校验文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--这个头部最好到struts2-core里复制-->
    <!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator 1.0.3//EN"
            "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
    <!--有两种方式,这里使用字段校验,是针对一个字段列举所有的需要的校验器,
    其实是一样的,只是以谁为中心,另一种是非字段校验,是针对一个校验器列举所
    有的需校验字段-->
    <!--strtus2内置了很多校验器,也可以会用正则表达式。这里只列举了
    非空字符串验证器,字符串长度验证器-->
    <validators>
        <field name="username">
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message>用户名不能为空</message>
            </field-validator>
        </field>
        <field name="password">
            <field-validator type="requiredstring">
                <message>密码不能为空</message>
            </field-validator>
            <field-validator type="stringlength">
                <param name="minLength">6</param>
                <param name="maxLength">15</param>
                <message>密码长度6-15位</message>
            </field-validator>
        </field>
    </validators>

    目录:
    这里写图片描述

    struts.xml配置(没有变动):

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
        <package name="login" namespace="/" extends="struts-default">
            <action name="validateAction" class="com.zsb.action.ValidateAction">
                <result name="success">success.jsp</result>
                <result name="input">validateLogin.jsp</result>
            </action>
        </package>
    </struts>

    对于struts2,我了解到它出现了两次高危漏洞,就算以后再用,也肯定要升级到2.5的,因此暂时没有试验低版本struts2。

  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/day1day1up/p/11179588.html
Copyright © 2011-2022 走看看