struts静态动态ActionForm使用(二)

struts静态动态ActionForm使用(二)―验证


登录例子

区别

时间属性

验证机制

   这篇博客主要介绍使用struts框架常用的验证方式。
第一种:重写ActionForm的validate方法。    在actionForm中需要验证的都是表单的验证而非业务的验证。比如用户名非空,密码为数字,日期为时间格式等等。在validate方法中,返回ActionErrors信息,然后在错误页打印错误信息。 [html] view plain copy print ?
  1. public ActionErrors validate(ActionMapping mapping,  

  2.        HttpServletRequest request) {  


  3.  ActionErrors errors=new ActionErrors();  

  4.  if(username==null||"".equals(username)){  

  5.     errors.add(username, new ActionMessage("error.username",username));  

  6.  }  

  7.  if(password==null || "".equals(password)){  

  8.      errors.add("password",new ActionMessage("error.password",password));  

  9.  }  

  10.  if(!(birthday instanceof Date)){  

  11.      errors.add("birthday",new ActionMessage("error.birthday",birthday));  

  12.  }  


  13.  return errors;  

  14. }  

public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {  ActionErrors errors=new ActionErrors();  if(username==null||"".equals(username)){ errors.add(username, new ActionMessage("error.username",username));  }  if(password==null || "".equals(password)){  errors.add("password",new ActionMessage("error.password",password));  }  if(!(birthday instanceof Date)){  errors.add("birthday",new ActionMessage("error.birthday",birthday));  }  return errors;}

     代码解释:      使用这种ActionForm再带的验证方式,在配置文件中需要设置此action的validate属性为true,并且也要设置出现错误返回的错误页input属性。      struts-config.xml中action的配置如下: [html] view plain copy print ?
  1. <action-mappings>

  2. <actionpath="/login"type="com.login.LoginAction"name="loginForm"

  3. scope="request"input="/login/error.jsp"validate="true">

  4. <forwardname="success"path="/login/success.jsp"></forward>

  5. <forwardname="false"path="/login/false.jsp"></forward>

  6. </action>

  7. </action-mappings>

<action-mappings><action path="/login" type="com.login.LoginAction" name="loginForm"scope="request" input="/login/error.jsp" validate="true"><forward name="success" path="/login/success.jsp"></forward><forward name="false" path="/login/false.jsp"></forward></action></action-mappings>

    其中为了把错误显示出来,我们使用资源文件方式。     在validate方法中,new ActionMessage("error.birthday",birthday)中的"error.birthday"是资源文件的key值。     配置文件中加载资源文件:   [html] view plain copy print ?
  1. <!--     加载资源文件 -->

  2. <message-resourcesparameter="MessageResources"/>

<!-- 加载资源文件 -->    <message-resources parameter="MessageResources" />

    注意资源文件放在src下。若是放在WebContent目录或web-inf下,则不会提示相应的错误信息。即使不报错。     并且上述的日期,其中使用Register注册了,上篇博客已经介绍,在此不再过多介绍。     这个action自带的验证的demo已经上传。点我下载。

第二种:使用validator框架。     其中validate验证,主要是由commons-validator.jar包。     那如何使用validator框架呢?     1.actionForm使用validator框架。       首先:编写actionForm       注意此时的actionForm不是继承ActionForm,而是继承ValidatorForm。       其中actionform中只有getset方法       其次:编写配置文件struts-config.xml中,加载验证插件以及使用资源文件。     [html]view plaincopyprint?

  1. <!--     加载资源文件 -->

  2. <message-resourcesparameter="MessageResources"/>

  3. <!--     验证插件 -->

  4. <plug-inclassName="org.apache.struts.validator.ValidatorPlugIn">

  5. <set-property

  6. property="pathnames"

  7. value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>

  8. </plug-in>

