页面login.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP ‘login.jsp‘ starting page</title> </head> <body> <br> <s:fielderror/> <s:form name="loginForm" method="post" namespace="/validate" action="validateAction_login.action" theme="simple" > <table border="1"> <tr> <td>用户名</td> <td> <s:textfield name="username" /></td> </tr> <tr> <td>密码</td> <td><s:password name="psw" /></td> </tr> <tr> <td> </td> <td><s:submit value="登陆"/></td> </tr> </table> </s:form> </body> <a href="${pageContext.request.contextPath}/validate/validateAction_test.action">test其他的方法</a> </html>
创建action类通过此示例要校验用户名和密码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class ValidateAction extends ActionSupport { private String username; private String psw; public void setUsername(String username) { System.out.println("ValidateAction ************ setUsername()"); this.username = username; } /* * 验证方法: * * 该动作类action必须继承ActionSupport或者实现Validateable接口 * * 必须重写Validateable接口提供的validate()方法 * * * 必须要保证setUsername()、validate()、login()方法的执行顺序如下: * * setUsername() * * validate() * * login() * * * 如果登录失败,如何处理: * * this.addFieldError( key, value); * * key:错误提示字段 * * value:错误提示信息 * * * 通过底层代码说明: * public synchronized void addFieldError(String fieldName, String errorMessage) { final Map<String, List<String>> errors = internalGetFieldErrors(); //声明一个map集合 List<String> thisFieldErrors = errors.get(fieldName); //声明一个list集合,放入对应错误提示信息 if (thisFieldErrors == null) { //如果list集合为空 thisFieldErrors = new ArrayList<String>(); //重新创建一个list集合 errors.put(fieldName, thisFieldErrors); //把list集合放入到map集合中 } thisFieldErrors.add(errorMessage); //把错误提示信息放入到list集合中 } * * * 什么时候才是验证通过? * * 验证通过:1、map集合不存在;2、map集合存在并为空 * * 验证不通过:map集合存在并且不为空 * * * 分析需求: * * 用户名不能为null ,"" * 密码不能为null, "" ,并且密码的长度6-12之间 * * * 针对所有业务方法进行验证还是针对某个指定业务方法进行验证? * * 重写的validate()方法,针对所有业务方法进行验证 * * 重写的validate()方法加上要验证的指定的业务方法名(业务方法名的首字母大写),实现针对某个指定的业务方法进行验证 * 如该方法只想校验login方法 则这样写方法名validateLogin(); * 为什么要这样进行拼接?因为struts2框架底层拼接,如果不这样写,底层就找不到对应方法名 * */ public void validate() { System.out.println("ValidateAction ************ validate()"); if(username==null||username.equals("")){ this.addFieldError("error", "用户名不能为空!"); } if(psw==null||psw.equals("")){ this.addFieldError("error", "密码不能为空!"); }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("error", "密码的长度必须在6至12之间!"); } } } public String login(){ System.out.println("ValidateAction ********* login()"); System.out.println("username = "+username); System.out.println("password = "+psw); return "success"; } public String test(){ System.out.println("ValidateAction ********* test()"); return "success"; } public String getUsername() { return username; } public String getPsw() { return psw; } public void setPsw(String psw) { this.psw = psw; } }
基于xml文件配置的校验:
loginxml.jsp页面
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP ‘login.jsp‘ starting page</title> </head> <body>xml页面 <br> <s:fielderror/> <s:form name="loginForm" method="post" namespace="/validate" action="validateXmlAction_login.action" theme="simple" > <table border="1"> <tr> <td>用户名</td> <td> <s:textfield name="username" /></td> </tr> <tr> <td>密码</td> <td><s:password name="psw" /></td> </tr> <tr> <td>年龄(不能小于0)</td> <td> <s:textfield name="age" /></td> </tr> <tr> <td> </td> <td><s:submit value="登陆"/></td> </tr> </table> </s:form> <a href="${pageContext.request.contextPath}/validate/validateXmlAction_test.action">test其他的方法</a> </body> </html>
命名方式:ActionClassName-validation.xml,ActionClassName指的是动作类action的名称此命名方法针对该类中所有方法
若想只针对该类中的某一个方法,则使用ActionClassName-MethodName-validation.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <!-- field:指定action中要校验的属性 * name:指定将被验证的表单字段的名字 --> <field name="username"> <!-- field-validator:指定验证规则 * type:指定验证规则的名称 --> <field-validator type="requiredstring"> <!-- param:向验证器传递的参数 * requiredstring验证器的参数是"trim",设置为"true"的作用是去空格 --> <param name="trim">true</param> <!-- message:验证失败时,提示的错误信息 * <![CDATA[]]>:保证按原文输出 * 里面的文本:错误提示信息 --> <message><![CDATA[用户名不能为空!]]></message> </field-validator> </field> <field name="psw"> <field-validator type="requiredstring"> <param name="trim">true</param> <message><![CDATA[密码不能为空!]]></message> </field-validator> <!-- 使用正则表达式验证规则来做"regex" --> <field-validator type="regex"> <param name="trim">true</param> <param name="expression"><![CDATA[^[0-9a-zA-Z]{6,12}$]]></param> <message><![CDATA[密码的长度必须在6至12之间!]]></message> </field-validator> </field> </validators>
<field-validator type="requiredstring">
原文:http://blog.csdn.net/kingherooo/article/details/20227627