在上节讨论过了,类型转换的原理,关键是这些操作都是在交给Action之前,被拦截器拦下后添加的操作,今天的校验器也是如此,下面介绍原理:

   1、前台表单提交;

   2、web.xml中过滤器,拦截请求,读取struts.xml文件;

   3、找到请求相应的Action,准备将请求转发给Action;

   4、被struts2的拦截器拦下;

   5、按照strust.xml文件中的配置,检查是否有属性文件的配置;

   6、struts去项目中的相应目录下,寻找属性文件;

   7、如果找到了符合类型转换的属性文件,表明该项目使用了自定义的类型转换;

   8、struts便去寻找相应的类型转换器,进行类型的转化;如果没有,就使用struts默认的类型转化;

   9、如果找到了符合校验器的属性文件或者xml文件;表明该项目使用了struts的校验器;因为struts的校验器,使用起来很方便了,能够满足大多数的需求;自定义的情况不多;

   10、如果在struts.xml同一目录下找到了validators.xml文件,表明该项目使用自定义的校验器;

  下面讲解使用校验器的具体过程:

(1)、最基本的校验器使用:

     前台JSP文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%><%    String path = request.getContextPath();    String basePath = request.getScheme() + "://"            + request.getServerName() + ":" + request.getServerPort()            + path + "/";%>                    My JSP 'basic-validation.jsp' starting page        

对应的Action文件:

package struts.validation;import java.util.Date;import com.opensymphony.xwork2.ActionSupport;public class BasicValidationAction extends ActionSupport {    private static final long serialVersionUID = 1L;    private String username;    private String password;    private int gender;    private int age;    private Date birthDate;    private String tel;    private String email;    private String url;                                                                                                                                                                                    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 int getGender() {        return gender;    }    public void setGender(int gender) {        this.gender = gender;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Date getBirthDate() {        return birthDate;    }    public void setBirthDate(Date birthDate) {        this.birthDate = birthDate;    }    public String getTel() {        return tel;    }    public void setTel(String tel) {        this.tel = tel;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    public String getUrl() {        return url;    }    public void setUrl(String url) {        this.url = url;    }    @Override    public String execute() throws Exception {        System.out.println("gender is "+gender);        return SUCCESS;    }                                                                                                                                                                                    public String login(){        return SUCCESS;    }}

校验器:注意文件名(Action类型-validation.xml)

username
true
${getText("user.username.required")}
username
${getText("user.username.regex")}
password
true
${getText("user.password.required")}
password
${getText("user.password.regex")}
age
1
130
${getText("user.age")}

使用的国际化的一些资源文件:

xwork.default.invalid.fieldvalue=globalMessage----{0}\u5B57\u6BB5\u65E0\u6548user.username.required=globalMessage----\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7Auser.username.regex=globalMessage----\u7528\u6237\u540D\u8F93\u5165\u4E0D\u5408\u6CD5\uFF0C\u5FC5\u987B\u4E3A\u957F\u5EA6\u4E3A5~50\u4E4B\u95F4\u7684\u5B57\u6BCD\u6216\u6570\u5B57user.password.required=globalMessage----\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7Auser.password.regex=globalMessage----\u5BC6\u7801\u8F93\u5165\u4E0D\u5408\u6CD5\uFF0C\u5FC5\u987B\u4E3A\u957F\u5EA6\u4E3A5~50\u4E4B\u95F4\u7684\u5B57\u6BCD\u6216\u6570\u5B57user.age=globalMessage----\u5E74\u9F84\u5FC5\u987B\u5728${min}\u548C${max}\u4E4B\u95F4\!user.birthDate=globalMessage----\u51FA\u751F\u65E5\u671F\u8F93\u5165\u4E0D\u5408\u6CD5user.email=globalMessage----Email\u5730\u5740\u8F93\u5165\u4E0D\u5408\u6CD5user.url=globalMessage----\u4E2A\u4EBA\u9996\u9875\u8F93\u5165\u4E0D\u5408\u6CD5

既然使用资源文件,在struts.xml文件中应该用:

<constant name="struts.custom.i18n.resources" value="globalMessages" />

本例子中资源文件的名字:globalMessages_zh_CN.properties;注意value的值;

这样最基本的校验便可以实现;注意校验的文件XXX.xml与action是同一个目录;