页面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>
非xml文件方式配置:
创建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>
在action类的同一目录下创建对应的xml文件
命名方式:ActionClassName-validation.xml,ActionClassName指的是动作类action的名称此命名方法针对该类中所有方法
若想只针对该类中的某一个方法,则使用ActionClassName-ActionName-validation.xml。需要指出的是此处的ActionName为struts.xml中定义的action中的name值
<?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>
其中的type属性可选值为
<field-validator type="requiredstring">