我们前面学习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> </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>