论坛首页 Java企业应用论坛

关于使用commons-validator.jar的校验问题

浏览 7461 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-26  

最近一直都研究struts中的commons-validator.jar的表单验证。但我是从ActionForm中的代码修改转换成使用validation.xml验证方式的。。可是转换过程中确出现了一个问题,就是表单没有进行验证和不出现验证出错信息。

我的数据库里面只有2个表:

bm_user(id,uname,password)

bm_bookmark(id,mark_name,mark_url,mark_desc,user_id)

以下是转换ValidatorForm后的LoginForm类:

  1. package cn.onlysoft.bookmark.form;      
  2.      
  3. import javax.servlet.http.HttpServletRequest;      
  4. import org.apache.struts.action.ActionErrors;      
  5. import org.apache.struts.action.ActionMapping;      
  6. import org.apache.struts.validator.ValidatorForm;      
  7.      
  8. public class LoginForm extends ValidatorForm {      
  9.      
  10.     private String password;      
  11.      
  12.     private String username;      
  13.      
  14.     public String getPassword() {      
  15.         return password;      
  16.     }      
  17.      
  18.     public void setPassword(String password) {      
  19.         this.password = password;      
  20.     }      
  21.      
  22.     public String getUsername() {      
  23.         return username;      
  24.     }      
  25.      
  26.     public void setUsername(String username) {      
  27.         this.username = username;      
  28.     }   
  29.   
  30.     public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){   
  31.         return null;   
  32.    }   
  33. }    

 

以下是继承Action类的LoginAction类,用于处理业务逻辑:

java 代码
  1. /*  
  2.  * Generated by MyEclipse Struts  
  3.  * Template path: templates/java/JavaClass.vtl  
  4.  */  
  5. package cn.onlysoft.bookmark.action;   
  6.   
  7. import javax.servlet.http.HttpServletRequest;   
  8. import javax.servlet.http.HttpServletResponse;   
  9. import org.apache.struts.action.Action;   
  10. import org.apache.struts.action.ActionForm;   
  11. import org.apache.struts.action.ActionForward;   
  12. import org.apache.struts.action.ActionMapping;   
  13.   
  14. import cn.onlysoft.bookmark.form.LoginForm;   
  15.   
  16. public class LoginAction extends Action {   
  17.   
  18.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
  19.             HttpServletRequest request, HttpServletResponse response) {   
  20.         LoginForm LoginForm = (LoginForm) form;   
  21.         return mapping.findForward("toLogin");   
  22.     }   
  23. }  

 

以下是struts-confit.xml文件中的部分配置:

xml 代码
  1. <form-beans >  
  2.     <form-bean name="LoginForm" type="cn.onlysoft.bookmark.form.LoginForm" />  
  3.   
  4.   form-beans>  
  5.   
  6. <action-mappings >  
  7.     <action forward="/WEB-INF/jsp/index.jsp" path="/index" />  
  8.     <action  
  9.       attribute="LoginForm"  
  10.       input="/WEB-INF/jsp/login.jsp"  
  11.       name="LoginForm"  
  12.       path="/Login"  
  13.       scope="request"  
  14.       type="cn.onlysoft.bookmark.action.LoginAction">  
  15.       <forward name="toLogin" path="/WEB-INF/jsp/login.jsp" />  
  16.       <forward  
  17.         name="manage"  
  18.         path="/index.do"  
  19.         redirect="true" />  
  20.     action>  
  21.   action-mappings>  
  22. <message-resources parameter="cn.onlysoft.bookmark.BookmarkResources" />  
  23.   <plug-in className="org.apache.struts.validator.ValidatorPlugIn">  
  24.     <set-property property="stopOnFirstError" value="true" />  
  25.     <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />  
  26.   plug-in>  

 

以下是BookmarkResources.properties文件中的国际化资源配置:

LoginForm.username=username
LoginForm.password=password
errors.header=error message is:
errors.required={0}must not null

以下是validation.xml文件中的全部配置:

xml 代码
  1. <!---->xml version="1.0" encoding="gbk"?>  
  2.           "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"   
  3.           "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">  
  4. <form-validation>  
  5.     <formset>  
  6.         <form name="LoginForm">  
  7.             <field property="username" depends="required,mask">  
  8.                 <arg0 key="LoginForm.username"/>  
  9.                 <msg key="errors.required" name="required"/>  
  10.                 <var>  
  11.                     <var-name>markvar-name>  
  12.                     <var-value>^[a-zA-Z]+$var-value>  
  13.                 var>  
  14.             field>  
  15.             <field property="password" depends="required">  
  16.                 <arg0 key="LoginForm.password"/>  
  17.             field>  
  18.         form>  
  19.     formset>  
  20. form-validation>  

 

以下是login.jsp中的部分struts标签代码:

<html:form action="/Login"> <!--
<html:form action="/Login" >
   用户 : <html:text property="username"/><br/>
   密码: <html:text property="password"/><br/>
   <html:submit>提交</html:submit> <html:cancel>取消</html:cancel>
</html:form>
<html:errors/>--> </html:form> <html:form action="/Login">
</html:form>

从以上的代码配置来看,是没什么问题的,例如login.jsp、validation.xml、struts-config.xml都没问题,搞了半天,还是搞不出为什么无法实现表单的验证,就是将用户和密码的必填验证,而且还不输入验证失败的错误。

后来想了一下,记得书上说过有一个问题就是,如果使用这种commons-validator.jar验证的话,form-bean的类里面,不需要覆盖父类中的validate方法,而我却在LoginForm里面覆盖了validate这个方法,并且返回null值,也就是说验证通过或者不需要验证,因此,validation.xml里面的验证也就没效。

唉,搞了半天原来是这个错误。。

希望struts初学者要谨记这种错误的存在!!

<html:errors> </html:errors>

   发表时间:2007-07-26  
If you want to do some special validation in the method validate(), you should invoke the super.validate(mapping,request).

For example:

    public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){    
        ActionErrors errors=super.validate(mapping,request); 

        // do your validation and add the error message to errors.

        return errors;    
   }    



That's ok 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics