Struts中的C層功能:
1、 接受客戶端請求
2、 調用M層模型組件執行相應的業務邏輯。
3、 獲取M層業務邏輯的處理結果
4、 根據處理結果選擇合適的視圖呈現給客戶端。
C層核心控制組件是:ActionServlet,它是org.apache.struts.action.ActionServlet類型的Servlet。
他繼承javax.Servlet.Http.HttpServlet,並實現了init(),doGet()/doPost(),destroy()等Servlet生命週期所用到的方法。還添加了一個process(),它本身不復雜,但它會調用其他的複雜方法。
ActionServlet接收到來自Servlet容器的客戶請求時,他的處理步驟:
1、 根據瀏覽器是post還是get請求調用doPost()、doGet()方法,在其中調用ActionServlet的process()方法。
2、 Process()獲取RequestProcessor對象-à調用RequestProcessor對象的process()方法
3、 Process()讀取struts-config.xml,在其中查找<action>子元素,查找的條件是:用戶請求的URI與action元素的path屬性值一樣,找到後確定name屬性,根據name找到<form-bean>元素,再根據action元素的name匹配值找到相應的ActionForm bean。
4、 調用ActionForm bean的setter方法填充FormBean的屬性,然後調用FormBean的validate()方法,對錶單數據的有效性進行驗證。
5、 RequestProcessor的process()方法根據3中找到的<action>中的type屬性尋找Action bean對象(有則使用,無則創建),然後將FormBean對象,封裝的請求對象等信息發給找到的Action對象,Action bean調用自己的execute()方法處理。
6、 Action bean的execute()方法執行完璧後,返回一個ActionForward對象,又回到RequestProcessor對象的process()方法,process方法將根據ActionForward請求重新定向到指定的頁面。
流程:
1、客戶請求req.do
ActionServlet—>process()—>RequestProcessor.process()—>struts-config.xml—>
<action>—>path=”/req”
<action>—>name—><form-bean>—>setXXX()
<action>—>type—>獲得Action—>execute()
—>execute()返回ActionForward()
RequstProcessor類時struts控制器的真正的請求處理者。它定義了多個processXXX()方法完成具體的處理工作。如果要擴展ActionServlet類,可以從RequstProcessor繼承,實現自己的控制邏輯。其中,它提供一個processPreprocess()方法用於在子類中被重寫,加入定製的預處理共功能。
Struts中的ActionForm:有表單數據是使用
ActionForm bean 的聲明和使用在struts-config.xml中是分開的。這樣一個bean可以處理多個頁面不同的請求表單信息。
聲明:<form-bean>
使用:<action name=”formbean”>
定義ActionForm bean後,必須在struts-config.xml中聲明。之後,再指明ActionForm bean和要被處理的請求之間的對應關係,一個蘿蔔一個坑,(當然,這個請求是含有表單信息的請求)。即事先約定好在那種情況下使用某個特定的ActionForm bean,這種約定是在配置文件中給出的。類似這樣的:
<action-mappings>
<action path=”/login” type="com.fzxy.LoginAction" name="formBean1" scope="request" input="/login.jsp" />
<action path="/regist" forward="/regist.jsp"/>
</action-mappings>
這個<action-mappings>元素給出各種可能的客戶端請求與處理方式之間的對應關係,一個<action>對一種請求URI的處理辦法。
<action>元素的屬性:
path:客戶請求的頁面URI。
type:處理請求的Action對象的類型,包括包名
name:用於自動接收path請求表單信息的ActionForm bean的名字,該名字在<form-bean>中聲明。
scope:ActionForm bean的適用範圍,通常爲request或session,
虛線代表第一次請求,實線代表第二次請求當範圍時:
request時,只在當前請求和響應有效,請求由一個組件轉發到另一個組件是,該對象一直有效。當服務器返回響應結果給客戶時,ActionForm bean被銷燬。圖中範圍爲request時,form對象將覆蓋第一次請求及響應週期內的4個組件,4個組件共用一個ActionForm對象。當瀏覽器發出第二個請求時,將重新創建一個新的ActionForm對象。
session時,兩次請求只要在一個會話中,這些組件始終共用一個ActionForm對象。
input:處理請求出錯時轉向的頁面
轉自:http://hi.baidu.com/baozi52/blog/item/98c928088c135531e8248877.html