<!-- 加载资源文件 -->    <message-resources parameter="MessageResources" /><!--     验证插件 -->  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">    <set-property        property="pathnames"        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>  </plug-in>
      其中,validator-rules.xml是公共的。而这个validation.xml是需要程序员编写。      然后:编写validation.xml验证信息。   [html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="UTF-8"?>


  2. <!DOCTYPE form-validation PUBLIC  

  3.          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"  

  4.          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">


  5. <form-validation>

  6. <formset>

  7. <!--        form 的name必须与struts-config中名称一致 -->

  8. <formname="loginForm">

  9. <fieldproperty="username"depends="required">

  10. <!-- key值必须与资源文件中名称一致 -->

  11. <argkey="error.username"/>

  12. </field>


  13. <fieldproperty="password"depends="required">

  14. <argkey="error.password"/>

  15. </field>


  16. <fieldproperty="birthday"depends="date">

  17. <argkey="error.birthday"/>

  18. </field>

  19. </form>

  20. </formset>

  21. </form-validation>

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE form-validation PUBLIC          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"><form-validation>    <formset><!--        form 的name必须与struts-config中名称一致 -->        <form name="loginForm">            <field property="username"  depends="required">                   <!-- key值必须与资源文件中名称一致 -->                    <arg key="error.username"/>            </field>                <field property="password" depends="required">                    <arg key="error.password"/>            </field>                        <field property="birthday" depends="date">                 <arg key="error.birthday"/>            </field>           </form>    </formset></form-validation>
    formset可以包含多个form,并且form中需要验证的属性使用field标签。其中depends依赖验证规则的中的信息validator-rules.xml中的规则。比如:required,要求必填,date,日期格式,long,byte,mask正则等等。     其中的key值必须与资源文件的key一致。如第一种方法。    2.动态actionform使用validator框架。     动态的actionform在上篇博客已经介绍。在1的基础上,只改一下struts-config.xml配置文件中的动态actionform [html] view plain copy print ?
  1. <!--     动态验证form -->

  2. <form-beans>

  3. <form-beanname="loginForm"type="org.apache.struts.validator.DynaValidatorForm">

  4. <form-propertyname="username"type="java.lang.String"></form-property>

  5. <form-propertyname="password"type="java.lang.String"></form-property>

  6. <form-propertyname="birthday"type="java.util.Date"></form-property>


  7. </form-bean>

  8. </form-beans>

<!-- 动态验证form -->    <form-beans>      <form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">        <form-property name="username" type="java.lang.String"></form-property>        <form-property name="password" type="java.lang.String"></form-property>        <form-property name="birthday" type="java.util.Date"></form-property>            </form-bean>    </form-beans>
     其他的不用改变。      但是需要注意的是:使用validator框架的动态actionform的type类型是:DynaValidatorForm而不是DynaActionForm    3.应用在客户端,使用js提示。      在1的基础上只改一个login.jsp其他的不用改。      添加onsumit,并且添加个html:javascript标签     [html] view plain copy print ?
  1. <html:javascriptformName="loginForm"/>

  2. <html:formaction="login.do"onsubmit="return validateLoginForm(this)">

  3.      username : <html:textproperty="username"/><br/>

  4.      password : <html:passwordproperty="password"/><br>

  5.      birthday: <html:textproperty="birthday"></html:text>

  6. <html:submit/>

  7. </html:form>

<html:javascript formName="loginForm"/> <html:form action="login.do" onsubmit="return validateLoginForm(this)">    username : <html:text property="username"/><br/>   password : <html:password property="password"/><br>   birthday: <html:text property="birthday"></html:text>   <html:submit/>  </html:form>
   需要注意的是:其中action不能使用"../",否则提示错误。    并且并不是所有的服务器校验都可以转化成客户端的js提示,其中日期的合法性验证,就不能转化成客户端js提示。    其中第二种方式的验证demo例子: 点我下载
   其中日期验证的测试  问题总结。   上述的demo中测试日期,验证规则使用的date关键字   1.因为默认的是java.sql.Date,若代码中使用的java.util.Date的类型,但是没有注册register,即使使用默认的yyyy-MM-dd格式,则也会报错。      若是注册register,界面使用yyyy-MM-dd默认格式,则成功,如使用yyyy/MM/dd格式【自己手写的转换类的时间格式】,则提示validator验证失败。    2.若代码中使用的java.sql.Date类型。没有注册register,使用默认yyyy-MM-dd格式,则成功。界面输入yyyy/MM/dd格式,则不能验证,报错。       若注册register,界面输入yyyy/MM/dd格式,也不能验证,报错。       3.如果birthday的验证规则是requried,date,则出现的现象是:若注册了,并且时间转换类中是yyyy/MM/dd格式,若界面输入yyyy/MM/dd格式,则validator验证的日期不一致。若输入其他的格式,比如yyyy-MM-dd格式,则提示requried


你可能感兴趣的:(struts静态动态ActionForm使用(二))