基于覆盖validate方法的表单校验
Action类一般都继承ActionSupport类。
通过覆盖ActionSupport类的validate方法即可在自己的Action类中校验输入项的值。
校验动作类中的所有方法
UserAction类
package com.struts2.action.example;
import java.io.Serializable;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport implements Serializable {
private static final long serialVersionUID = 7553541763848145723L;
private String username;// 用户名不能为空,还要去掉首尾空格
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String add() {
System.out.println("执行了user的add方法");
return SUCCESS;
}
public String update() {
System.out.println("执行了user的update方法");
return SUCCESS;
}
//对动作类中的所有方法进行验证
@Override
public void validate() {//验证方法。只考虑不符合条件的
if(username==null||"".equals(username.trim())){
addFieldError("username", "用户名不能为空");
}
if(password==null||!password.matches("\\w{6,16}")){
addFieldError("password", "密码不能为空且必须是6~16位的大小写字母或数字");
}
}
}
校验动作类中的指定方法
将上面动作类的validate方法改写如下
public void validateAdd() {
if (username == null || "".equals(username.trim())) {
addFieldError("username", "用户名不能为空");
}
if (password == null || !password.matches("\\d{3,6}")) {
addFieldError("password", "密码不能为空且必须是3~6位的数字");
}
}
即指定只校验add方法。
形如public void validateXxx()的方法,即为校验指定Xxx方法,Xxx代表的是要验证的动作方法名,要把动作方法名的首字母变为大写。
struts.xml内容
<package name="validation" namespace="/validation" extends="struts-default">
<action name="user_*" class="com.struts2.action.example.UserAction" method="{1}">
<result name="success">/WEB-INF/jsp/success.jsp</result>
<result name="input">/{1}User.jsp</result>
</action>
</package>
name=user_*,为使用通配符的方式访问动作类中指定的方法
method={1},为使用占位符的方式获取通配符中的方法名
addUser.jsp内容
<form action="${pageContext.request.contextPath}/validation/user_add.action" method="post">
用户名:<input type="text" name="username" value="${param.username }"/><s:fielderror fieldName="username"/><br/>
密码:<input type="password" name="password" value="${param.password }"/> <s:fielderror fieldName="password"/><br/>
<input type="submit" value="保存"/>
</form>
访问地址http://localhost:8080/Struts2/addUser.jsp
直接点提交按钮提示如下:
按validation方法里的逻辑填写正确的输入项后,控制台输出结果如下:
成功通过了验证,并执行了Action类的add方法。
基于xml文件的表单校验
校验动作类中的所有方法
把动作类的validate方法注释掉,并添加UserAction-validation.xml内容
<?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">
<!-- 基于配置文件的表单验证
1,动作类中指定的方法进行验证:
配置文件名:动作类名-动作名(配置文件中的动作名)-validation.xml,
如,UserAction-user_add-validation.xml
2,验证动作类中的所有方法:
配置文件名:动作简单类名-validation.xml,如,UserAction-validation.xml
-->
<validators>
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>用户名不能为空!</message>
</validator>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[\w{6,16}]]></param>
<message>密码可以为6~16位数字和字母的组合!</message>
</field-validator>
</field>
</validators>
普通校验和字段校验
普通校验
eg:
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>用户名不能为空!</message>
</validator>
字段验证
一般比普通验证更可取,因为可设置多个字段验证器
<field name="username">
<field-validator type="requiredstring">
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="email">
<message>用户名必须邮箱账号!</message>
</field-validator>
</field>
校验动作类中的指定方法
只要把上面的校验文件名改成UserAction-user_add-validation.xml即可。
其中user_add匹配struts.xml文件中的user_*
xml校验配置文件名的写法
以下两种写法有共同的验证效果
<actionClass>-validation.xml
<actionClass>-<actionAlias>-validation.xml
我们可将常见(共同)的校验写在<actionClass>-validation.xml
中,更具体的上下文内容写在<actionClass>-<actionAlias>-validation.xml
中,
框架将验证这两个验证配置文件中可用的验证器。如果两个验证配置文件中定义了一样的验证器,那么当验证不通过时,将发现2个错误,这是由于struts2框架将合并发现在两个验证配置文件中的验证信息。
已定义的验证器
在com/opensymphony/xwork2/validator/validators/default.xml文件中定义。
包括:
- conversion validator
- date validator
- double validator
- email validator
- expression validator
- fieldexpression validator
- int validator
- regex validator
- required validator
- requiredstring validator
- short validator
- stringlength validator
- url validator
- visitor validator
- conditionalvisitor validator
Action类的验证器是怎样被找到
struts2框架将搜索action的继承树寻找这个action类默认校验的接口和父类。
总结
- 当用户按下注册表单提交按钮,Struts2将用户的输入传送到Action或javabean的实例字段。然后,Struts2会自动执行validate方法。如果有任何的if语句为真,Struts2将自动调用其addFieldError方法(我们的Action类继承扩展了ActionSupport)添加错误信息。
如果有任何错误已被添加那么Struts2将不会进行调用execute方法。Struts2框架将返回“input”作为调用Action后的结果。 - 形如UserAction-validation.xml验证文件必须和起动作类放在同一包下,否则不起作用。
- 当使用字段验证时,字段验证语法总是更可取比使用普通验证语法,因为它有利于根据字段字段校验分组。这是非常方便特别是如果一个字段需要有许多字段验证,这几乎总是如此。
- Action类中的validate方法优先于execute方法当被struts框架调用时,若验证出错,将返回“input”,如验证通过,则调用execute方法并返回execute方法的返回值。
以上。。。