struts2 后端数据校验有两种方式,一种是通过action类继承ActionSupport类实现,另一种则是通过校验框架实现。
一、继承ActionSupport类
按照惯例,先编写pojo类、jsp页面以及action处理类,具体如下
public class User {
private String name;
private String psw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
}
<form action="login.action" method="post">
username:<input type="text" name="user.name" placeholder="不少于2个字符"/><br/>
password: <input type="text" name="user.psw"/><br/>
checkNumber:<input type="text" name="checkNum" placeholder="验证码" /><br/>
<input type="submit" value="submit"/>
</form>
public class LoginAction extends ActionSupport {
private User user;
private String checkNum; //验证码
@Override
public void validate() {
System.out.println("validate");
if(!"0000".equals(checkNum)){
// 添加错误信息
// param1 页面中数据来源的数据域name
// param2 对应的错误提示
this.addFieldError("checkNum","验证码错误");
}
}
public void validateLogin(){
System.out.println("validateLogin");
// 校验username
if(user.getName().length() < 2){
// 添加错误信息
// param1 页面中数据来源的数据域name
// param2 对应的错误提示
this.addFieldError("user.name","用户名不合法");
}
}
public String login(){
System.out.println("login");
return Action.SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getCheckNum() {
return checkNum;
}
public void setCheckNum(String checkNum) {
this.checkNum = checkNum;
}
}
我用的对象驱动,jsp页面需要输入name、psw和checkNumber。
validate方法在action类里的每个业务方法得到执行前执行,这里的业务方法指的是struts.xml中注册的方法,而validateLogin方法只是在login业务方法执行前执行,不论是validate方法,还是validateLogin方法,只要数据校验不通过,就可以调用addFileError方法,该方法两个参数的作用已注释说明。校验不通过的话,就会在result中寻找name属性为"INPUT"的。
于是,我们就可以把通用的校验放在validate中实现,而具体业务校验在methodName业务方法的校验方法validateMethodName方法实现。
方法执行顺序是,先执行具体业务校验方法,接着执行validate方法,如果前面的校验都通过了(注意执行validate方法与否与具体业务校验方法的校验结果无关),最后就会执行业务方法。
addFieldError方法中的参数信息,即错误提示信息,可以在jsp页面中用struts2的标签语言得到显示,格式如 <s:fielderror fieldName="user.name"></s:fielderror> 具体如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<form action="login.action" method="post">
username:<input type="text" name="user.name" placeholder="不少于2个字符"/><s:fielderror fieldName="user.name"></s:fielderror><br/>
password: <input type="text" name="user.psw"/><br/>
checkNumber:<input type="text" name="checkNum" placeholder="验证码" /><s:fielderror fieldName="checkNum"></s:fielderror><br/>
<input type="submit" value="submit"/>
</form>
二、校验框架
1.此时不需要validate方法,只需继承继承ActionSupport类,所以将LoginAciton类改为如下
public class LoginAction extends ActionSupport {
private User user;
private String checkNum; //验证码
public String login(){
System.out.println("login");
return Action.SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getCheckNum() {
return checkNum;
}
public void setCheckNum(String checkNum) {
this.checkNum = checkNum;
}
}
2.编写xml配置文件
该文件命名如 ActionClassName-validation.xml or ActionClassName-ActionAliasName-validation.xml,位于action类同一目录下,样例如下,需要注意的是文件头要与struts版本对应。
<?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 name="user.name">
<!-- 校验器-->
<field-validator type="requiredstring">
<message>用户名非空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">5</param>
<param name="minLength">2</param>
<message>长度不少于2,不多于5</message>
</field-validator>
</field>
<field name="checkNum">
<field-validator type="regex">
<param name="regexExpression"><![CDATA[(0000)]]></param>
<message>验证码错误</message>
</field-validator>
</field>
</validators>
至此,框架校验完毕。