struts2 validate手动验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2 validate手动验证相关的知识,希望对你有一定的参考价值。

我们前面学习struts2知道,struts2通过拦截器实现了一些验证操作。

 

比如,如果是不能转换的类型在action中接受的话会跳转到错误页面,错误信息中会包含对应的错误信息,例如:

技术分享

 

首先我们了解一下错误信息的显示。

在页面上,我们显示错误信息,使用的是<s:fielderror>标签。

<s:fielderror>默认遍历所有的错误信息。

如果指定了fieldName属性,就打印的是指定filedName对应的错误信息。

 

如果手动添加错误信息?如何实现验证?

  在ActionSupport类中,实现了Validateable接口,我们可以重写validate方法或者validateXXX方法达到验证的目的:

struts2如果判断验证通过与否?

  struts2中的错误信息使用的是errors集合存储。

  底层源码: 

  public synchronized void addFieldError(String fieldName, String errorMessage) {
        final Map<String, List<String>> errors = internalGetFieldErrors();
        List<String> thisFieldErrors = errors.get(fieldName);

        if (thisFieldErrors == null) {
            thisFieldErrors = new ArrayList<String>();
            errors.put(fieldName, thisFieldErrors);
        }

        thisFieldErrors.add(errorMessage);
    }

  如果errors集合为null,或者errors.size()==0,表示验证通过。fieldError这个list集合存储错误提示信息,map集合存储字段名和对应的错误信息对应的集合

 

我们如果验证失败,处理方式:在validate方法或者validateXXX方法使用addFieldError方法添加错误,只有有错误就会跳到错误页面

this.addFieldError(key,value)
value:错误提示信息
 key:错误提示字段

 

例子:

  

    public void validateLogin() {
        System.out.println("Validate ********* validate");
        
        /*
         * 用户名不能为空
         */
        
        if(username==null || username.trim().isEmpty()){
            this.addFieldError("username","用户名不能为空");
        }
        if(psw==null || psw.trim().isEmpty()){
            this.addFieldError("psw","密码不能为空");
        }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("psw","密码的长度必须在6~12之间");
            }
        }
        
    }

 

这里要注意一点:

  如果重写validate方法,表示该action内的所有功能都要走验证方法,如果只是要验证单个方法,新建方法validate+要验证的执行方法名(该方法名首字母大写),或者validateDo+要验证的执行方法名(该方法名首字母大写)

 

因为fielderror是一个map集合,所以我们应该要理解<s:fielderror>标签了。我的前端页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP login.jsp starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <style type="text/css">
    li{
        list-style:none;
        color:red;
    }
        
    </style>

  </head>
  
  <body>
    
    <s:form name="loginForm" method="post" namespac="/validate" action="validateAction_login" theme="simple">
        <table border="1">
            <tr>
                <td>用户名</td>
                <td><s:textfield name="username" /></td>
                <td><s:fielderror fieldName="username" /></td>
            </tr>
            <tr>
                <td>密码</td>
                <td><s:password name="psw" /></td>
                <td><s:fielderror fieldName="psw" /></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><s:submit value="登录"/></td>
                <td></td>
            </tr>
        </table>
    </s:form>
    <br/>
    
    <a href="${pageContext.request.contextPath }/validate/validateAction_test.do">test其他的方法</a>
  </body>
</html>

 

  

以上是关于struts2 validate手动验证的主要内容,如果未能解决你的问题,请参考以下文章

struts2 验证方式

struts2_validate表单验证

struts2:字段校验和非字段校验代码示例

struts2输入验证

Struts2系列:(21)在Struts中自定义验证规则

JAVA validation 后台参数验证