最近一直都研究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类:
- package cn.onlysoft.bookmark.form;
-
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts.action.ActionErrors;
- import org.apache.struts.action.ActionMapping;
- import org.apache.struts.validator.ValidatorForm;
-
- public class LoginForm extends ValidatorForm {
-
- private String password;
-
- private String username;
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
- return null;
- }
- }
以下是继承Action类的LoginAction类,用于处理业务逻辑:
java 代码
-
-
-
-
- package cn.onlysoft.bookmark.action;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
-
- import cn.onlysoft.bookmark.form.LoginForm;
-
- public class LoginAction extends Action {
-
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- LoginForm LoginForm = (LoginForm) form;
- return mapping.findForward("toLogin");
- }
- }
以下是struts-confit.xml文件中的部分配置:
xml 代码
- <form-beans >
- <form-bean name="LoginForm" type="cn.onlysoft.bookmark.form.LoginForm" />
-
- form-beans>
-
- <action-mappings >
- <action forward="/WEB-INF/jsp/index.jsp" path="/index" />
- <action
- attribute="LoginForm"
- input="/WEB-INF/jsp/login.jsp"
- name="LoginForm"
- path="/Login"
- scope="request"
- type="cn.onlysoft.bookmark.action.LoginAction">
- <forward name="toLogin" path="/WEB-INF/jsp/login.jsp" />
- <forward
- name="manage"
- path="/index.do"
- redirect="true" />
- action>
- action-mappings>
- <message-resources parameter="cn.onlysoft.bookmark.BookmarkResources" />
- <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
- <set-property property="stopOnFirstError" value="true" />
- <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
- plug-in>
以下是BookmarkResources.properties文件中的国际化资源配置:
LoginForm.username=username
LoginForm.password=password
errors.header=error message is:
errors.required={0}must not null
以下是validation.xml文件中的全部配置:
xml 代码
- <!---->xml version="1.0" encoding="gbk"?>
- "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
- "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
- <form-validation>
- <formset>
- <form name="LoginForm">
- <field property="username" depends="required,mask">
- <arg0 key="LoginForm.username"/>
- <msg key="errors.required" name="required"/>
- <var>
- <var-name>markvar-name>
- <var-value>^[a-zA-Z]+$var-value>
- var>
- field>
- <field property="password" depends="required">
- <arg0 key="LoginForm.password"/>
- field>
- form>
- formset>
- 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>