摘 要:攔截器是Struts2框架的靈魂,它完成了Struts2框架的絕大部分功能。開發者既可以自由選擇內建攔截器隨意組合應用,又可以開發自定義的攔截器來實現特定的功能。本文較詳盡地解析了如何開發和配置攔截器。
關鍵詞:Struts2框架 攔截器 開發和配置 Interceptor接口
一、引言
在早期的Struts1框架中,很多基本的通用控制邏輯都固化在系統的核心控制器中,靈活性和擴展性都比較差。Struts2改變了這種做法,它把大部分核心控制器需要完成的工作按功能定義成一個個獨立的攔截器,開發者可以自由選擇,隨意組合,極大地提高了靈活性和擴展性。
攔截器體系是Struts2框架的一個重要組成部分,大量的內建攔截器完成了這個框架的大部分操作。Struts2的攔截器在使用上非常簡單方便,只要在配置文件中應用攔截器,就可以直接使用,不需要使用的時候在配置中取消即可。Struts2的攔截器由struts-default.xml、struts.xml等配置文件來管理,開發者可以很容易開發和配置自己的攔截器。
二、配置和使用攔截器
攔截器的定義過程很簡單,只需要在struts.xml文件中為攔截器類指定一個攔截器名。定義攔截器使用元素,其基本格式如下:
上述格式可以實現大多數情況下的攔截器配置。如果需要在配置攔截器時傳入參數,可以在元素中使用子元素。
此外,如果有多個攔截器常常一起使用,還可以將它們連在一起組成攔截器棧,使用時就可以直接調用這個攔截器棧。定義攔截器棧使用元素。
定義了攔截器(包含攔截器棧)之后,就可以使用這個攔截器來攔截Action了,在Action的execute方法執行之前將會先執行攔截器的攔截行為。
通過元素可以在Action內使用攔截器,配置語法與配置攔截器棧時引用攔截器的語法是一樣的。
系統中使用多個攔截器時,攔截器的執行順序與配置順序有很大的關系。通常認為,先配置的攔截器會先執行,但實際上,在Action的控制邏輯方法執行之前,位于攔截器鏈前面的攔截器將先發生作用,在Action的控制邏輯邏輯方法執行之后,位于攔截器鏈前面的攔截器將后發生作用。因此,開發時需要根據實際執行要求合理進行配置。
三、配置默認攔截器
配置一個包時,可以給它指定默認攔截器(棧),一經指定,如果該包中的Action沒有顯式指定攔截器,則默認的攔截器將會起作用。而一旦為該包中的Action顯式指定了某個攔截器,則默認的攔截器不會起作用,如果需要使用則必須手動配置。
配置默認攔截器使用元素,在子元素中使用,表明為該包下所有的Action配置默認的攔截器。每個包只能指定一個默認攔截器,如果想要使用多個攔截器,可以先把它們配置成一個攔截器棧。
四、實現攔截器類
雖然Struts2框架提供了大量的內置攔截器來實現Web應用的通用功能,但開發者在軟件開發時可能還有一些系統邏輯相關的通用功能需要通過自定義的攔截器來實現。開發者在定義自己的攔截器類時,需要實現Interceptor接口,該接口包含3個方法:
init方法主要用于初始化資源,在該攔截器被實例化之后執行攔截之前執行且只執行一次。destroy方法用于關閉或銷毀在init方法里打開的資源,在攔截器實例被銷毀之前執行。intercept方法是開發者需要實現的攔截操作,它返回一個字符串作為邏輯視圖。該方法的ActionInvocation參數包含了被攔截的Action的引用,通過調用該方法的invoke方法將控制權轉給下一個攔截器或Action的execute方法。這個參數可以獲得被攔截的Action實例,可以實現將HTTP請求中的參數解析出來,設置成Action屬性,也可以直接將HTTP請求中的HttpServletRequest實例和HttpServletResponse實例傳給Action。
五、攔截方法的攔截器
在默認情況下,如果某個Action定義了攔截器,這個攔截器會攔截該Action中的所有方法。如果不希望攔截所有方法,可以使用攔截器的方法過濾。
實現支持方法過濾的攔截器類,需要繼承MethodFilterInter-ceptor類。該類是AbstractInterceptor類的子類,它重寫了intercept方法,實現了對Action的攔截行為,但是只實現了方法的過濾,至于真正的攔截邏輯還需要開發者在另外提供的一個doIntercept方法中實現。
在MethodFilterInterceptor類中增加了兩個方法用來指定需要或不需要被攔截的方法:
1.setExcludeMethods方法:設置“不攔截名單”,所有在參數中列出的方法都不會被攔截。
2.setIncludeMethods方法:設置“攔截名單”,所有在參數中列出的方法都會被攔截。
由于MethodFilterInterceptor類包含了這兩個方法,所以它的子類也會獲得這兩個方法,可以在配置文件中指定需要攔截或不需要攔截的方法。
參考文獻:
[1]李剛.輕量級Java EE企業應用實戰——Struts2+Spring+ Hibernate整合開發.電子工業出版社,2010
[2]陳亞輝,繆勇.Struts2+Spring+Hibernate框架技術與項目實戰.清華大學出版社,2012
[3]清華大學計算機與信息管理中心.輕量級Java EE體系架構程序開發.中國鐵道出版社,2010
作者簡介:林海菁(1975-),女,江西南昌人,副教授,計算機應用專業碩士。