1 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
大概邏輯如下(有些的可能不太全面,可以多看看書.):
struts1:
發(fā)布Struts Web服務(wù)時(shí),根據(jù)web.xml初始化ActionServlet,ActionContext等內(nèi)容.
在接到一個(gè)HttpRequest請(qǐng)求后,ActionServlet 根據(jù)struts-config.xml中的配置內(nèi)容,將請(qǐng)求的參數(shù)傳到對(duì)應(yīng)的Formbean中,并設(shè)置session.然后根據(jù)請(qǐng)求中的Action參數(shù),在struts-config.xml中查找指定的Action,并調(diào)用此Action來處理請(qǐng)求.根據(jù)Action的處理結(jié)果,會(huì)返回一個(gè)forward變量,此時(shí)通過mapping.findForward()查找出對(duì)應(yīng)的forward所標(biāo)示的Action或者JSP頁面,將請(qǐng)求轉(zhuǎn)到下一個(gè)處理.如果是forward指向JSP頁面,則輸出到前臺(tái).
Struts2:
(1)客戶端提交一個(gè)HttpServletRequest請(qǐng)求(.action或JSP頁面)
(2)請(qǐng)求被提交到一系列Filter過濾器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是過濾器鏈中的最后一個(gè)過濾器
(4)請(qǐng)求發(fā)到FilterDispatcher后,FilterDispatcher詢問ActionMapper是否需要調(diào)用某個(gè)Action來處理這個(gè)Request(一般根據(jù)URL后綴是否為.action來判斷)
(5)如果ActionMapper決定需要調(diào)用某個(gè)Action,FilterDispatcher則把請(qǐng)求交到ActioProxy,由其進(jìn)行處理.
(6)ActionProxy通過Configuration Manager(它會(huì)訪問struts.xml)詢問框架的配置文件,找到需要調(diào)用的Action類.
(7)ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,而ActionInvocation通過代理模式調(diào)用Action,(在調(diào)用之前會(huì)根據(jù)配置文件加載相關(guān)的所有Interceptor攔截器)
(8)Action執(zhí)行完畢后,返回一個(gè)result字符串,此時(shí)再按相反的順序通過Interceptor攔截器.
(9) 最后ActionInvocation負(fù)責(zé)根據(jù)struts.xml中配置的result元素,找到與返回值對(duì)應(yīng)的result,決定進(jìn)行下一步輸出.
添加回答
舉報(bào)