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屬性所指定的輸入頁面。html

ActionForm的使用方法:
下面經過在(Struts重構)構建一個簡單的基於MVC模式的JavaWeb的例子,來介紹一下ActionForm的正確使用,包括如何建立,配置和訪問。
1.建立ActionForm
能夠擴展Struts軟件包的ActionForm類來建立具體的ActionForm。Struts軟件包中的ActionForm類自己 是一個抽象類,在擴展的時候,爲每個要從HTML表單中捕獲的輸入域定義一個屬性,使表單輸入域與ActionForm屬性一一對應,以使ActionForm可以捕獲須要的表單輸入。定義了具體的屬性,就能夠覆蓋父類 的validate()和reset()方法,來實現具體的ActionForm驗證規則和初始化方法。
下面是我在(Struts重構)構建一個簡單的基於MVC模式的JavaWeb裏面的例子java

/*
 * 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驗證規則。apache

2.配置ActionForm
每建立一個ActionForm類,就須要在Struts的配置文件中配置這個類。如上的類配置以下:session

<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中使用它了。app

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的示例以下:jsp

    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中設置可能的驗證錯誤的標識:this

# 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>元素,以指明資源文件的路徑。以下:spa

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

相關文章
相關標籤/搜索