通过继承ActionSupport重写validate()方法,实现数据校验,会存在大量的重复代码,
类似于struts1,Struts2也提供通过配置文件来进行数据校验,使用校验框架不必重复的编写校验代码.
Action及jsp可以不用改变
package com;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport {
private String userName;
private String password;
private Integer age;
private Date birthday;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="messageResource"></constant> <package name="user" extends="struts-default"> <action name="regist" class="com.RegistAction"> <result name="success">/welcome.jsp</result> <result name="input">/regist.jsp</result> </action> </package> </struts>
jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri ="/struts-tags"%>
<html>
<body>
<form action="regist.action" method="post">
<s:fielderror></s:fielderror>
<table>
<tr>
<td>userName:</td>
<td>
<input type="text" name="userName">
</td>
</tr>
<tr>
<td>password:</td>
<td>
<input type="text" name="password">
</td>
</tr>
<tr>
<td>age:</td>
<td>
<input type="text" name="age">
</td>
</tr>
<tr>
<td>birthday:</td>
<td>
<input type="text" name="birthday">
</td>
</tr>
<tr>
<td colspan="2">
<s:submit value="注册"></s:submit>
</td>
</tr>
</form>
</body>
</html>
添加验证文件
在RegistAction.java同目录下添加文件名为RegistAction-validation.xml(action名-validation.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="userName"> <!-- 验证字符串不能为空 --> <field-validator type="requiredstring"> <!-- 去空格 --> <param name="trim">true</param> <!-- 错误提示信息 --> <message>userName is required</message> </field-validator> <!-- 验证字符串长度 --> <field-validator type="stringlength"> <param name="minLength">5</param> <param name="maxLength">16</param> <message>userName should be between ${minLength} and ${maxLength}</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>password is required</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">5</param> <param name="maxLength">16</param> <message>password should be between ${minLength} and ${maxLength}</message> </field-validator> </field> <!-- 验证字符串为数字 --> <field name="age"> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <message>age should be between ${min} and ${max}</message> </field-validator> </field> <!-- 验证字符串为日期类型 --> <field name="birthday"> <field-validator type="date"> <param name="min">1888-01-01</param> <param name="max">2008-01-01</param> <message>birthday should be between ${min} and ${max}</message> </field-validator> </field> </validators>
Struts 2.0已经实现很多常用的校验了,在jar的default.xml中的注册的
<validators> <validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" /> <validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> <validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /> <validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /> <validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /> <validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" /> <validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" /> <validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" /> <validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" /> <validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" /> <validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" /> <validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /> <validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" /> </validators>
<message>提示信息也可以国际化,<message key=””>就可以显示资源文件里的key对应的value了
当一个Action中有多个业务方法时,每个业务方法都会使用这种验证,显然是不好的.例如Action中有方法public String regist(),我们可以为regist()专门定义一个配置文件,文件名称为RegistAction-regist-validation.xml(Action名称-方法名- validation.xml)