基于Struts2校验器的校验可以完成绝大部分功能,但这些校验器都具有固定的校验逻辑,无法满足一些特殊的校验规则。对于一些特殊的校验要求,可能需要在Struts2中进行手动校验,Struts2提供了良好的可扩展性,从而允许通过手动方式完成自定义校验。
重写validate方法:
我们通过重写ActionSupport的validate方法来进行这种校验。
register.jsp :
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<s:fielderror></s:fielderror>
<s:form action="register">
<s:textfield name="name" label="姓名"></s:textfield>
<s:textfield name="age" label="年龄"></s:textfield>
<s:submit value="确定"></s:submit>
</s:form>
<s:debug></s:debug>
</body>
</html>
ok.jsp :
<body>
register success...
</body>
struts.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="demo" extends="struts-default">
<action name="register" class="action.RegisterAction">
<result name="success">/ok.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>
RegisterAction.java :
public class RegisterAction extends ActionSupport {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void validate() {
if(name.length()!=3){
this.addFieldError("name","英文姓名长度必须为3");
}
if(!(age>=10 && age<=20)){
this.addFieldError("age","年龄必须在10到20岁之间");
}
}
public String execute(){
if(name.equals("tom")){
return "success";
}
return "input";
}
}
在validate方法中,一旦发现校验失败,就把校验失败提示通过addFieldError方法添加进系统的FieldError中,除此之外,程序无需做额外的处理。如果Struts2发现系统的FieldError不为空,将会自动跳转到input逻辑视图,所以需要在struts.xml中为该Action的input逻辑视图指定物理视图。
上面的<s:fielderror/>标签专门负责输出系统的FieldError信息,也就是输出输入校验的失败提示。