1. 程式人生 > >Struts功能詳解——Action

Struts功能詳解——Action

Action是struts中的一個抽象類,它其實是Struts的心臟部分,前面提到的ActionServlet和ActionForm進過處理獲取的請求和資料,都會到達Action中得到分發。

一:Action有那些作用

  1. 可以進行一些表單資料的檢查,這裡面的檢查一般和頁面的檢查是不一樣的,頁面的檢查都是客戶端的一些資料格式規範的檢查,這裡的檢查而與業務相關的檢查一般放到這裡面檢查,比如與JavaBean相關的一些操作。也可以說它是一個業務邏輯的管理分發的地方。
  2. 執行必要的業務邏輯,不如存取資料庫,呼叫實體bean等。它會直接呼叫業務邏輯層的javabean去處理資料庫的操作,比如增刪改查等。
  1. 根據處理的結果決定程式的去向,並以ActionForward物件的形式傳遞給ActionServlet,這樣ActionServlet通過配置檔案,決定返回的資料到達那個頁面。
  1. Action是一個抽象類,必須實現以後才能執行,執行的方法是execute方法。

二 :一個完整的Action示例和執行流程。

<actionpath="/aFullAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forwardname="successful" path="someJSP.jsp"/>
<forwardname="failed" path="someOtherJSP.jsp"/>
</action>

Action執行流程

首先,Struts的ActionServlet接收到一個請求,然後根據struts-config.xml的配置定位到相應的mapping(對映);接下來如果form的範圍是request或者在定義的範圍中找不到這個form,建立一個新的form例項;取得form例項以後,呼叫其 reset()方法,然後將表單中的引數放入form,如果validate屬性不為false,呼叫validate()方法;如果validate()返回非空的ActionErrors,將會被轉到input屬性指定的URI,如果返回空的ActionErrors,那麼執行Action的 execute()方法,根據返回的ActionForward確定目標URI。

這樣做的效果是:execute()僅當validate()成功以後才執行;input屬性指定的是一個URI。

三.一個特殊的Action:DispatchAction

由於當業務太多的時候,每個業務都要創造一個Action,這樣會大大增加Action的數量,而且也會造成浪費。

它的主要好處就是把所有的Action放到一個類裡面,通過傳過來的引數決定呼叫那個Action操作。

DispatchAction類是一個抽象類,它實現了父類(Action)的execute()方法,所以它的子類就不用來實現這個方法了,只需要專注與實際操作的方法。

下面看一個dispatchAction應用例項。

 1.首先要一個DispatchAction的子類,它含有一些方法,login,logout,method1,

public class AccountAction extends DispatchAction {
    public ActionForward login(ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        // 進行一些Login的邏輯
              return mapping.findForward("success");  
 
    }
                                                                               
    public ActionForward logout(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        // 進行一些Logout的邏輯
              return mapping.findForward("success1");  
 
    }
    public ActionForward method1(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        // 進行一些method1的邏輯
              return mapping.findForward("success");  
    }
}


  一定要注意在DispatchAction中你想執行的操作,都必須要有統一的引數(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response),是一個規定.

2.接下來是配置struts-config.xml

 <action path="/login"  type="examples.AccountAction" 
             name="logonForm"
             scope="request"
             parameter="action"
             input="/pages/dispatch1.jsp">
       <forward name="success" path="/pages/success.jsp" />
    </action>
 
    <action path="/logout"  type="examples.AccountAction" 
             name="logonForm"
             scope="request"
             parameter="action"
             input="/pages/dispatch1.jsp">
       <forward name="success1" path="/pages/success1.jsp" />
    </action>

 這裡需要注意的就是parameter屬性的值,因為這個值要和頁面傳來的引數對應.

3.再來看看JSP頁 pages/dispatch1.jsp

 
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:link href="/DispathActionTest/login.do?action=login">login</html:link><br>
<html:link href="/DispathActionTest/logout.do?action=logout">logout</html:link>

這裡要注意幾點,首先 ?後面的KEY要和struts-config.xml中的parameter相同,還有它的VALUE要是你在action的一個方法名字,這裡方法名為login, 那麼在程式執行時就是呼叫login的操作,如果是logout,那程式就呼叫logout的操作.