ActionForm类及表单数据验证
生活随笔
收集整理的這篇文章主要介紹了
ActionForm类及表单数据验证
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Struts的中央控制器中寫了Struts的控制器角色,在這篇介紹下Struts的視圖!
Struts的視圖組件:
Struts框架中的視圖組件主要包括:
JSP頁面。
ActionForm類。
Struts自定義標記。
消息資源。
其中, ActionForm類是Struts框架的核心組件之一,是Struts的關鍵視圖組件。在這篇文章中,將討論 ActionForm類及其作用。
ActionForm的作用機理:
ActionForm本質上是一種JavaBean,是專門用來傳遞表單數據的DTD(Data Transfer Object,數據傳遞對象)。它包括用于表單數據驗證的validate()方法和用于數據復位的reset()方法。
Struts 框架利用 ActionForm對象來臨時存放視圖頁面中的表單數據。例如,一個登錄頁面會有一個用戶名輸入框和一個密碼輸入框,以及用來提交登錄請求的按扭。當用戶提交登錄請求后,Struts將用戶名和密碼兩個輸入域的數據自動填充到相應的 ActionForm對象中,然后控制層可以從該 ActionForm對象中讀取用戶輸入的表單數據,也可以把來自模型層的數據存放到 ActionForm中,然后返回給視圖顯示。
ActionForm有(request)和 (session)兩種作用域(scope)。如果 ActionForm的作用域設定為request, ActionForm實例將保存在request 對象中,像其他保存在request對象中的屬性一樣,僅在當前請求范圍內有效。如果 ActionForm的作用域設定為session,那么 ActionForm實例將被保存在session對象中,同一個 ActionForm實例在整個HTTP會話中有效。
在Struts框架 中, ActionForm的作用機理如下圖:
當驗證 ActionForm時,如果檢測到一個或多個驗證錯誤,Struts框架會把錯誤轉發回配置文件struts-config.xml中<action>元素的input屬性所指定的輸入頁面。
ActionForm的使用方法:
下面通過在(Struts重構)構建一個簡單的基于MVC模式的JavaWeb的例子,來介紹一下 ActionForm的正確使用,包括如何創建,配置和訪問。
1.創建 ActionForm
可以擴展Struts軟件包的 ActionForm類來創建具體的 ActionForm。Struts軟件包中的 ActionForm類本身是一個抽象類,在擴展的時候,為每一個要從HTML表單中捕獲的輸入域定義一個屬性,使表單輸入域與 ActionForm屬性一一對應,以使 ActionForm能夠捕獲需要的表單輸入。定義了具體的屬性,就可以覆蓋父類的validate()和reset()方法,來實現具體的 ActionForm驗證規則和初始化方法。
下面是我在(Struts重構)構建一個簡單的基于MVC模式的JavaWeb里面的例子
/**//*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action. ActionForm;
import org.apache.struts.action.ActionMapping;
/** *//**
* Struts框架的 ActionForm對象,它可用來在用戶和業務層之間輿用戶的輸入數據。
* ActionForm也叫FormBean.Struts框架會自動從請求中懼輸入數據,再將 這些
* 數據交給一個使用FormBean的Action對象,接著FormBean可以再交給業務層
*/
public class LoginHandlerForm extends ActionForm {
??? /**//*
???? * Generated fields
???? */
??? /** *//** userName property */
??? private String userName;
??? /** *//** userPwd property */
??? private String userPwd;
??? //驗證方法,主要用于驗證視圖上的數據,例如非空之類,
??? //如果要進行業務驗證,則應該在Action中進行!
??? public ActionErrors validate(ActionMapping mapping,
??????????? HttpServletRequest request) {
???????
??????? return null;
??? }
??? //初始化首先調用的方法
??? public void reset(ActionMapping mapping, HttpServletRequest request) {
??????? // TODO Auto-generated method stub
??? }
??? public String getUserName() {
??????? return userName;
??? }
??? public void setUserName(String userName) {
??????? this.userName = userName;
??? }
???
??? public String getUserPwd() {
??????? return userPwd;
??? }
??? public void setUserPwd(String userPwd) {
??????? this.userPwd = userPwd;
??? }
}
在以上的loginActionForm中,validate()方法和reset()方法是 ActionForm中兩種可以覆蓋的方法。validate()方法中定義具體的 ActionForm驗證規則。
2.配置 ActionForm
每創建一個 ActionForm類,就需要在Struts的配置文件中配置這個類。如上的類配置如下:
<form-beans >
??? <form-bean name="loginHandlerForm" type="struts.form.LoginHandlerForm" />
? </form-beans>
<form-beans>元素用來指定全體 ActionForm的配置,一個Struts應用所有的 ActionForm的配置都要位于該元素標記內。<form-beans>元素的子元素<form-bean>用來配置一個具體的 ActionForm類,每個<form-bean>元素對應的內容為一個form bean實例。一旦定義了<form-bean>元素,就可以在Action中使用它了。
3.訪問 ActionForm
ActionForm可以被JSP,Struts自定義標記,Action或其他Web組件訪問。訪問 ActionForm的一般方法如下:
a) 使用Struts HTML標記庫
Struts HTML標記庫提供了一組和 ActionForm密碼關聯的標記,這些標記對應到HTML表單域。如<html:form>標記對應HTML 的<form>標記,<html:text>對應HTML表單的text類型的<input>輸入域。這些標記和 ActionForm交互,以把 ActionForm中的屬性值顯示出來。
b)? 從request或session對象中取出 ActionForm對象
根據作用域的不同,Struts框架把 ActionForm實例保存在request或session對象中,保存時采用的key值為<form- bean>元素的名字,即name屬性的值。因此,可以像取出任何存放在request或session對象中的屬性一樣取出 ActionForm 實例。如:
LoginHandlerForm loginHandlerForm = (LoginHandlerForm)request.getAttribute("loginHandlerForm");???????
???????
c)在Action類的execute()方法中直接訪問 ActionForm
如果配置了 ActionForm和Action映射,Struts框架就會把 ActionForm作為參數傳給Action類的execute()方法,在execute()方法中,可以直接讀取或設置 ActionForm屬性。在Action中使用 ActionForm的示例如下:
??? public ActionForward execute(ActionMapping mapping, ActionForm form,
??????????? HttpServletRequest request, HttpServletResponse response) {
??? LoginHandlerForm loginHandlerForm = (LoginHandlerForm) form;???????
??????? //從Form中取得表單數據
??????? String userName = loginHandlerForm.getUserName();
??????? String userPwd = loginHandlerForm.getUserPwd();
??????? //(略)
??????? return mapping.findForward(forward);
???????
??? }
表單的數據驗證
在上面的LoginHandlerForm代碼中我們看到validate()方法體幾乎是空的,也就是說 LoginHandlerForm沒有啟動對表單數據進行驗證的功能。我們也看到validate()方法返回的是一個ActionErrors對象。該對象封裝了驗證過程中所發現的錯誤。
表單驗證是 ActionForm的一個主要的功能之一。要實現這個功能,我們需要采取4個步驟:
a)重寫validate()方法。
b)在資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識。
c)要在配置文件struts-config.xml中,把<action>元素的validate屬性設置為true(默認已經是true),并添加<message-resources>元素以指明資源文件的存放路徑。
d)在相應輸入頁面的相應位置加入錯誤標記<html:errors>,以輸出可能的驗證錯誤。
如上代碼,如果我們要在LoginHandlerForm中實現輸入數據驗證功能,則相應采取上術四步。
1.重寫validate()方法,如下:
//驗證方法,主要用于驗證視圖上的數據,例如非空之類,
??? //如果要進行業務驗證,則應該在Action中進行!
??? public ActionErrors validate(ActionMapping mapping,
??????????? HttpServletRequest request) {
???????
??????? ActionErrors errors = new ActionErrors();
??????? if(userName == null || userName.length()<3)
??????????????????? //此處userName為錯誤key,在前面頁面中要使用該名字以顯示
??????????? errors.add("userName",new ActionMessage("error.login.userName",userName));
??????? if(userPwd == null || userPwd.length()<3)
??????????? errors.add("userPwd",new ActionMessage("error.login.userPwd",userPwd));
??????? return errors;
??? }
在以上代碼中我們使用 了ActionErrors類和ActionMessage類。ActionErrors類封裝了一組驗證錯誤,它的用法類似 Map類。而ActionMessage類封裝了單個驗證錯誤,它的構造函數內的參數就指向資源文件內的一個錯誤文本。例如語句"ActionMessage("error.login.userName")"中的參數"error.login.userName" 其實就是資源文件ApplicationResources.properties中的一條錯誤文本的鍵(key)。通過ActionErrors對象的 add()方法,可以把ActionMessage對象加入到ActionErrors對象中。
2.設置資源文件
在struts的資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識:
# Resources for parameter 'struts.ApplicationResources'
# Project MVCStruts
error.login.userName=用戶名必須填寫且長度不小于3
error.login.userName=密碼必須填寫且長度不小于3
在資源文件中我們不能直接寫中文,否則會出現亂碼,至于我這里中文一是方便看,二是我按照了插件,可以自動過濾!插件可參考解決Struts中ApplicationResources.properties文件不支持中文問題
3.修改配置文件struts-config.xml
將配置文件struts-config.xml中<action>元素的validate屬性設置為true,此處,還需要<message-resources>元素,以指明資源文件的路徑。如下:
<action
????? attribute="loginHandlerForm"
????? input="/login.jsp"
????? name="loginHandlerForm"
????? path="/loginHandler"
????? scope="request"
????? validate="true"
????? type="struts.action.LoginHandlerAction" >
??? <!-- action與視圖組件的聯系在配置文件中寫,這樣就大大降低了Action和VIEW的耦合性? -->
????????? <forward name="success" path="/main.jsp" />
????????? <forward name="fail" path="/register.jsp" />
???? </action>
<!-- 資源文件 -->
? <message-resources parameter="struts.ApplicationResources" />
資源文件書寫類似JAVA文件,有包之分,注意是點號,不要寫成反斜杠/
4.在頁面 中加入錯誤標記:
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
??? <head>
??????? <title>JSP for LoginHandlerForm form</title>
??? </head>
??? <body>
??????? <html:form action="/loginHandler">
??????????? userName : <html:text property="userName"/><html:errors property="userName"/><br/>
??????????? userPwd : <html:text property="userPwd"/><html:errors property="userPwd"/><br/>
??????????? <html:submit/><html:cancel/>
??????? </html:form>
??? </body>
</html>
<html:errors>是struts的一個自定義標記。它能根據它的property屬性從資源文件中取出相應的驗證錯誤,并輸入頁面中指定的位置顯示驗證錯誤。
Struts的視圖組件:
Struts框架中的視圖組件主要包括:
JSP頁面。
ActionForm類。
Struts自定義標記。
消息資源。
其中, ActionForm類是Struts框架的核心組件之一,是Struts的關鍵視圖組件。在這篇文章中,將討論 ActionForm類及其作用。
ActionForm的作用機理:
ActionForm本質上是一種JavaBean,是專門用來傳遞表單數據的DTD(Data Transfer Object,數據傳遞對象)。它包括用于表單數據驗證的validate()方法和用于數據復位的reset()方法。
Struts 框架利用 ActionForm對象來臨時存放視圖頁面中的表單數據。例如,一個登錄頁面會有一個用戶名輸入框和一個密碼輸入框,以及用來提交登錄請求的按扭。當用戶提交登錄請求后,Struts將用戶名和密碼兩個輸入域的數據自動填充到相應的 ActionForm對象中,然后控制層可以從該 ActionForm對象中讀取用戶輸入的表單數據,也可以把來自模型層的數據存放到 ActionForm中,然后返回給視圖顯示。
ActionForm有(request)和 (session)兩種作用域(scope)。如果 ActionForm的作用域設定為request, ActionForm實例將保存在request 對象中,像其他保存在request對象中的屬性一樣,僅在當前請求范圍內有效。如果 ActionForm的作用域設定為session,那么 ActionForm實例將被保存在session對象中,同一個 ActionForm實例在整個HTTP會話中有效。
在Struts框架 中, ActionForm的作用機理如下圖:
當驗證 ActionForm時,如果檢測到一個或多個驗證錯誤,Struts框架會把錯誤轉發回配置文件struts-config.xml中<action>元素的input屬性所指定的輸入頁面。
ActionForm的使用方法:
下面通過在(Struts重構)構建一個簡單的基于MVC模式的JavaWeb的例子,來介紹一下 ActionForm的正確使用,包括如何創建,配置和訪問。
1.創建 ActionForm
可以擴展Struts軟件包的 ActionForm類來創建具體的 ActionForm。Struts軟件包中的 ActionForm類本身是一個抽象類,在擴展的時候,為每一個要從HTML表單中捕獲的輸入域定義一個屬性,使表單輸入域與 ActionForm屬性一一對應,以使 ActionForm能夠捕獲需要的表單輸入。定義了具體的屬性,就可以覆蓋父類的validate()和reset()方法,來實現具體的 ActionForm驗證規則和初始化方法。
下面是我在(Struts重構)構建一個簡單的基于MVC模式的JavaWeb里面的例子
/**//*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action. ActionForm;
import org.apache.struts.action.ActionMapping;
/** *//**
* Struts框架的 ActionForm對象,它可用來在用戶和業務層之間輿用戶的輸入數據。
* ActionForm也叫FormBean.Struts框架會自動從請求中懼輸入數據,再將 這些
* 數據交給一個使用FormBean的Action對象,接著FormBean可以再交給業務層
*/
public class LoginHandlerForm extends ActionForm {
??? /**//*
???? * Generated fields
???? */
??? /** *//** userName property */
??? private String userName;
??? /** *//** userPwd property */
??? private String userPwd;
??? //驗證方法,主要用于驗證視圖上的數據,例如非空之類,
??? //如果要進行業務驗證,則應該在Action中進行!
??? public ActionErrors validate(ActionMapping mapping,
??????????? HttpServletRequest request) {
???????
??????? return null;
??? }
??? //初始化首先調用的方法
??? public void reset(ActionMapping mapping, HttpServletRequest request) {
??????? // TODO Auto-generated method stub
??? }
??? public String getUserName() {
??????? return userName;
??? }
??? public void setUserName(String userName) {
??????? this.userName = userName;
??? }
???
??? public String getUserPwd() {
??????? return userPwd;
??? }
??? public void setUserPwd(String userPwd) {
??????? this.userPwd = userPwd;
??? }
}
在以上的loginActionForm中,validate()方法和reset()方法是 ActionForm中兩種可以覆蓋的方法。validate()方法中定義具體的 ActionForm驗證規則。
2.配置 ActionForm
每創建一個 ActionForm類,就需要在Struts的配置文件中配置這個類。如上的類配置如下:
<form-beans >
??? <form-bean name="loginHandlerForm" type="struts.form.LoginHandlerForm" />
? </form-beans>
<form-beans>元素用來指定全體 ActionForm的配置,一個Struts應用所有的 ActionForm的配置都要位于該元素標記內。<form-beans>元素的子元素<form-bean>用來配置一個具體的 ActionForm類,每個<form-bean>元素對應的內容為一個form bean實例。一旦定義了<form-bean>元素,就可以在Action中使用它了。
3.訪問 ActionForm
ActionForm可以被JSP,Struts自定義標記,Action或其他Web組件訪問。訪問 ActionForm的一般方法如下:
a) 使用Struts HTML標記庫
Struts HTML標記庫提供了一組和 ActionForm密碼關聯的標記,這些標記對應到HTML表單域。如<html:form>標記對應HTML 的<form>標記,<html:text>對應HTML表單的text類型的<input>輸入域。這些標記和 ActionForm交互,以把 ActionForm中的屬性值顯示出來。
b)? 從request或session對象中取出 ActionForm對象
根據作用域的不同,Struts框架把 ActionForm實例保存在request或session對象中,保存時采用的key值為<form- bean>元素的名字,即name屬性的值。因此,可以像取出任何存放在request或session對象中的屬性一樣取出 ActionForm 實例。如:
LoginHandlerForm loginHandlerForm = (LoginHandlerForm)request.getAttribute("loginHandlerForm");???????
???????
c)在Action類的execute()方法中直接訪問 ActionForm
如果配置了 ActionForm和Action映射,Struts框架就會把 ActionForm作為參數傳給Action類的execute()方法,在execute()方法中,可以直接讀取或設置 ActionForm屬性。在Action中使用 ActionForm的示例如下:
??? public ActionForward execute(ActionMapping mapping, ActionForm form,
??????????? HttpServletRequest request, HttpServletResponse response) {
??? LoginHandlerForm loginHandlerForm = (LoginHandlerForm) form;???????
??????? //從Form中取得表單數據
??????? String userName = loginHandlerForm.getUserName();
??????? String userPwd = loginHandlerForm.getUserPwd();
??????? //(略)
??????? return mapping.findForward(forward);
???????
??? }
表單的數據驗證
在上面的LoginHandlerForm代碼中我們看到validate()方法體幾乎是空的,也就是說 LoginHandlerForm沒有啟動對表單數據進行驗證的功能。我們也看到validate()方法返回的是一個ActionErrors對象。該對象封裝了驗證過程中所發現的錯誤。
表單驗證是 ActionForm的一個主要的功能之一。要實現這個功能,我們需要采取4個步驟:
a)重寫validate()方法。
b)在資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識。
c)要在配置文件struts-config.xml中,把<action>元素的validate屬性設置為true(默認已經是true),并添加<message-resources>元素以指明資源文件的存放路徑。
d)在相應輸入頁面的相應位置加入錯誤標記<html:errors>,以輸出可能的驗證錯誤。
如上代碼,如果我們要在LoginHandlerForm中實現輸入數據驗證功能,則相應采取上術四步。
1.重寫validate()方法,如下:
//驗證方法,主要用于驗證視圖上的數據,例如非空之類,
??? //如果要進行業務驗證,則應該在Action中進行!
??? public ActionErrors validate(ActionMapping mapping,
??????????? HttpServletRequest request) {
???????
??????? ActionErrors errors = new ActionErrors();
??????? if(userName == null || userName.length()<3)
??????????????????? //此處userName為錯誤key,在前面頁面中要使用該名字以顯示
??????????? errors.add("userName",new ActionMessage("error.login.userName",userName));
??????? if(userPwd == null || userPwd.length()<3)
??????????? errors.add("userPwd",new ActionMessage("error.login.userPwd",userPwd));
??????? return errors;
??? }
在以上代碼中我們使用 了ActionErrors類和ActionMessage類。ActionErrors類封裝了一組驗證錯誤,它的用法類似 Map類。而ActionMessage類封裝了單個驗證錯誤,它的構造函數內的參數就指向資源文件內的一個錯誤文本。例如語句"ActionMessage("error.login.userName")"中的參數"error.login.userName" 其實就是資源文件ApplicationResources.properties中的一條錯誤文本的鍵(key)。通過ActionErrors對象的 add()方法,可以把ActionMessage對象加入到ActionErrors對象中。
2.設置資源文件
在struts的資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識:
# Resources for parameter 'struts.ApplicationResources'
# Project MVCStruts
error.login.userName=用戶名必須填寫且長度不小于3
error.login.userName=密碼必須填寫且長度不小于3
在資源文件中我們不能直接寫中文,否則會出現亂碼,至于我這里中文一是方便看,二是我按照了插件,可以自動過濾!插件可參考解決Struts中ApplicationResources.properties文件不支持中文問題
3.修改配置文件struts-config.xml
將配置文件struts-config.xml中<action>元素的validate屬性設置為true,此處,還需要<message-resources>元素,以指明資源文件的路徑。如下:
<action
????? attribute="loginHandlerForm"
????? input="/login.jsp"
????? name="loginHandlerForm"
????? path="/loginHandler"
????? scope="request"
????? validate="true"
????? type="struts.action.LoginHandlerAction" >
??? <!-- action與視圖組件的聯系在配置文件中寫,這樣就大大降低了Action和VIEW的耦合性? -->
????????? <forward name="success" path="/main.jsp" />
????????? <forward name="fail" path="/register.jsp" />
???? </action>
<!-- 資源文件 -->
? <message-resources parameter="struts.ApplicationResources" />
資源文件書寫類似JAVA文件,有包之分,注意是點號,不要寫成反斜杠/
4.在頁面 中加入錯誤標記:
<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
??? <head>
??????? <title>JSP for LoginHandlerForm form</title>
??? </head>
??? <body>
??????? <html:form action="/loginHandler">
??????????? userName : <html:text property="userName"/><html:errors property="userName"/><br/>
??????????? userPwd : <html:text property="userPwd"/><html:errors property="userPwd"/><br/>
??????????? <html:submit/><html:cancel/>
??????? </html:form>
??? </body>
</html>
<html:errors>是struts的一個自定義標記。它能根據它的property屬性從資源文件中取出相應的驗證錯誤,并輸入頁面中指定的位置顯示驗證錯誤。
總結
以上是生活随笔為你收集整理的ActionForm类及表单数据验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用DOM解析常用方法
- 下一篇: miad632作品封面及种子(miad