Struts2验证机制
Action组件要求实现Validateable接口,覆盖其validate()方法,编写有关验证代码
还要实现ValidationAware接口,该接口提供了添加错误消息的方法
addFieldError()
一般继承ActionSupport类,其实现了上述接口。
Struts2验证工作原理
workflow拦截器首先检查Action组件是否实现接口Validateable,如果实现,则调用其validate()进行验证,在验证中如果发现非法数据则创建错误消息并通过ValidationAware接口中方法存放该错误消息。当validate()执行完毕,workflow拦截器还要接着调用ValidationAware的hasErrors()方法,看是否有任何验证失败消息。如果有,则终止Action的执行而返回input结果。
在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验,校验失败将会自动跳转到input。
对于输入校验struts2提供了两种实现方法:
1. 采用手工编写代码实现(validate()和validateXxx())。
创建一个jsp登录页面
<form action="${pageContext.request.contextPath}/login.action" method="post">
用户名:<input type="text" name="name"/><br>
密码:<input type="text" name="pass"/><br>
<input type="submit" value="确定"/>
</form>
去struts.xml文件中声明
<action name="login"class="cn.csdn.action.LoginAction" method="login">
<result name="input">/WEB-INF/error.jsp</result>
<result>/index.jsp</result>
</action>
LoginAction.java文件:
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public LoginAction() {
super();
// TODO Auto-generatedconstructor stub
}
//进行校验
写了validate方法之后,会对所有的方法都进行校验
public void validate (){
if("".equals(name) || name==null){
//添加错误信息
this.addFieldError("msg", "用户名称不能为空");
}
if("".equals(pass) || pass==null){
//添加错误信息
this.addFieldError("msg", "密码不能为空");
}
}
写了validateLogin方法之后,对固定方法进行校验,只会对login方法进行验证
public void validateLogin(){
if("".equals(name) || name==null){
//添加错误信息
this.addFieldError("msg", "用户名称不能为空");
}
if("".equals(pass) || pass==null){
//添加错误信息
this.addFieldError("msg", "密码不能为空");
}
}
public String login() throws Exception {
// TODO Auto-generatedmethod stub
System.out.println("进行业务登录操纵的处理.......");
return SUCCESS;
}
public String query() throws Exception {
// TODO Auto-generatedmethod stub
System.out.println("进行业务查询操纵的处理.......");
return SUCCESS;
}
error.jsp
<!--struts2的标签库 首先必须引入struts2的标签库 -->
<%@taglib uri="/struts-tags"prefix="s" %>
在body中写入
<s:fielderror></s:fielderror>即可
2. 基于XML配置方式实现。
在上述基础上,添加一个xml文件
LoginAction-validation.xml
<!DOCTYPE validators PUBLIC
"-//ApacheStruts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="stringlength">
<param name="trim">true</param>
<param name="minLength">20</param>
<param name="maxLength">30</param>
<message>长度必须在20-30之间</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="regex">
<param name="trim">true</param>
<param name="caseSensitive">true</param>
<param name="expression"> <![CDATA[(\w{4,15})]]> </param>
<message>必须是字符和数组的组合并且长度是4-15之间</message>
</field-validator>
</field>
</validators>