一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Struts2學(xué)習(xí)教程之?dāng)r截器機(jī)制與自定義攔截器

Struts2學(xué)習(xí)教程之?dāng)r截器機(jī)制與自定義攔截器

2021-04-25 12:05果凍想 Java教程

這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)基礎(chǔ)教程之?dāng)r截器機(jī)制與自定義攔截器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

攔截器體系是struts2框架的重要組成部分,不夸張的說,沒有攔截器體系,也就沒有這么好用的struts2框架了。在struts2框架中,大量的攔截器完成了很多基礎(chǔ)的功能,比如,params攔截器負(fù)責(zé)解析http請求的參數(shù),并設(shè)置action的屬性;servlet-config攔截器直接將http請求中的httpservletrequest實(shí)例和httpservletresponse實(shí)例傳給action;fileupload攔截器則負(fù)責(zé)解析請求參數(shù)中的文件域,并將一個文件域設(shè)置成action的三個屬性......這一切的一切都是由內(nèi)建的攔截器來完成的。所以,掌握了struts2中攔截器的使用原理與方式,也就把握住了struts2框架的“命脈”。

但是學(xué)習(xí)struts2到現(xiàn)在,除了在web.xml中配置了一個strutsprepareandexecutefilter過濾器外,還沒有接觸其它的什么攔截器,那為什么我們的應(yīng)用能夠很好的運(yùn)行呢?實(shí)際上,struts2已經(jīng)默認(rèn)啟用了大量通用的攔截器,只要配置action的package繼承了struts-default包,這些攔截器就會起作用。下面來看看struts2內(nèi)建的攔截器。

struts2內(nèi)建的攔截器

在struts2框架中有很多內(nèi)建的攔截器,這些攔截器幾乎完成了struts2框架70%的工作,包括解析請求參數(shù),將請求參數(shù)賦值給action屬性等,struts2這種靈巧的設(shè)計(jì),很大程度上得益于攔截器的設(shè)計(jì);當(dāng)需要擴(kuò)展struts2功能時,只需要提供對應(yīng)攔截器,并將它配置在struts2容器中即可。

這些內(nèi)建的攔截器以name-class對的形式配置在struts-default.xml文件中,其中name是攔截器名字,就是以后使用該攔截器的唯一標(biāo)識;class則指定了該攔截器的實(shí)現(xiàn)類。對于這些內(nèi)建的攔截器的詳細(xì)介紹,請參見官方文檔

配置攔截器

在struts.xml文件中定義攔截器只需為攔截器類指定一個攔截器名,就完成了攔截器定義。定義攔截器使用<interceptor.../>,例如:

?
1
2
3
4
<!-- 通過指定攔截器名和攔截器實(shí)現(xiàn)類來定義攔截器 -->
<interceptor name="攔截器名" class="攔截器實(shí)現(xiàn)類">
  <param name="參數(shù)名">參數(shù)值</param>
</interceptor>

除此之外,還可以把多個攔截器連在一起組成攔截器棧,在攔截器中使用<interceptor-ref .../>來定義攔截器引用。例如:

?
1
2
3
4
5
<interceptor-stack name="攔截器棧一">
  <interceptor-ref name="攔截器一"/>
  <interceptor-ref name="攔截器二"/>
  ...
</interceptor-stack>

從程序結(jié)構(gòu)上來看,攔截器棧由多個攔截器組成;但是從程序功能上來說,攔截器棧和攔截器是一樣的,它們包含的方法都會在action的execute方法執(zhí)行之前自動執(zhí)行。所以,我們完全可以把攔截器棧當(dāng)成一個更大的攔截器。

由于攔截器棧和攔截器是一致的,所以攔截器棧中又可以包含攔截器棧,例如:

?
1
2
3
4
<interceptor-stack name="攔截器棧二">
  <interceptor-ref name="modeldriven"/>
  <interceptor-ref name="攔截器棧一"/>
</interceptor-stack>

使用攔截器

一旦定義了攔截器棧和攔截器后,就可以使用這個攔截器棧或攔截器來攔截action了,攔截器的攔截行為將會在action的execute方法執(zhí)行之前被執(zhí)行。

通過使用<interceptor-ref .../>元素可以在action內(nèi)使用攔截器,在action中使用攔截器的配置語法與配置攔截器棧時引用攔截器的語法完全一樣。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
<action name="login" class="com.jellythink.practise.loginaction">
  <result name="error">/error.jsp</result>
  <result name="success">/welcome.jsp</result>
  <!-- 攔截器棧 -->
  <interceptor-ref name="defaultstack"/>
  <!-- 攔截器 -->
  <interceptor-ref name="test1"/>
  <!-- 帶參數(shù)的攔截器 -->
  <interceptor-ref name="test2">
    <param name="key">動態(tài)參數(shù)</param>
  </interceptor-ref>
