验证分为前端验证和服务端验证。

前端验证可以通过JS或者JQ的validate插件进行表单验证,服务端验证则需要在后台进行验证【前端验证是可以通过浏览器避开的】。

Struts服务端验证有以下两种方式:

  • 声明式验证;
  • 编码验证;

1.Struts2 内置验证:

Struts2-属性验证_struts

<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="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<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"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

2.【声明式验证】

2.1字段验证

  • 确定那些字段需要验证
  • 配置xml验证文件;
  • struts.xml中配置验证出错返回界面;

示例如下;

  • TestValidAction-validation.xml

该种命名方式表明是针对该Action类的所有请求都会应用到的验证规则,即,如果针对该Action类某个特定请求单独配置了验证文件,(如TestValidAction-create-validation.xml【针对该Action中create方法请求】),也会随之使用TestValidAction-validation.xml验证文件—–会使用独有和共有两个验证文件。

默认情况下,会将共有的验证规则置于ActionName-validation.xml中。

<validators>
<!-- base on field !!! -->
<field name="age">
<field-validator type="int">
<param name="min">10</param>
<param name="max">130</param>
<message key="error.int">age should be in ${min} and ${max}</message>
/* key 可以实现国际化 */
</field-validator>
</field>

</validators>

验证流程:

params拦截器—conversionError拦截器—validation拦截器—

Struts2-属性验证_xml_02

以上可知,最先启用的是params 拦截器,其中会进行类型转换--如果失败则会发生ConversionError。

添加conversion验证:

<field name="age">
<field-validator type="conversion" >
<message>Conversion Error Occurred</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message key="error.int">age should be in ${min} and ${max}</message>
</field-validator>
</field>

短路验证:

若对一个字段使用多个验证器,默认情况下会执行所有的验证器。如希望第一个验证出错后面不再验证,可以使用短路验证。
<field name="age">
<field-validator type="conversion" short-circuit="true">
<%--short-circuit 短路验证--%>
<message>Conversion Error Occurred</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message key="error.int">age should be in ${min} and ${max}</message>
</field-validator>
</field>

字段验证页面显示消息的几种方式:

若使用的是XHTML主题,表单里面的s标签会自动显示错误消息;

若使用的是simple主题,则可以使用下面几种方式显示错误消息:
------age取值为一组消息,故使用age[0]取单个消息

直接使用EL取值
1.${fieldErrors.age[0]}
使用<s:property/>标签从对象栈取值
2.<s:property value="fieldErrors.age[0]"></s:property>
使用<s:fielderror/>
3.<s:fielderror fieldName="age"></s:fielderror>

2.2非字段验证

expression:用来验证一个字段是否满足一个OGNL表达式

<!-- 非字段验证 -->
<validator type="expression">
<param name="expression"> <![CDATA[password==password2]]></param>
<message>password is not equals to pasword2 .... </message>
</validator>

JSP 表单:

Password:<s:password name="password" label="Password"></s:password>
<br/><br/>
Password2:<s:password name="password2" label="Password2"></s:password>
<br/><br/>
<s:actionerror/>
/*使用 <s:actionerror/>标签显示非字段错误消息*/

效果如下:

Struts2-属性验证_属性验证_03

3.【编程式验证】

实现Validateable接口,重写validate()方法,即可;
ActionSupport已经实现了Validateable接口。

public class TestValidateable extends ActionSupport implements Validateable{
//not need to implements the Validateable interface
private static final long serialVersionUID = 1L;

private String username;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
//编程式验证 示例如下
public void validate() {
String name = ServletActionContext.getRequest().getParameter("name");
if (name == null || name.trim().equals("")) {
addFieldError("username",getText("name.null"));
//put the fielderror into objectStack
}
}
//the default method--execute()
public String execute() throws Exception {

this.validate();//call the validate()

System.out.println("username :"+username);

return SUCCESS;
}
}

针对单个参数另外一种写法,同样可以适用于多参数,稍微修改即可:

//编程式验证 多参数示例如下
public void validate() {
String name = null;
//获取参数
Enumeration params = ServletActionContext.getRequest().getParameterNames();
while (params.hasMoreElements()) {
name = (String) params.nextElement();
}
//获取参数值
String nameValue = ServletActionContext.getRequest().getParameter(name);
System.out.println("****"+name);
if (nameValue == null || nameValue.trim().equals("")) {
addFieldError(name,getText("username.null"));

}
}

将其作为普通Action配置在struts.xml中即可。。。

4.自定义验证器

Struts2中自定以验证器都需要实现validator接口;
1.针对字段验证,可以通过继承FieldValidateSupport类;
2.非字段验证,则可以通过继承ValidatorSupport类;

Struts2-属性验证_表单验证_04

  • validators.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
<validator name="idcard" class="com.web.validation.IDCardValidator"></validator>
</validators>

validators.xml中配置完后,即可在TestValidAction-validation.xml中配置使用。

Struts2-属性验证_表单验证_05

  • 自定义验证器IDCardValidator
public class IDCardValidator extends FieldValidatorSupport  {

public void validate(Object object ) throws ValidationException {
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);
/*//object 为使用该验证器的对象,此处为TestValidAction*/
IDCard idCard = new IDCard();
boolean resutl = idCard.Verify((String)value);

if (!resutl) {
addFieldError(fieldName, object);
}
}
}

测试如下:

Struts2-属性验证_表单验证_06

参数Object解析:

Struts2-属性验证_struts_07