JSP 開(kāi)發(fā)之Struts2內(nèi)建自定義攔截器
JSP 開(kāi)發(fā)之Struts2內(nèi)建自定義攔截器
Struts2的自定義攔截器主要用于解析請(qǐng)求參數(shù),將請(qǐng)求參數(shù)賦值給Action屬性,執(zhí)行數(shù)據(jù)校驗(yàn),文件上傳等等操作。當(dāng)需要擴(kuò)展Struts2的功能時(shí),我們只需要提供相應(yīng)的攔截器并將它配置到Struts2容器中即可;當(dāng)我們不需要使用的時(shí)候,只需要取消它在Struts2容器中的配置就行了。
1>配置攔截器主要使用四個(gè)配置元素:
:用于配置自定義攔截器
:用于引用攔截器或者攔截器棧
:用于配置自定義攔截器棧,一個(gè)攔截器棧由多個(gè)攔截器構(gòu)成,也可以包含其他的攔截器棧
:擁有配置參數(shù)
<!--配置自定義攔截器-->
<interceptor name="攔截器名" class="實(shí)現(xiàn)類">
<param name>..</param>
...
</interceptor>
<!--配置攔截器棧,用于一次性過(guò)引用多個(gè)攔截器-->
<interceptor-stack name="攔截器棧名">
<interceptor-ref name="攔截器1" />
<interceptor-ref name="攔截器2">
<param name>..</param>
...
</interceptor-ref>
<!--也可以引用攔截器棧-->
<interceptor-ref name="攔截器棧名" />
</interceptor-stack>
2>配置好了攔截器之后,就可以在元素中使用該攔截器了,使用自定義攔截器時(shí),還必須顯示使用系統(tǒng)默認(rèn)的攔截器defaultStack。
<package ..>
<!--配置包下所有Action的默認(rèn)攔截器--》
<!--如果Action配置了自己的攔截器,那么默認(rèn)攔截器將不會(huì)配置到該Action下-->
<default-interceptor-ref name="defaultStack" />
<action ...>
<!--配置自己的interceptor攔截器-->
<interceptor-ref name="myInterceptor" />
<!--因?yàn)橐呀?jīng)配置了自己的攔截器,所以包默認(rèn)配置攔截器將不作用,因此需要自己顯示配置defaultStack系統(tǒng)默認(rèn)攔截器-->
<interceptor-ref name="defaultStack" />
</action>
</package>
3>用戶自定義攔截器:Struts2提供了Interceptor攔截器原生接口:
public interface Interceptor extends Serializable
{
//初始化攔截器的回調(diào)方法
void init() ;
//實(shí)現(xiàn)攔截的處理方法
String intercept(ActionInvocation invocation) throws Exception ;
//銷毀攔截器之前的回調(diào)方法
void destroy() ;
}
因此,用戶自定義攔截器類需要實(shí)現(xiàn)該接口并提供該接口中的所有抽象方法的實(shí)現(xiàn)。不過(guò)Struts2還提供了該接口的一個(gè)直接實(shí)現(xiàn)類:AbstractInterceptor,該類提供了init()和destroy()方法的實(shí)現(xiàn),我們只需要重寫intercept()攔截方法即可:
public class simpleInterceptor extends AbstractInterceptor
{
private String username ;
private String password ;
//omit setter and getter methods
@Override
public String intercept(ActionInvocation invocation) throws Exception
{
//獲取被攔截的Action實(shí)例
LoginAction action = (LoginAction)invocation.getAction() ;
System.out.println("開(kāi)始攔截:" + new Date()) ;
//取得開(kāi)始執(zhí)行Action處理方法的時(shí)間
long start = System.currentTimeMillis() ;
//回調(diào)執(zhí)行Action被攔截的處理方法
String result = invocation.invoke() ;
System.out.println("結(jié)束執(zhí)行:" + new Date()) ;
//取得執(zhí)行Action處理方法之后的時(shí)間
Long end = System.currentTimeMillis() ;
System.out.println("執(zhí)行用時(shí):" + (end-start) +"ms") ;
return result ;
}
}
上面提供的AbstractInterceptor類定義的攔截器會(huì)攔截Action內(nèi)的所有處理方法,如果只想攔截指定的方法,或者想指定哪些方法攔截,哪些方法不攔截,可以使用Struts2提供的MethodFilterInterceptor類,該類是AbstractInterceptor類的子類,提供了下面三個(gè)主要的方法:
1>String doIntercept(ActionInvocation invocation) throws Exception:同intercept()方法作用一樣
2>void setIncludeMethods(String includeMethods):設(shè)置需要被攔截的方法名
3>void setExcludeMethods(String excludeMethods):設(shè)置不需要被攔截的方法名
其中兩個(gè)setter方法可以在配置該攔截器時(shí)通過(guò)param元素來(lái)指定屬性值
<interceptor name="simpleIntercept2" class="com.chengxi.SimpleInterceptor2"> <param name="includeMethods">login,execute</param> <param name="excludeMethods">regiset</param> </interceptor>
4>攔截器的執(zhí)行順序:如果有多個(gè)攔截器同時(shí)作用于一個(gè)Action上時(shí),遵循:在Action的控制方法執(zhí)行之前,先定義的攔截器先作用執(zhí)行;在Action的控制方法執(zhí)行之后,先定義的攔截器后作用執(zhí)行;也就是在invocation.invoke()方法這個(gè)點(diǎn)進(jìn)行分界
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
通過(guò)JDBC連接oracle數(shù)據(jù)庫(kù)的十大技巧
通過(guò)JDBC連接oracle數(shù)據(jù)庫(kù)的十大技巧...2006-10-10
JSP動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)概述
這篇文章主要介紹了JSP動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)概述,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
JSP實(shí)現(xiàn)簡(jiǎn)單的用戶登錄并顯示出用戶信息的方法
這篇文章主要介紹了JSP實(shí)現(xiàn)簡(jiǎn)單的用戶登錄并顯示出用戶信息的方法,通過(guò)簡(jiǎn)單的登陸及登陸顯示頁(yè)面實(shí)現(xiàn)這一功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
jsp頁(yè)面iframe高度自適應(yīng)的js代碼
iframe高度自適應(yīng),獲取自身高度,之后將高度作為參數(shù)傳遞,在窗口加載后執(zhí)行就可以了2014-09-09
Hibernate 修改數(shù)據(jù)的實(shí)例詳解
這篇文章主要介紹了Hibernate 修改數(shù)據(jù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下2017-10-10
jsp+Servlet編程實(shí)現(xiàn)驗(yàn)證碼的方法
這篇文章主要介紹了jsp+Servlet編程實(shí)現(xiàn)驗(yàn)證碼的方法,結(jié)合實(shí)例分析了jsp+servlet實(shí)現(xiàn)驗(yàn)證碼所需的相關(guān)類與具體功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
JSP結(jié)合js實(shí)現(xiàn)img中src更新請(qǐng)求的方法
這篇文章主要介紹了JSP結(jié)合js實(shí)現(xiàn)img中src更新請(qǐng)求的方法,以實(shí)例形式較為詳細(xì)的分析了前臺(tái)頁(yè)面js控制及后臺(tái)功能action部分實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10