</action>

這樣配置完成以后,在執(zhí)行downloadaction之前,這三個攔截器都會起作用。

配置默認(rèn)攔截器

當(dāng)配置一個包時,可以為其指定默認(rèn)攔截器。一旦為某個包指定了默認(rèn)的攔截器,如果該包中的action沒有顯式指定攔截器,則默認(rèn)的攔截器將會起作用。但是,一旦我們?yōu)樵摪械腶ction顯式應(yīng)用了某個攔截器,則默認(rèn)的攔截器不會起作用;如果該action需要使用該默認(rèn)攔截器,則必須手動配置該攔截器的引用。

只有當(dāng)action中沒有顯式應(yīng)用攔截器時,該action所在包的默認(rèn)攔截器才會生效。

配置默認(rèn)攔截器使用<default-interceptor-ref.../>元素,該元素作為<package.../>元素的子元素使用,為該包下的所有action配置默認(rèn)的攔截器。例如:

?
1
<default-interceptor-ref name="默認(rèn)攔截器"/>

也可以為默認(rèn)攔截器指定參數(shù),例如:

?
1
2
3
<default-interceptor-ref name="默認(rèn)攔截器">
  <param name="參數(shù)名">參數(shù)值</param>
</default-interceptor-ref>

在struts-default.xml文件中,配置了一個名為struts-default的抽象包,在該包中定義了名為defaultstack的默認(rèn)攔截器引用。當(dāng)我們定義的包繼承struts-default包時,也繼承了它的默認(rèn)攔截器棧:defaultstack,這也意味著,如果我們不為action顯式地應(yīng)用攔截器,則defaultstack攔截器棧會自動生效。

自定義攔截器

1>.添加一個類,讓它繼承abstractinterceptor類,或者實(shí)現(xiàn)interceptor接口

?
1
2
3
4
5
6
7
8
9
10
public class timeinterceptor extends abstractinterceptor {
/**
* 攔截器的核心方法intercept的返回值是一個字符串
*/
@override
public string intercept(actioninvocation invocation) throws exception {
// todo auto-generated method stub
return "login";
}
}

2>.在struts.xml的package中添加interceptors子節(jié)點(diǎn),并在它下面添加interceptor節(jié)點(diǎn)

?
1
2
3
4
5
<package name="goods" namespace="/goods" extends="common-pkg">
<interceptors>
<interceptor name="timeinterceptor" class="com.wskj.struts2.interceptor.timeinterceptor"></interceptor>
</interceptors>
</package>

3>.在想被攔截的action節(jié)點(diǎn)下添加子節(jié)點(diǎn)interceptor-ref

?
1
2
3
4
<action name="list_category" class="com.wskj.struts2.controller.categoryaction" method="list">
<interceptor-ref name="timeinterceptor"></interceptor-ref>
<result name="list" type="dispatcher">/pages/category/list.jsp</result>
</action>

總結(jié)

這篇文章對stuts2中的核心——攔截器進(jìn)行了一個初步的總結(jié),在后面的文章中,我們會實(shí)現(xiàn)一個我們自己的攔截器,并將這篇文章中總結(jié)的知識點(diǎn)進(jìn)行運(yùn)用。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://www.jellythink.com/archives/303

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品视频久久久久 | 欧美老人与小伙子性生交 | 国产a一级 | 国产在线看片护士免费视频 | 成年人视频在线播放 | 色里番52kkm全彩 | 欧美一区二区三区gg高清影视 | 亚洲性视频在线观看 | 免费国产一级观看完整版 | 久久伊人电影 | 女人叉开腿让男人桶 | 欧美成a人片免费看久久 | 波多野结衣之高校教师 | nxgx欧美 | 欧美free激情野战hd | 亚洲电影成人 成人影院 | 久久99re2在线视频精品 | 奇米7777第四色 | 欧洲美女啪啪 | 色综合中文字幕天天在线 | 男人懂得网站 | 国产成人福利色视频 | 双性肉文h | 午夜宅男宅女看在线观看 | 天堂中文在线免费观看 | caoporn草棚在线视频 | 午夜久久免影院欧洲 | 午夜影院费试看黄 | 欧美成年黄网站色高清视频 | 九九大香尹人视频免费 | 亚洲高清成人 | 国产一区二区视频在线观看 | 国产剧情一区 | 国产91亚洲精品 | 国产精品天天看特色大片不卡 | 草莓永久地域网名入2022 | 91最新入口| 男人躁女人p | 男人天堂中文字幕 | 丰满岳乱妇在线观看视频国产 | 国产麻豆91网在线看 |