java 攔截器ajax_(轉)攔截器深入實踐 - JAVA XML JAVASCRIPT AJAX CSS - BlogJava

Interceptor的定義

我們來看一下Interceptor的接口的定義:

Java代碼 icon_copy.gif

publicinterfaceInterceptorextendsSerializable?{

/**

*?Called?to?let?an?interceptor?clean?up?any?resources?it?has?allocated.

*/

voiddestroy();

/**

*?Called?after?an?interceptor?is?created,?but?before?any?requests?are?processed?using

*?{@link?#intercept(com.opensymphony.xwork2.ActionInvocation)?intercept}?,?giving

*?the?Interceptor?a?chance?to?initialize?any?needed?resources.

*/

voidinit();

/**

*?Allows?the?Interceptor?to?do?some?processing?on?the?request?before?and/or?after?the?rest?of?the?processing?of?the

*?request?by?the?{@link?ActionInvocation}?or?to?short-circuit?the?processing?and?just?return?a?String?return?code.

*

*?@return?the?return?code,?either?returned?from?{@link?ActionInvocation#invoke()},?or?from?the?interceptor?itself.

*?@throws?Exception?any?system-level?error,?as?defined?in?{@link?com.opensymphony.xwork2.Action#execute()}.

*/

String?intercept(ActionInvocation?invocation)throwsException;

}

public interface Interceptor extends Serializable {

/**

* Called to let an interceptor clean up any resources it has allocated.

*/

void destroy();

/**

* Called after an interceptor is created, but before any requests are processed using

* {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving

* the Interceptor a chance to initialize any needed resources.

*/

void init();

/**

* Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the

* request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code.

*

* @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself.

* @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}.

*/

String intercept(ActionInvocation invocation) throws Exception;

}

Interceptor的接口定義沒有什么特別的地方,除了init和destory方法以外,intercept方法是實現整個攔截器機制的核心方法。而它所依賴的參數ActionInvocation則是我們之前章節中曾經提到過的著名的Action調度者。

我們再來看看一個典型的Interceptor的抽象實現類:

Java代碼 icon_copy.gif

publicabstractclassAroundInterceptorextendsAbstractInterceptor?{

/*?(non-Javadoc)

*?@see?com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)

*/

@Override

publicString?intercept(ActionInvocation?invocation)throwsException?{

String?result?=null;

before(invocation);

//?調用下一個攔截器,如果攔截器不存在,則執行Action

result?=?invocation.invoke();

after(invocation,?result);

returnresult;

}

publicabstractvoidbefore(ActionInvocation?invocation)throwsException;

publicabstractvoidafter(ActionInvocation?invocation,?String?resultCode)throwsException;

}

public abstract class AroundInterceptor extends AbstractInterceptor {

/* (non-Javadoc)

* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)

*/

@Override

public String intercept(ActionInvocation invocation) throws Exception {

String result = null;

before(invocation);

// 調用下一個攔截器,如果攔截器不存在,則執行Action

result = invocation.invoke();

after(invocation, result);

return result;

}

public abstract void before(ActionInvocation invocation) throws Exception;

public abstract void after(ActionInvocation invocation, String resultCode) throws Exception;

}

在這個實現類中,實際上已經實現了最簡單的攔截器的雛形。或許大家對這樣的代碼還比較陌生,這沒有關系。我在這里需要指出的是一個很重要的方法invocation.invoke()。這是ActionInvocation中的方法,而ActionInvocation是Action調度者,所以這個方法具備以下2層含義:

1. 如果攔截器堆棧中還有其他的Interceptor,那么invocation.invoke()將調用堆棧中下一個Interceptor的執行。

2. 如果攔截器堆棧中只有Action了,那么invocation.invoke()將調用Action執行。

所以,我們可以發現,invocation.invoke()這個方法其實是整個攔截器框架的實現核心。基于這樣的實現機制,我們還可以得到下面2個非常重要的推論:

1. 如果在攔截器中,我們不使用invocation.invoke()來完成堆棧中下一個元素的調用,而是直接返回一個字符串作為執行結果,那么整個執行將被中止。

2. 我們可以以invocation.invoke()為界,將攔截器中的代碼分成2個部分,在invocation.invoke()之前的代碼,將會在Action之前被依次執行,而在invocation.invoke()之后的代碼,將會在Action之后被逆序執行。

由此,我們就可以通過invocation.invoke()作為Action代碼真正的攔截點,從而實現AOP。

Interceptor攔截類型

從上面的分析,我們知道,整個攔截器的核心部分是invocation.invoke()這個函數的調用位置。事實上,我們也正式根據這句代碼的調用位置,來進行攔截類型的區分的。在Struts2中,Interceptor的攔截類型,分成以下三類:

1. before

before攔截,是指在攔截器中定義的代碼,它們存在于invocation.invoke()代碼執行之前。這些代碼,將依照攔截器定義的順序,順序執行。

2. after

after攔截,是指在攔截器中定義的代碼,它們存在于invocation.invoke()代碼執行之后。這些代碼,將一招攔截器定義的順序,逆序執行。

