strut2工作原理
(1)在web.xml中配置一個(gè)struts過濾器StrutsPrepareAndExecuteFilter霸妹,對(duì)后綴為.action的請(qǐng)求進(jìn)行過濾
(2).action請(qǐng)求經(jīng)過過濾器后到達(dá)ActionMapper中去查找該請(qǐng)求的映射
(3)然后經(jīng)過ActionProxy(action代理)去通過ConfigurationManager(配置管理器)加載核心配置文件struts.xml驹闰,找到具體的action類,然后通過ActionInvocation去創(chuàng)建action類的反向?qū)嵗?/p>
(4)通過一系列攔截器后執(zhí)行action返回result后再經(jīng)過一系攔截器到達(dá)HttpServletResponse后返回到用戶實(shí)例HttpServletRequest
攔截器概念:
攔截器:在Struts2工作過程中反镇,大多數(shù)核心功能是通過攔截器實(shí)現(xiàn)的,如數(shù)據(jù)轉(zhuǎn)移虫啥,類型轉(zhuǎn)換掺逼,數(shù)據(jù)校檢等等,攔截器方法在action執(zhí)行之前或者之后執(zhí)行衡奥。
攔截器棧:攔截器棧也是一種攔截器爹袁,結(jié)構(gòu)上相當(dāng)于多個(gè)攔截器的組合
攔截器工作原理:
客戶端發(fā)出的請(qǐng)求一次經(jīng)過攔截器1,攔截器2矮固,攔截器3等等失息,然后執(zhí)行Action中的execute()方法返回一個(gè)result,這個(gè)result又依次反向經(jīng)過攔截器3档址,攔截器2盹兢,攔截器1后,才開始響應(yīng)客戶端
自定義攔截器的方法:
(1)實(shí)現(xiàn)Interceptor接口
--void init():初始化攔截器所需資源
--void destroy():釋放在init()中分配的資源
--String intercept(ActionInvocation ai) throws Exception:實(shí)現(xiàn)攔截器功能守伸,利用ActionInvocation參數(shù)獲取Action狀態(tài)绎秒,返回result字符串作為邏輯視圖
(2)繼承AbstractInterceptor類
--提供了init()和destroy()方的空實(shí)現(xiàn)
--只需實(shí)現(xiàn)intercept方法
攔截器示例:
計(jì)算Action的執(zhí)行時(shí)間:執(zhí)行之后的時(shí)間-執(zhí)行之前的時(shí)間=執(zhí)行Action消耗的時(shí)間
實(shí)現(xiàn)步驟:
(1)創(chuàng)建攔截器
(2)在配置文件中定義攔截器并引用它
代碼實(shí)現(xiàn):
準(zhǔn)備:創(chuàng)建好一個(gè)action并在struts.xml文件中配置好,配置好web.xml文件
創(chuàng)建攔截器:創(chuàng)建一個(gè)AbstractInterceptor的實(shí)現(xiàn)類含友,實(shí)現(xiàn)intercept方法替裆,我創(chuàng)建的InterceptorDemo
在struts.xml中配置攔截器:先注冊(cè),再引用
Struts2內(nèi)建攔截器:
params攔截器:負(fù)責(zé)將請(qǐng)求參數(shù)設(shè)置為Action參數(shù)
staticParams攔截器:將配置文件中action元素的子元素param參數(shù)設(shè)置Action屬性
servletConfig攔截器:Servlet API的各種對(duì)象注入到Action窘问,必須實(shí)現(xiàn)對(duì)應(yīng)接口
fileUpload攔截器:對(duì)文件上傳提供支持辆童,將文件和元數(shù)據(jù)設(shè)置到對(duì)應(yīng)的action屬性
exception攔截器:捕獲異常,并將異常映射到用戶自定義的錯(cuò)誤頁面
validation攔截器:調(diào)用驗(yàn)證框架進(jìn)行數(shù)據(jù)驗(yàn)證
struts-default.xml文件
位于struts核心jar包struts-core中惠赫,struts啟動(dòng)前自動(dòng)加載把鉴,里面定義了一個(gè)struts-default包,所有自定義的攔截器都要繼承這個(gè)包儿咱,而且里面定義了許多內(nèi)建的攔截器庭砍。那么怎么引用這些攔截器呢?
在struts-default.xml文件中有一個(gè)如上所示的攔截器棧混埠,這個(gè)攔截器棧引用在怠缸、了這些攔截器,引用順序就是它們?cè)跀r截器棧中的排列順序
還有一個(gè)如下所示的默認(rèn)引用的攔截器棧钳宪,這個(gè)攔截器棧默認(rèn)都會(huì)被引用
只要在定義包的過程中繼承struts-default包揭北,那么defaultStack將是默認(rèn)的攔截器扳炬,但是當(dāng)包中的某個(gè)action顯式指定了某個(gè)攔截器,則默認(rèn)攔截器不會(huì)騎作用搔体。值得注意的是恨樟,攔截器棧中的各個(gè)攔截器的順序很重要。
引用攔截器棧的方法和攔截器一樣