Struts功能詳解——Action
Action是struts中的一個抽象類,它其實是Struts的心臟部分,前面提到的ActionServlet和ActionForm進過處理獲取的請求和資料,都會到達Action中得到分發。
一:Action有那些作用
- 可以進行一些表單資料的檢查,這裡面的檢查一般和頁面的檢查是不一樣的,頁面的檢查都是客戶端的一些資料格式規範的檢查,這裡的檢查而與業務相關的檢查一般放到這裡面檢查,比如與JavaBean相關的一些操作。也可以說它是一個業務邏輯的管理分發的地方。
- 執行必要的業務邏輯,不如存取資料庫,呼叫實體bean等。它會直接呼叫業務邏輯層的javabean去處理資料庫的操作,比如增刪改查等。
- 根據處理的結果決定程式的去向,並以ActionForward物件的形式傳遞給ActionServlet,這樣ActionServlet通過配置檔案,決定返回的資料到達那個頁面。
- 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的操作.