Struts2的检证框架: 一,根据字段校验(为每一个action写一个配置文件以"Action类名"+"-validation.xml"): 二,根据XML的DTD写配置文件如: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <!-- 字段校验 --> <validators> <field name="username"> <!-- short-ciruit="true"表示短入,即username第一个校验(requiredstring)有失败信息就 不用进行第二个校验(stringlength) --> <field-validator type="requiredstring" short-circuit="true"> <param name="trim">true</param> <message>用户名不能为空!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>用户名长度必须在${minLength}与${maxLength}之间</message> </field-validator> </field> </validators> <validators> <!-- 非字段校验 --> <validator type="requiredstring"> <param name="fieldName">username</param> <message>用户名不能为空!</message> </validator> <validator type="stringlength"> <param name="fieldName">username</param> <param name="minLength">6</param> <parma name="maxLength">10</parma> <message>用户名长度必须在${minLength}与${maxLength}之间</message> </validator> </validators> 三,说明: 有了配置文件校验Struts2,若Action当中重写了validate方法则validate方法也会执行。 当校验字符串为非空则要用requiredstring,当校验非字符串为非空则要用required 在com.opensymphony.xwork2.validator.validators包中的default.xml中列出了所有的field-validator的Type,后面的class表为该校验的实现。 <param>标签的name属性为该实现类中的属性。 四,Struts2的客户端验证: 1,客户端form的主题(theme)一定不能设置为simple 2,将form的validate属性设置为true 3,Struts2的客户端验证会根据服务器端的xml产生JavaScript方法进行客户端验证。 4,Struts2有客户端验证的功能但是不推荐使用,不如自己写的客户端验证。 五,Struts2在的Action的另一个方法要校验 /** * 自己在Action中定义的另一个方法 * * @return * @throws Exception */ public String myRegister() throws Exception { return SUCCESS; } struts.xml中的配置 <action name="myRegister" class="com.mengya.action.RegisterAction" method="myRegister"> <result name="success">/show.jsp</result> <result name="input">/index.jsp</result> </action> 对于myRegister方法的校验则是:action的名称+"-"+方法名+"-"+validation.xml 六,多方法的校验的次序: 对于:Action中的myRegister方法我们写了RegisterAction-myRegister-validation.xml 那么myRegister方法它会进入RegisterAction-myRegister-validation.xml进行校验,然后进入RegisterAction-validation.xml进行校验, 若Action中的validation方法重写了那么还会进入到validation方法中进行校验。 故:若Action有多个方法则我们可以不写"Action名称"+"-validation.xml"页为每个方法写该方法的校验。 当Action如果存在继承的话校验次序更多,若RegisterAction继承了RegAction,RegAction中也有一个myRegister方法,那么对于RegisterAction的myRegister方法会先进入 RegAction-myRegister-validation.xml,然后是RegAction-validation.xml,然后是RegisterAction-myRegister-validation.xml再是RegisterAction-validation.xml 当然这种情况很少出现但是说明上面的关点:若Action有多个方法则我们可以不写"Action名称"+"-validation.xml"页为每个方法写该方法的校验。 执行了xml中的校验信息之后为执行action里面的validation方法里的校验信息。 七,field级别的Error(addFieldError)与Action级别的Error(addActionError) 真正存放field级别错误信息的对象是LinkedHashMap,该LinkedHashMap的key是String类型的,value是ArrayList类型的。 对于Action级别的错误信息,实际上是放置在ArrayList中的。 故对于同一个字段即在xml中配置了校验信息也在Action中的validation方法中添加校验信息则校验失败的话这两处的提示信息都为出现在页面中。 八,在Action中的validation方法中通过getFieldErrors()可返回field级别的Error信息的map对象,对该对象 进行添加error信息是没用的,它返回回来的只是原来field级别的Error信息的map对象的复本。 即getFieldErrors().put(key, value)是没有意义的,只能通过addFieldError(arg0, arg1)来添加校验提示信息。