3. PreResultListener

有的時候,before攔截和after攔截對我們來說是不夠的,因為我們需要在Action執行完之后,但是還沒有回到視圖層之前,做一些事情。Struts2同樣支持這樣的攔截,這種攔截方式,是通過在攔截器中注冊一個PreResultListener的接口來實現的。

Java代碼 icon_copy.gif

publicinterfacePreResultListener?{

/**

*?This?callback?method?will?be?called?after?the?Action?execution?and?before?the?Result?execution.

*

*?@param?invocation

*?@param?resultCode

*/

voidbeforeResult(ActionInvocation?invocation,?String?resultCode);

}

public interface PreResultListener {

/**

* This callback method will be called after the Action execution and before the Result execution.

*

* @param invocation

* @param resultCode

*/

void beforeResult(ActionInvocation invocation, String resultCode);

}

在這里,我們看到,Struts2能夠支持如此多的攔截類型,與其本身的數據結構和整體設計有很大的關系。正如我在之前的文章中所提到的:

downpour 寫道

因為Action是一個普通的Java類,而不是一個Servlet類,完全脫離于Web容器,所以我們就能夠更加方便地對Control層進行合理的層次設計,從而抽象出許多公共的邏輯,并將這些邏輯脫離出Action對象本身。

我們可以看到,Struts2對于整個執行的劃分,從Interceptor到Action一直到Result,每一層都職責明確。不僅如此,Struts2還為每一個層次之前都設立了恰如其分的插入點。使得整個Action層的擴展性得到了史無前例的提升。

Interceptor執行順序

Interceptor的執行順序或許是我們在整個過程中最最關心的部分。根據上面所提到的概念,我們實際上已經能夠大致明白了Interceptor的執行機理。我們來看看Struts2的Reference對Interceptor執行順序的一個形象的例子。

如果我們有一個interceptor-stack的定義如下:

Xml代碼 icon_copy.gif

那么,整個執行的順序大概像這樣:

23045c94-b72a-3c04-9c6c-06ad4392d743.gif

在這里,我稍微改了一下Struts2的Reference中的執行順序示例,使得整個執行順序更加能夠被理解。我們可以看到,遞歸調用保證了各種各樣的攔截類型的執行能夠井井有條。

請注意在這里,每個攔截器中的代碼的執行順序,在Action之前,攔截器的執行順序與堆棧中定義的一致;而在Action和Result之后,攔截器的執行順序與堆棧中定義的順序相反。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php學的是什么意思_為什么要學習PHP?到底什么是PHP?

為什么要學習PHP?到底什么是PHP?PHP可以做什么?相信這樣的問題困擾著很多的人,在我沒工作之前,都沒有聽說過PHP,自從工作后,慢慢接觸到代碼,慢慢知道什么是PHP。PHP是做網站一種語言,很多工程師都使用PH…

php 多數據庫聯合查詢,php如何同時連接多個數據庫_PHP教程

