【转】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。

转载于:https://www.cnblogs.com/day1day1up/p/11179588.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值