主要是關於Struts1.x中的<html:javascript>的使用,請看demo
首先是web.xml檔案
<?xml version="1.0" encoding="UTF-8"?><br /><web-app xmlns="http://java.sun.com/xml/ns/javaee"<br />xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"<br />xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><br /><servlet><br /><servlet-name>action</servlet-name><br /><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><br /><init-param><br /><param-name>config</param-name><br /><param-value>/WEB-INF/struts-config.xml</param-value><br /></init-param><br /><init-param><br /><param-name>debug</param-name><br /><param-value>3</param-value><br /></init-param><br /><init-param><br /><param-name>detail</param-name><br /><param-value>3</param-value><br /></init-param><br /><load-on-startup>0</load-on-startup><br /></servlet><br /><servlet-mapping><br /><servlet-name>action</servlet-name><br /><url-pattern>*.do</url-pattern><br /></servlet-mapping></p><p><welcome-file-list><br /><welcome-file>enter.jsp</welcome-file><br /></welcome-file-list><br /></web-app>
然後是使用了<html:javascript>標籤對錶單進行驗證的前台頁面enter.jsp
<%@ page language="java" pageEncoding="UTF-8"%><br /><%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%></p><p><!-- focus一般稱為聚焦或定位,需要給它一個action的名字。onsubmit中的this指定驗證的是當前表單 --><br /><html:form action="/enter" focus="enter" onsubmit="return validateEnterForm(this)"><br />uname : <html:text property="uname"/><br/><br />email : <html:text property="email"/><br/><br /><html:submit/><html:cancel/><br /></html:form></p><p><!-- 產生動態JavaScript指令碼。在formName中指定具體的FormBean名字 --><br /><html:javascript formName="enterForm"/></p><p><!--<br />===================================================================================================<br />【JavaScript】<br />Struts的前台驗證,使用方式,如下:<br />第一步:通過focus定位Action<br />第二步:產生動態JavaScript指令碼<br />第三步:當表單提交的時候,通過onsubmit=""指定所調用的函數,即第二步產生的函數<br />===================================================================================================<br />如果我們不知道第三步應該調用哪個函數的話,應該怎麼辦呢<br />我們可以在寫完第二步的時候,發布項目,然後調用enter.jsp頁面,接著再右鍵查看該頁面的源檔案<br />此時會發現enter.jsp開啟得比較慢。在其源檔案中自動產生了一段JavaScript指令碼,此即第二步執行後的效果<br />然後在JavaScript指令碼中出現一個驗證函式,名為validateEnterForm。該函數就是寫在onsubmit中的函數<br />===================================================================================================<br />如果使用的ActionForm屬於ValidatorForm子類,那麼此時的驗證是完全通過伺服器進行驗證的<br />若想在前台進行驗證,即在前台自動產生指令碼,就需要與前台頁面配合的Form是一個動態帶驗證的<br />所以此時用到的ActionForm需要是一個DynaValidatorForm類,並且它不是以JavaBean形式顯現出來的<br />即此時的DynaValidatorForm是不存在的,它是程式運行時動態產生的,並被描述在了struts-config.xml中<br />===================================================================================================<br />【補充】<br />經個人測試:如果此時沒有在validation.xml中對該頁面表單欄位進行驗證配置<br />經個人測試:那麼應用運行時,會報告如下錯誤<br />經個人測試:javax.servlet.jsp.JspException: No form found under 'enterForm' in locale 'zh_CN'<br />我的理解為:Struts可以動態建立對應於前台表單的JavaScript指令碼,該指令碼用來驗證前台表單欄位的合法性<br />我的理解為:而我們只需要在validation.xml中為該表單欄位提供某些描述資料,然後就可以直接進行驗證了<br />我的理解為:但請注意,若想讓前台自動產生指令碼,那麼與前台頁面對應的Form就需要是一個DynaValidatorForm<br />===================================================================================================<br />【歡迎來拍磚】<br />如果這裡關於Struts1.x的前台驗證,說的有不對的地方,歡迎廣大網友,不吝指正,謝謝!!<br />===================================================================================================<br />-->
然後是驗證成功後的enterSuccess.jsp頁面
<%@ page pageEncoding="UTF-8"%><br /><%@ page import="org.apache.struts.validator.DynaValidatorForm"%><br /><%<br />DynaValidatorForm vff = (DynaValidatorForm)session.getAttribute("enterForm");<br />%><br /><font color="blue"><%=vff.get("uname")%></font>,登入成功
然後是Struts1.x的核心設定檔struts-config.xml
<?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"<br />"http://struts.apache.org/dtds/struts-config_1_2.dtd"><br /><struts-config><br /><form-beans><br /><form-bean name="enterForm" type="org.apache.struts.validator.DynaValidatorForm"><br /> <!-- 指定該動態可驗證的Form中的兩個屬性 --><br /> <form-property name="email" type="java.lang.String" /><br /> <form-property name="uname" type="java.lang.String" /><br /> <!-- 這樣的Form有一個優點:它不是當程式啟動並執行時候,即時產生出來一個對象注入到記憶體裡的 --><br /> <!-- 而是當我們用到的時候,它才動態產生。所以它的開銷會小一點。但啟動並執行速度會慢一點 --><br /> </form-bean><br /></form-beans></p><p><action-mappings><br /><action path="/enter"<br /> attribute="enterForm"<br /> name="enterForm"<br /> input="/enter.jsp"<br /> type="com.jadyer.action.EnterAction"><br /> <forward name="enterSuccess" path="/enterSuccess.jsp" redirect="true" /><br /></action><br /></action-mappings></p><p><message-resources parameter="com.jadyer.util.ApplicationResources" /></p><p><!-- 此時需要將validator-rules.xml和validation.xml檔案在WebRoot//WEB-INF//目錄下 --><br /><!-- 其中validator.xml是我們自己編寫的,而validator-rules.xml是由Struts1.x提供的 --><br /><!-- 在Struts1.2中,validator-rules.xml位於//WebRoot//WEB-INF根目錄中 --><br /><!-- 在Struts1.3中,validator-rules.xml位於struts-core-1.3.8.jar中的org.apache.struts.validator包中 --><br /><!-- 然後將validator-rules.xml另存新檔validation.xml,並將該檔案第12行<plug-in>拷貝到struts-config.xml中 --><br /> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"><br /> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/><br /> </plug-in><br /></struts-config>
接著是我們自訂的validation.xml檔案
<!DOCTYPE form-validation PUBLIC<br /> "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"<br /> "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"><br /><form-validation><br /><formset><br /><!-- 注意:這裡需要提供對enterForm的驗證,否則enter.jsp中指定的<html:javascript>驗證,仍然無效 --><br /><form name="enterForm"><br /><field property="uname" depends="required,mask"><br /><arg0 key="輸入的使用者名稱" resource="false"/><br /><var><br /><var-name>mask</var-name><br /><var-value>[A-Za-z]</var-value><br /></var><br /></field><br /><field property="email" depends="required,email"><br /><arg0 key="lab.email"/><br /></field><br /></form><br /></formset><br /></form-validation>
然後是用到的Action處理類
package com.jadyer.action;</p><p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.validator.DynaValidatorForm;</p><p>public class EnterAction extends Action {<br />public ActionForward execute(ActionMapping mapping, ActionForm form,<br />HttpServletRequest request, HttpServletResponse response) {<br />DynaValidatorForm EnterForm = (DynaValidatorForm) form;</p><p>//擷取並輸出DynaValidatorForm中的值<br />//這裡uname對應的是enter.jsp中的<html:text property="uname"/><br />System.out.println("uname:" + EnterForm.get("uname"));<br />System.out.println("email:" + EnterForm.get("email"));</p><p>return mapping.findForward("enterSuccess");<br />}<br />}
最後是用到的國際化資源檔ApplicationResources.properties
lab.name = Name<br />lab.email = Email</p><p>errors.required = {0} is required<br />errors.invalid = {0} is invalid<br />errors.email = {0} is an invalid e-mail address</p><p>#下面的是ApplicationResources_zh_CN.properties檔案的內容</p><p>lab.name = /u59D3/u540D<br />lab.email = /u7535/u5B50/u90AE/u4EF6</p><p>errors.required = {0} /u4E0D/u80FD/u4E3A/u7A7A<br />errors.invalid = {0} /u8F93/u5165/u7684/u5185/u5BB9/u4E0D/u5408/u7406<br />errors.email = {0} /u4E0D/u662F/u5408/u6CD5/u7684Email/u5730/u5740