1. Struts2中的输入校验
2. 编码方式校验
1) Action一定要继承自ActionSupport
2) 针对某个要进行校验的请求处理方法编写一个 public void validateXxx()方法,在方法内部进行表单数据校验.
3) 也可针对所有的请求处理方法编写public void validate()方法。
4) 在校验方法中,可以通过addFieldError()方法来添加字段校验错误消息。
5) 当校验失败时,Struts框架会自动跳转到name为input的Result页面。在校验失败页面中,可以使用
6) 简单,灵活。但重用性不高。
3. XML配置方式校验。在编码方式之前被执行。
1) 针对要校验的Action类,在同包下编写一个名为:Action类名-validation.xml校验规则文件。
2) 在校验规则文件中添加校验规则:具体的校验器名,参数可参看Struts2的reference或Struts2的API。
a) Field校验:针对Action类中每个非自定义类型的Field进行校验的规则。
值
b) 非Field校验:针对Action类的某些Field使用OGNL表达进行组合校验。
pwd
pwd2
c) visitor校验:主要是用来校验Action类中的自定义类型Field。(针对使用模型驱动方式时)
i) 在Action类的的校验规则文件中针对自定义类型Field使用visitor校验规则。
userContext
true
ii) 针对visitor的Field编写一个校验规则文件.文件名为: visitor字段类型名[-visitor校验的上下文名]-validation.xml. 例如: 本例中的文件名为User-userContext-validation.xml
注意: 此文件要存放到visitor字段类型所在的包下.
iii) 在visitor的Field校验规则文件中针对要校验的Field添加校验规则.
3) 在校验失败页面(名为input的result页面)中,可以使用
4) 默认情况下,XML的校验规则对Action中所有的请求处理方法生效.此时应该只针对每个要校验的请求处理方法指定校验。有两种方式:
i) 只为Action中的指定方法指定校验规则文件,配置文件命名为:Action类型名-别名-validation.xml,
别名是要校验的方法对应的Action标签的name属性值。
如:UserAction在struts2.xml的配置为:
● UserAction中有registe方法和login方法,要对registe方法进行校验,则它的校验规则文件名为:UserAction-user_registe-validation.xml。
● 如果使用visitor校验器,必需指定visitor校验的上下文名。
ii) 在校验拦截器中指定要验证的方法。不太实用。
*
regist
5) 同时使用客户端校验和服务器端校验
i) 设置
false:默认值。校验框架只执行服务器端校验。
true:先执行客户端校验,然后再执行服务器端校验。
form标签会根据你在服务器端配置的验证规则生成对应的JavaScript验证代码。
目前支持的内置校验器:required、requiredstring、stringlength、regex validator、email、url、int、double
ii) 不太好用,不建议使用。建议使用jQuery进行页面表单校验。
6) 自定义校验器:
i) 继承自FieldValidatorSupport抽象类。重写validate(Object obj)方法
ii) 注册校验器类. 在应用程序的classpath下新建一校验器注册文件。名为validators.xml,内容如下:
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"
4. Annotation方式校验: Struts2提供了注解的方式校验
1) @Validation 指明这个类或者接口将使用基于注解的校验。Struts2.1中已被标识为过时。
2) @Validations() 在同一个方法上要使用多个注解校验时。
3) @SkipValidation 指定某个方法不需要校验。否则所有方法都会使用校验。也可以在检验拦截器中使用validateAnnotatedMethodOnly
4) 13个内置校验器的注解版本:(注:这些注解都只能用在方法级别上) 具体参数参见Struts2的API或Reference。
@RequiredFieldValidator
@RequiredStringValidator
@StringLengthFieldValidator
@IntRangeFieldValidator
@DoubleRangeFieldValidator
@DateRangeFieldValidator
@ExpressionValidator
@FieldExpressionValidator
@RegexFieldValidator
@EmailValidator
@UrlValidator
@VisitorFieldValidator
@ConversionErrorFieldValidator
acc_registe.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2中基于XML配置式的校验器使用示例
XML配置式校验器---注册页面
src/struts.xml
/info.jsp
/acc_{1}.jsp
package com.javacrazyer.web.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class AccountAction extends ActionSupport {
private static final long serialVersionUID = -1418893621512812472L;
private Integer id;
private String name;
private String pwd;
private String pwd2;
private Double score;
private Date registed_date;
private String email;
public String registe() throws Exception{
System.out.println("registe-------------------");
return SUCCESS;
}
public String login()throws Exception{
return SUCCESS;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public Date getRegisted_date() {
return registed_date;
}
public void setRegisted_date(Date registedDate) {
registed_date = registedDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPwd2() {
return pwd2;
}
public void setPwd2(String pwd2) {
this.pwd2 = pwd2;
}
}
ID必填的
20
50
ID必须在 ${min} 到 ${max} 之间
姓名是必填的
姓名不合法
密码是必填的
pwd
pwd2
确认密码和密码输入不一致
0.0
100.0
成绩必须在${minInclusive}和${maxInclusive}之间
邮箱不合法
1970-01-01
2019-01-01
注册日期不合法
user_login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2中基于XML配置式的校验器使用示例
XML配置式校验器---登录页面
user_registe.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2中基于XML配置式的校验器使用示例
XML配置式校验器---注册页面
src/struts.xml
/info.jsp
/user_{1}.jsp
package com.javacrazyer.web.action;
import com.javacrazyer.domain.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private static final long serialVersionUID = -2554018432709689579L;
private User user; //自定义类型Field
public String registe() throws Exception{
System.out.println("registe======================");
return SUCCESS;
}
public String login() throws Exception{
return SUCCESS;
}
/*
public void validate(){
System.out.println("调用validate方法");
}
//执行exceute方法前调用
public void validateRegiste(){
System.out.println("调用validateRegiste方法");
String lname = user.getLoginname();
if(null != lname && !lname.trim().matches("[a-zA-Z_]\\w{3,19}")){
this.addFieldError("loginname", "用户名不能为空,且只能由4-20个字母和数字组成");
//this.addActionError("用户名不能为空,且只能由4-20个字母和数字组成");
}
}
public void validateLogin(){
System.out.println("调用validateLogin方法");
}
*/
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
UserAction-user_login-validation.xml
用户的信息必填
userLoginContext
true
用户的
用户的信息必填
userContext
true
用户的
第三个示例:注解方式校验器---注册页面<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2中基于Annotation配置式的校验器使用示例
Annotation配置式校验器---注册页面
/info.jsp
/acc2_{1}.jsp
package com.javacrazyer.web.action;
import java.util.Date;
import org.apache.struts2.interceptor.validation.SkipValidation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator;
import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;
/**
* 使用注解来配置校验的示例
*
*/
public class Account2Action extends ActionSupport {
private static final long serialVersionUID = -1418893621512812472L;
private Integer id;
private String name;
private String pwd;
private String pwd2;
private Double score;
private Date registed_date;
private String email;
@Validations(
requiredStrings={@RequiredStringValidator(fieldName="name",message="我的用户名是必须的",shortCircuit=true,trim=true,type=ValidatorType.FIELD),
@RequiredStringValidator(fieldName="pwd",message="我的密码是必须的",shortCircuit=true,trim=true,type=ValidatorType.FIELD)},
fieldExpressions={@FieldExpressionValidator(fieldName="pwd", message="两次密码不相同",expression="pwd==pwd2")},
regexFields={@RegexFieldValidator(expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\\.com)|(\\.cn)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$")}
)
public String registe() throws Exception{
System.out.println("registe-------------------");
return SUCCESS;
}
@SkipValidation
public String login()throws Exception{
return SUCCESS;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public Date getRegisted_date() {
return registed_date;
}
public void setRegisted_date(Date registedDate) {
registed_date = registedDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPwd2() {
return pwd2;
}
public void setPwd2(String pwd2) {
this.pwd2 = pwd2;
}
}