欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struts静态动态ActionForm使用 —验证

程序员文章站 2022-04-15 13:01:52
 第一种:重写ActionForm的validate方法。        在actionForm中需要验证的都是表单的验证而非...
 第一种:重写ActionForm的validate方法。

  

    在actionForm中需要验证的都是表单的验证而非业务的验证。比如用户名非空,密码为数字,日期为时间格式等等。在validate方法中,返回ActionErrors信息,然后在错误页打印错误信息。

    [html]  

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;  

}  

 

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] 

<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>  

 

<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] 

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

    <message-resources parameter="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]  

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

    <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>  

 

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

    <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] 

<?xml version="1.0" encoding="UTF-8" ?>  

  

<!DOCTYPE form-validation PUBLIC  

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

          "https://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>  

 

<?xml version="1.0" encoding="UTF-8" ?>

 

<!DOCTYPE form-validation PUBLIC

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

          "https://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]  

<!--     动态验证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>  

 

<!-- 动态验证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] 

<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/>  www.2cto.com

  </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提示。