strut2工作原理
(1)在web.xml中配置一個struts過濾器StrutsPrepareAndExecuteFilter,對后綴為.action的請求進行過濾
(2).action請求經過過濾器后到達ActionMapper中去查找該請求的映射
(3)然后經過ActionProxy(action代理)去通過ConfigurationManager(配置管理器)加載核心配置文件struts.xml,找到具體的action類,然后通過ActionInvocation去創建action類的反向實例
(4)通過一系列攔截器后執行action返回result后再經過一系攔截器到達HttpServletResponse后返回到用戶實例HttpServletRequest
攔截器概念:
攔截器:在Struts2工作過程中,大多數核心功能是通過攔截器實現的,如數據轉移,類型轉換,數據校檢等等,攔截器方法在action執行之前或者之后執行。
攔截器棧:攔截器棧也是一種攔截器,結構上相當于多個攔截器的組合
攔截器工作原理:
客戶端發出的請求一次經過攔截器1,攔截器2,攔截器3等等,然后執行Action中的execute()方法返回一個result,這個result又依次反向經過攔截器3,攔截器2,攔截器1后,才開始響應客戶端
自定義攔截器的方法:
(1)實現Interceptor接口
--void init():初始化攔截器所需資源
--void destroy():釋放在init()中分配的資源
--String intercept(ActionInvocation ai) throws Exception:實現攔截器功能,利用ActionInvocation參數獲取Action狀態,返回result字符串作為邏輯視圖
(2)繼承AbstractInterceptor類
--提供了init()和destroy()方的空實現
--只需實現intercept方法
攔截器示例:
計算Action的執行時間:執行之后的時間-執行之前的時間=執行Action消耗的時間
實現步驟:
(1)創建攔截器
(2)在配置文件中定義攔截器并引用它
代碼實現:
準備:創建好一個action并在struts.xml文件中配置好,配置好web.xml文件
創建攔截器:創建一個AbstractInterceptor的實現類,實現intercept方法,我創建的InterceptorDemo
在struts.xml中配置攔截器:先注冊,再引用
Struts2內建攔截器:
params攔截器:負責將請求參數設置為Action參數
staticParams攔截器:將配置文件中action元素的子元素param參數設置Action屬性
servletConfig攔截器:Servlet API的各種對象注入到Action,必須實現對應接口
fileUpload攔截器:對文件上傳提供支持,將文件和元數據設置到對應的action屬性
exception攔截器:捕獲異常,并將異常映射到用戶自定義的錯誤頁面
validation攔截器:調用驗證框架進行數據驗證
struts-default.xml文件
位于struts核心jar包struts-core中,struts啟動前自動加載,里面定義了一個struts-default包,所有自定義的攔截器都要繼承這個包,而且里面定義了許多內建的攔截器。那么怎么引用這些攔截器呢?
在struts-default.xml文件中有一個如上所示的攔截器棧,這個攔截器棧引用在、了這些攔截器,引用順序就是它們在攔截器棧中的排列順序
還有一個如下所示的默認引用的攔截器棧,這個攔截器棧默認都會被引用
只要在定義包的過程中繼承struts-default包,那么defaultStack將是默認的攔截器,但是當包中的某個action顯式指定了某個攔截器,則默認攔截器不會騎作用。值得注意的是,攔截器棧中的各個攔截器的順序很重要。
引用攔截器棧的方法和攔截器一樣