struts1:(Struts)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屬性從資源文件中取出相應的驗證錯誤,並輸入頁面中指定的位置顯示驗證錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM