第一種:重寫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" "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> <?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] <!-- 動態驗證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提示。