strut2工作原理
(1)在web.xml中配置一個struts過濾器StrutsPrepareAndExecuteFilter,對后綴為.action的請求進行過濾
(2).action請求經(jīng)過過濾器后到達ActionMapper中去查找該請求的映射
(3)然后經(jīng)過ActionProxy(action代理)去通過ConfigurationManager(配置管理器)加載核心配置文件struts.xml,找到具體的action類,然后通過ActionInvocation去創(chuàng)建action類的反向?qū)嵗?/p>
(4)通過一系列攔截器后執(zhí)行action返回result后再經(jīng)過一系攔截器到達HttpServletResponse后返回到用戶實例HttpServletRequest

攔截器概念:
攔截器:在Struts2工作過程中,大多數(shù)核心功能是通過攔截器實現(xiàn)的,如數(shù)據(jù)轉(zhuǎn)移,類型轉(zhuǎn)換,數(shù)據(jù)校檢等等,攔截器方法在action執(zhí)行之前或者之后執(zhí)行。
攔截器棧:攔截器棧也是一種攔截器,結(jié)構(gòu)上相當于多個攔截器的組合
攔截器工作原理:
客戶端發(fā)出的請求一次經(jīng)過攔截器1,攔截器2,攔截器3等等,然后執(zhí)行Action中的execute()方法返回一個result,這個result又依次反向經(jīng)過攔截器3,攔截器2,攔截器1后,才開始響應客戶端
自定義攔截器的方法:
(1)實現(xiàn)Interceptor接口
--void init():初始化攔截器所需資源
--void destroy():釋放在init()中分配的資源
--String intercept(ActionInvocation ai) throws Exception:實現(xiàn)攔截器功能,利用ActionInvocation參數(shù)獲取Action狀態(tài),返回result字符串作為邏輯視圖
(2)繼承AbstractInterceptor類
--提供了init()和destroy()方的空實現(xiàn)
--只需實現(xiàn)intercept方法
攔截器示例:
計算Action的執(zhí)行時間:執(zhí)行之后的時間-執(zhí)行之前的時間=執(zhí)行Action消耗的時間
實現(xiàn)步驟:
(1)創(chuàng)建攔截器
(2)在配置文件中定義攔截器并引用它
代碼實現(xiàn):
準備:創(chuàng)建好一個action并在struts.xml文件中配置好,配置好web.xml文件
創(chuàng)建攔截器:創(chuàng)建一個AbstractInterceptor的實現(xiàn)類,實現(xiàn)intercept方法,我創(chuàng)建的InterceptorDemo

在struts.xml中配置攔截器:先注冊,再引用

Struts2內(nèi)建攔截器:
params攔截器:負責將請求參數(shù)設(shè)置為Action參數(shù)
staticParams攔截器:將配置文件中action元素的子元素param參數(shù)設(shè)置Action屬性
servletConfig攔截器:Servlet API的各種對象注入到Action,必須實現(xiàn)對應接口
fileUpload攔截器:對文件上傳提供支持,將文件和元數(shù)據(jù)設(shè)置到對應的action屬性
exception攔截器:捕獲異常,并將異常映射到用戶自定義的錯誤頁面
validation攔截器:調(diào)用驗證框架進行數(shù)據(jù)驗證
struts-default.xml文件

位于struts核心jar包struts-core中,struts啟動前自動加載,里面定義了一個struts-default包,所有自定義的攔截器都要繼承這個包,而且里面定義了許多內(nèi)建的攔截器。那么怎么引用這些攔截器呢?

在struts-default.xml文件中有一個如上所示的攔截器棧,這個攔截器棧引用在、了這些攔截器,引用順序就是它們在攔截器棧中的排列順序

還有一個如下所示的默認引用的攔截器棧,這個攔截器棧默認都會被引用

只要在定義包的過程中繼承struts-default包,那么defaultStack將是默認的攔截器,但是當包中的某個action顯式指定了某個攔截器,則默認攔截器不會騎作用。值得注意的是,攔截器棧中的各個攔截器的順序很重要。
引用攔截器棧的方法和攔截器一樣