




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Struts2Struts2攔截器和轉(zhuǎn)換器回顧qStruts2標(biāo)簽簡介q非UI標(biāo)簽q 控制標(biāo)簽q 數(shù)據(jù)標(biāo)簽qUI標(biāo)簽q 表單標(biāo)簽q 非表單標(biāo)簽q主題和模板目標(biāo)qStruts2攔截器q 攔截器簡介q 自定義攔截器q 攔截器配置初步q Struts2內(nèi)置攔截器q 攔截器實(shí)例qStruts2轉(zhuǎn)換器q 內(nèi)置轉(zhuǎn)化器q 自定義轉(zhuǎn)換器攔截器簡介攔截器攔截器,在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問之前,進(jìn)行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實(shí)現(xiàn)策略。Struts2的攔截器類似過濾器,它也默認(rèn)有init();destroy(); 也有攔截
2、器鏈,也需要配置。實(shí)際上在Struts2框架中有很多攔截器的實(shí)現(xiàn),如國際化、轉(zhuǎn)換器,校驗(yàn)等。攔截器的工作原理工作原理如上圖,每一個(gè)Action請求都包裝在一系列的攔截器的內(nèi)部。攔截器可以在Action執(zhí)行之前做相似的操作也可以在Action執(zhí)行之后做回收操作。 每一個(gè)Action既可以將操作轉(zhuǎn)交給下面的攔截器,Action也可以直接退出操作返回客戶既定的畫面。自定義攔截器自定義一個(gè)攔截器需要三步:1 自定義一個(gè)實(shí)現(xiàn)Interceptor接口(或者繼承自AbstractInterceptor)的類。2 在strutx.xml中注冊上一步中定義的攔截器。3 在需要使用的Action中引用上述定義的
3、攔截器,為了方便也可將攔截器定義為默認(rèn)的攔截器,這樣在不加特殊聲明的情況下所有的Action都被這個(gè)攔截器攔截。自定義攔截器Interceptor接口聲明了三個(gè)方法:public interface Interceptor extends Serializable void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; Init方法在攔截器類被創(chuàng)建之后,在對(duì)Action鏡像攔截之前調(diào)用,相當(dāng)于一個(gè)post-constructor方法,使用這個(gè)方法可以給攔截器類做必要
4、的初始話操作。Destroy方法在攔截器被垃圾回收之前調(diào)用,用來回收init方法初始化的資源。Intercept是攔截器的主要攔截方法,如果需要調(diào)用后續(xù)的Action或者攔截器,只需要在該方法中調(diào)用invocation.invoke()方法即可,在該方法調(diào)用的前后可以插入Action調(diào)用前后攔截器需要做的方法。如果不需要調(diào)用后續(xù)的方法,則返回一個(gè)String類型的對(duì)象即可,例如Action.SUCCESS。另外AbstractInterceptor提供了一個(gè)簡單的Interceptor的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)為:public abstract class AbstractInterceptor imp
5、lements Interceptor public void init() public void destroy() public abstract String intercept(ActionInvocation invocation) throws Exception;在不需要編寫init和destroy方法的時(shí)候,只需要從AbstractInterceptor繼承而來,實(shí)現(xiàn)intercept方法即可。自定義攔截器我們嘗試編寫一個(gè)Session過濾用的攔截器,該攔截器查看用戶Session中是否存在特定的屬性(LOGIN屬性)如果不存在,中止后續(xù)操作定位到LOGIN,否則執(zhí)行原定操作
6、,代碼為:public class CheckLoginInterceptor extends AbstractInterceptor public static final String LOGIN_KEY = LOGIN; public static final String LOGIN_PAGE = global.login; public String intercept(ActionInvocation actionInvocation) throws Exception System.out.println(begin check login interceptor!); / 對(duì)L
7、oginAction不做該項(xiàng)攔截 Object action = actionInvocation.getAction(); if (action instanceof LoginAction) System.out.println(exit check login, because this is login action.); return actionInvocation.invoke(); / 確認(rèn)Session中是否存在LOGIN Map session = actionInvocation.getInvocationContext().getSession(); String lo
8、gin = (String) session.get(LOGIN_KEY); if (login != null & login.length() 0) / 存在的情況下進(jìn)行后續(xù)操作。 System.out.println(already login!); return actionInvocation.invoke(); else / 否則終止后續(xù)操作,返回LOGIN System.out.println(no login, forward login page!); return LOGIN_PAGE; 自定義攔截器注冊攔截器注冊攔截器 將上述攔截器設(shè)定為默認(rèn)攔截器:這樣在后續(xù)同一個(gè)pac
9、kage內(nèi)部的所有Action執(zhí)行之前都會(huì)被login攔截。注冊并引用注冊并引用Interceptor login.jsp /secure/home 自定義攔截器可以將多個(gè)攔截器合并在一起作為一個(gè)堆棧調(diào)用,當(dāng)一個(gè)攔截器堆棧被附加到一個(gè)可以將多個(gè)攔截器合并在一起作為一個(gè)堆棧調(diào)用,當(dāng)一個(gè)攔截器堆棧被附加到一個(gè)Action的時(shí)候,的時(shí)候,要想要想Action執(zhí)行,必須執(zhí)行攔截器堆棧中的每一個(gè)攔截器。執(zhí)行,必須執(zhí)行攔截器堆棧中的每一個(gè)攔截器。login.jsp/secure/home內(nèi)置攔截器注冊攔截器注冊攔截器 將上述攔截器設(shè)定為默認(rèn)攔截器:這樣在后續(xù)同一個(gè)package內(nèi)部的所有Action執(zhí)行之
10、前都會(huì)被login攔截。內(nèi)置攔截器上述說明的攔截器在默認(rèn)的上述說明的攔截器在默認(rèn)的Struts2應(yīng)用中,根據(jù)慣例配置了若干個(gè)攔截器堆棧,詳細(xì)情參看應(yīng)用中,根據(jù)慣例配置了若干個(gè)攔截器堆棧,詳細(xì)情參看struts-default.xml其中有一個(gè)攔截器堆棧比較特殊,他會(huì)應(yīng)用在默認(rèn)的每一個(gè)其中有一個(gè)攔截器堆棧比較特殊,他會(huì)應(yīng)用在默認(rèn)的每一個(gè)Action上。上。dojo.*input,back,cancel,browseinput,back,cancel,browse內(nèi)置攔截器需要說明的幾點(diǎn):需要說明的幾點(diǎn):1攔截器執(zhí)行的順序按照定義的順序執(zhí)行,例如:攔截器執(zhí)行的順序按照定義的順序執(zhí)行,例如:的執(zhí)行順
11、序?yàn)椋旱膱?zhí)行順序?yàn)椋簍hisWillRunFirstInterceptorthisWillRunNextInterceptorfollowedByThisInterceptorthisWillRunLastInterceptorMyAction1MyAction2(chain)MyPreResultListenerMyResult(result)thisWillRunLastInterceptorfollowedByThisInterceptorthisWillRunNextInterceptorthisWillRunFirstInterceptor內(nèi)置攔截器2使用默認(rèn)攔截器配置每個(gè)使用默認(rèn)攔
12、截器配置每個(gè)Action都需要的攔截器堆棧,例如:都需要的攔截器堆棧,例如:login.jsp/secure/home可以按照如下的方式定義:可以按照如下的方式定義:login.jsp/secure/home轉(zhuǎn)換器一、概述一、概述在在B/S應(yīng)用中,將字符串請求參數(shù)轉(zhuǎn)換為相應(yīng)的數(shù)據(jù)類型,是應(yīng)用中,將字符串請求參數(shù)轉(zhuǎn)換為相應(yīng)的數(shù)據(jù)類型,是MVC框架提供的功能,框架提供的功能,而而Struts2是很好的是很好的MVC框架實(shí)現(xiàn)者,理所當(dāng)然,提供了類型轉(zhuǎn)換機(jī)制。框架實(shí)現(xiàn)者,理所當(dāng)然,提供了類型轉(zhuǎn)換機(jī)制。Struts2的類型轉(zhuǎn)換是基于的類型轉(zhuǎn)換是基于OGNL表達(dá)式的,只要我們把表達(dá)式的,只要我們把HTML
13、輸入項(xiàng)(表單元素和輸入項(xiàng)(表單元素和其他其他GET/POET的參數(shù))命名為合法的的參數(shù))命名為合法的OGNL表達(dá)式,就可以充分利用表達(dá)式,就可以充分利用Struts2的轉(zhuǎn)換的轉(zhuǎn)換機(jī)制。機(jī)制。除此之外,除此之外,Struts2提供了很好的擴(kuò)展性,開發(fā)者可以非常簡單的開發(fā)自己的類型轉(zhuǎn)提供了很好的擴(kuò)展性,開發(fā)者可以非常簡單的開發(fā)自己的類型轉(zhuǎn)換器,完成字符串和自定義復(fù)合類型之間的轉(zhuǎn)換??傊?,換器,完成字符串和自定義復(fù)合類型之間的轉(zhuǎn)換??傊琒truts2的類型轉(zhuǎn)換器提供了的類型轉(zhuǎn)換器提供了非常強(qiáng)大的表現(xiàn)層數(shù)據(jù)處理機(jī)制,開發(fā)者可以利用非常強(qiáng)大的表現(xiàn)層數(shù)據(jù)處理機(jī)制,開發(fā)者可以利用Struts2的類型轉(zhuǎn)換機(jī)
14、制來完成任意的類型轉(zhuǎn)換機(jī)制來完成任意的類型轉(zhuǎn)換。的類型轉(zhuǎn)換。 轉(zhuǎn)換器二、實(shí)現(xiàn)自定義類型轉(zhuǎn)換器 實(shí)現(xiàn)TypeCoverter接口,或者繼承DefaultTypeConverter實(shí)現(xiàn)類(該類實(shí)現(xiàn)了TypeCoverter接口),通過繼承該實(shí)現(xiàn)類來實(shí)現(xiàn)自己的類型轉(zhuǎn)換器。重寫convertValue方法即可。 為了簡化類型轉(zhuǎn)換器的實(shí)現(xiàn),Struts2提供了一個(gè)StrutsTypeConverter抽象類,這個(gè)抽象類是DefaultConverter的子類。實(shí)現(xiàn)了方法,并提供了2個(gè)不同轉(zhuǎn)換方向的方法:Object convertToString(Map context,String values,Cl
15、ass toClass)和String convertFromString(Map context,Object o)。 轉(zhuǎn)換器三、注冊應(yīng)用 實(shí)現(xiàn)了自定義類型轉(zhuǎn)換器之后,將該類型轉(zhuǎn)換器注冊在Web應(yīng)用中,Struts2框架才可以正常使用該類型轉(zhuǎn)換器。 關(guān)于類型轉(zhuǎn)換器的注冊方式,主要有3種: A、注冊局部類型轉(zhuǎn)換器:僅僅對(duì)某個(gè)Action的屬性起作用。 B、注冊全局類型轉(zhuǎn)換器:對(duì)所有Action的特定類型的屬性都會(huì)生效。 C、使用JDK1.5的注釋來注冊類型轉(zhuǎn)換器:通過注釋方式來生成類型轉(zhuǎn)換器。 1、局部類型轉(zhuǎn)換器 提供如下格式的文件 文件名: ActionN
16、perties 內(nèi)容:多個(gè)propertyName(屬性名)=類型轉(zhuǎn)換器類(含包名),如 date=com.aumy.DateConverter 存放位置:和ActionName類相同路徑。 2、全局類型轉(zhuǎn)換器 提供如下格式的文件 文件名: perties 內(nèi)容: 多個(gè)“復(fù)合類型對(duì)應(yīng)類型轉(zhuǎn)換器”項(xiàng)組成,如 java.Util.Date=com.aumy.DateConverter 存放位置:WEB-INF/classes/目錄下。 轉(zhuǎn)換器struts2內(nèi)建類型轉(zhuǎn)換器內(nèi)建類型轉(zhuǎn)換器如下類型可以相互轉(zhuǎn)化:boolean和Boolean:完成字符串和布爾值之間的轉(zhuǎn)換; char和Character:完成字符串和字符之間的轉(zhuǎn)換; int和In
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合作合同范本供參考
- 2025安置房買賣合同書范本
- 2025全國合同范本
- 湖南省郴州市多校聯(lián)考2024-2025學(xué)年高三下學(xué)期4月綜合性模擬考試英語試題(含解析無聽力音頻有聽力原文)
- 廣東省廣州市2024-2025學(xué)年高一下學(xué)期期中考試英語試題
- 2025年疆維吾爾自治區(qū)阿勒泰地區(qū)中考二模歷史試題(含答案)
- 湖北省恩施市龍鳳初中2024-2025學(xué)年八年級(jí)下學(xué)期期中道德與法治考試題(無答案)
- 環(huán)保設(shè)備融資租賃合同協(xié)議
- 電子軟件租賃合同協(xié)議
- 現(xiàn)價(jià)出售房屋合同協(xié)議
- 《企業(yè)財(cái)務(wù)決算報(bào)表》課件
- 圖書館讀書會(huì)服務(wù)合同
- 排水工程(下)重點(diǎn)
- 基于STM32單片機(jī)的智能停車場車位管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 《土地管理法解析》課件
- 大數(shù)據(jù)開發(fā)工程師招聘面試題與參考回答(某世界500強(qiáng)集團(tuán))2025年
- 養(yǎng)老院查房巡視管理制度
- 按摩店技師免責(zé)協(xié)議書
- 聲音與情緒管理
- 直播中控轉(zhuǎn)正述職報(bào)告
- 史寧中:義務(wù)教育數(shù)學(xué)課標(biāo)(2022年版)解讀
評(píng)論
0/150
提交評(píng)論