下面是一個函數能夠保證連接多個數據庫的下不同的表的函數,可以收藏一下,比較實用,測試過是有用的。function mysql_oper($oper,$db,$table,$where1,$limit10){$connmysql_connect(localhost,like,admin,true) or mysql_error();mysql_select…

java判斷有沒有修改,java字節碼判斷對象應用是否被修改

原創1 背景在學習并發的時候看到了ConcurrentLinkedQueue隊列的源碼,剛開始的時候是看網上的帖子,然后就到IDE里邊看源碼,發現offer()方法在1.7版的時候有過修改。樓主的問題不是整個方法,而是其中的一截代碼“(t ! (t tail))”&…

php接口 含義,php晉級必備:一文讀懂php接口特點和使用!

PHP接口與類是什么關系?前面提到了php中抽象類和抽象方法,今天給大家談談php中接口技術。在PHP中每個類只能繼承一個父類,如果聲明的新類繼承了抽象類實現了以后,這個新類就不能有其它的父類了。但是在實際中需要繼承多個類實現功…

php獲取不重復的隨機數字,php如何生成不重復的隨機數字

【摘要】PHP即“超文本預處理器”,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。下面是php如何生成不重復的隨機數字,讓我們…

java 素數乘積,求助2424379123 = 兩個素數的乘積,求這兩個素數?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓import java.util.ArrayList;import java.util.Date;public class Test {static ArrayList list new ArrayList();/*** 初始化素數表* return*/public static ArrayList initArrayList() {list.add(2);list.add(3);list.add(5);li…

php header什么意思,php header是什么意思

header函數在PHP中是發送一些頭部信息的, 我們可以直接使用它來做301跳轉等,下面我來總結關于header函數用法與一些常用見問題解決方法。發送一個原始 HTTP 標頭[Http Header]到客戶端。標頭 (header) 是服務器以 HTTP 協義傳 HTML 資料到瀏覽器前所送出的字串&…

matlab dct稀疏系數,Matlab DCT詳解

轉自:http://blog.csdn.net/ahafg/article/details/48808443DCT變換DCT又稱離散余弦變換,是一種塊變換方式,只使用余弦函數來表達信號,與傅里葉變換緊密相關。常用于圖像數據的壓縮,通過將圖像分成大小相等(一般為8*8)…

matlab驗潮站,驗潮站的作用是什么

驗潮站的作用是什么?驗潮站的建成投入使用,可實時觀測沿海潮汐等觀測要素,為潮汐預報、赤潮的發生、風暴潮預警報、海嘯預警及海平面變化提供基礎數據保障以及預測,同時為科學開發海洋提供有力的支持,為海洋經濟健康發展保駕護航…

答題闖關php,成語答題闖關紅包流量主小程序源碼

修復紅包頁面提現提示文字得疊的問題限制過關紅包每天領取個數左側影響美觀的小程序鏈接的文字去掉了增加版本號沒有問題的可以暫不更新此版本修復前一版本客服提現沒有授權的問題管理后臺增加主動推送客服消息(紅包)給用戶的功能,喚醒用戶使用自定義分享的配置增加…

php是音頻嗎,只要是用PHP和JS發布的HTML5是否可以播放音頻?

我正在嘗試創建一個可以上傳播客的頁面。我想擁有“發布”或“取消發布”的能力。我讓每個播客添加到一個數據庫中,包含它的信息和發布列,可以是真是假。目前我使用以下代碼PHP:if(isPublished()){header(Cache-Control: max-age100000);header(Content-Transfer-Encoding: bin…

php收購,php中文網收購全國用戶量最大的phpstudy集成開發環境揭秘

phpstudy介紹2008年第一個版本誕生,至今已有9年,該程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安裝,無須配置即可使用,是非常方便、好用的PHP調試環境.該程序不僅包括PHP調試環境,還包括了開發工具、開發手冊等.總之學習PHP只需一個包…

復雜電網三相短路計算的matlab仿真,復雜電網三相短路計算的MATLAB仿真電力系統分析課設報告 - 圖文...

XG?XT**35.3100??0.11003000.856100???0.05100120發電廠B:XG?XT**17.65100 ??0.051003000.853100???0.025100120發電廠H:XG?XT**17.65100??0.051003000.8512100???0.1100120變電站C:3.6100*XT???0.03100120 線路&#x…

php 將多個數組 相同的鍵重組,PHP – 合并兩個類似于array_combine但具有重復鍵的數組...

你可以使用array_map:$arrKeys array(str, str, otherStr);$arrVals array(1.22, 1.99, 5.17);function foo($key, $val) {return array($key>$val);}$arrResult array_map(foo, $arrKeys, $arrVals);print_r($arrResult);Array([0] > Array([str] > 1.…

C php反序列化,php反序列化漏洞 - anansec的個人空間 - OSCHINA - 中文開源技術交流社區...

反序列化本身是沒有漏洞的,但是當反序列化和一些魔術方法結合使用時就可能會產生安全風險。常用的魔術方法__wakeup反序列化漏洞示例(__wekeup)class A{var $test "demo";function __wakeup(){eval($this->test);}}$b new A();$c serialize($b);$a …

oracle lob值是什么,關于Oracle數據庫LOB大字段總結

概述在ORACLE數據庫中,DBA_OBJECTS視圖中OBJECT_TYPE為LOB的對象是什么東西呢?其實OBJECT_TYPE為LOB就是大對象(LOB),它指那些用來存儲大量數據的數據庫字段。Oracle 11gR2 文檔:http://download.oracle.com/docs/cd/E11882_01/Ap…

php 統計目錄大小,PHP 統計目錄大小

例01:function dirsize($dir){$size0;//打開目錄$ddopendir($dir); //--opendir("")打開一個目錄,返回此目錄的資源句柄readdir($dd); //--通過讀兩次,來跳過特殊目錄"."、".."readdir($dd);//遍歷目錄累加大小while($f …

oracle03206,ORACLE數據庫創建表空間ORA-03206報錯的解決方案

Oracle的數據文件大小是有限制的,今天在創建表空間的時候就遇到了問題,限制很簡單,作為DBA必須要了解。測試環境:操作系統:Win7 64位專業版數據庫版本:64位Oracle10.2.0.4DB_NAME:hoegh表空間名…

oracle sql server的區別,oracle與sqlserver的十大區別

http://blog.csdn.net/it_fengli/article/details/8213839 --sql server 與 oracle的區別: --DBMS 數據庫管理系統 --1.數據類型不同。 --sql server 的數據類型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima…

Oracle19C的dbhome,Windows server 安裝Oracle19c (WINDOWS.X64_193000_db_home.zip) 過程碰到的問題總結...

Oracle19c的下載地址:鏈接: https://pan.baidu.com/s/1snqyViOAoeffAztPes_Tvw提取碼: 9kb6Oracle19c的安裝過程:解壓縮安裝包:解壓結果 以管理員方式運行setup開始安裝 一直默認走到安裝完成即可創建用戶cmd執行sqlplus命令,輸入…