java課件-04框架struts29攔截器_第1頁(yè)
java課件-04框架struts29攔截器_第2頁(yè)
java課件-04框架struts29攔截器_第3頁(yè)
java課件-04框架struts29攔截器_第4頁(yè)
java課件-04框架struts29攔截器_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余27頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Struts2本章節(jié)授課目標(biāo)器的概念配置

器使用

器2Struts2框架工作原理圖注意觀察Interceptors3器器?器(Interceptor)是Struts2的一個(gè)重要特性。Struts2框架的大多數(shù)

功能都是通過(guò)

器來(lái)實(shí)現(xiàn)的,像避免表單重復(fù)提交、類型轉(zhuǎn)換、對(duì)象組裝、驗(yàn)證、文件上傳等,都是在器的幫助下實(shí)現(xiàn)的。攔截器之所以稱為“器”,是因?yàn)樗梢栽贏ction執(zhí)行之前或執(zhí)行之后調(diào)用。Struts2將它的功能放到器中實(shí)現(xiàn)而不是分散到Action中實(shí)現(xiàn),有利于系統(tǒng)的解耦,使得功能的實(shí)現(xiàn)類類似于個(gè)人電腦的組裝,變”一個(gè)

器,不需要某個(gè)功能成了可插拔的。需要某個(gè)功能就“就“拔出”。器的作用:① 為action動(dòng)態(tài)添加輸入驗(yàn)證②

對(duì)象組裝(也就是進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換)③

權(quán)限控制④

日志記錄4器器工作過(guò)程5器序號(hào)器名稱作用1alias在請(qǐng)求之間轉(zhuǎn)換名字不同的相似參數(shù)2chain將所有的屬性從前一個(gè)Aciotn復(fù)到當(dāng)前Action中3checkbox添加自動(dòng)的復(fù)選框處理代碼。當(dāng)復(fù)選框未復(fù)選時(shí)采用false值添加到參數(shù)中4基于的名/值設(shè)置Action的屬性5conversionError將類型轉(zhuǎn)換錯(cuò)誤從ActionContext中取出,添加到Action字段錯(cuò)誤中6createSession自動(dòng)創(chuàng)建一個(gè)HttpSession對(duì)象7debugging當(dāng)struts.devMode屬性設(shè)置為true,才有,用于調(diào)試8execAndWait可以用于防止

Action

Http請(qǐng)求超時(shí)9exception提供了異常處理的 功能10fileUpload用于對(duì)文件上傳提供支持11i18n用于支 際化12logger記錄一個(gè)action執(zhí)行的開始和結(jié)束13token檢查傳到Action的token值的有效性,防表單重復(fù)提交6器配置和使用

器前面所介紹的器在struts-default.xml中已經(jīng)進(jìn)行了配置。如果您想要使用上述

器,只需要在應(yīng)用程序struts.xml文件中通過(guò)“<include

file=”struts-default.xml“

/>”將struts-default.xml文件包含進(jìn)來(lái),并繼承其中的struts-default包(package),最后在定義Action時(shí),使用“<interceptor-refname=”xx“

/>”

器或

器棧(interceptorstack)。一旦您繼承了struts-default包(package),所有Action都會(huì)調(diào)用

器棧

——defaultStack。當(dāng)然,在Action配置中加入“<interceptor-ref

name=”xx“

/>”可以覆蓋defaultStack。下面 通過(guò)使用timer 器的使用案例進(jìn)行。7器創(chuàng)建Action類package

com.shinowit;import

com.opensymphony.xwork2.ActionSupport;6L;public

class

TimerInterceptorAction

extends

ActionSupport

{private

static

final

long

serialVersionUID

=

-public

String

execute()

{try{//模擬耗時(shí)的操作Thread.sleep(500);}

catch

(Exception

e)

{e.printStackTrace();}return

SUCCESS;}}8器在Struts2配置xml中定義Action,名為TimerAction,并配置

器<package

name="InterceptorDemo"

extends="struts-default"><action

name="TimerAction"class="com.shinowit.TimerInterceptorAction"><interceptor-ref

name="timer"/><result>/Timer.jsp</result></action></package>器timer缺省沒(méi)有配置在struts-default包中9器timer器執(zhí)行效果1011自定義

器編寫 器類作為“框架(framework)”,可擴(kuò)展性是不可或缺的,因?yàn)槭郎咸峁┤绱素S富的器的能力,恰恰相反,沒(méi)有放之四海而皆準(zhǔn)的東西。雖然,Struts

2為器實(shí)現(xiàn),但是這并不意味

失去創(chuàng)建自定義在Struts

2自定義

器是相當(dāng)容易的一件事。大家在開始著手創(chuàng)建自定義 器前,切記以下原則:器必須是無(wú)狀態(tài)的,不要使用在API提供的ActionInvocation之外的任何東西。原因:Struts

2不能保證為每一個(gè)請(qǐng)求或者action創(chuàng)建一個(gè)實(shí)例,所以如果

器帶有狀態(tài),會(huì)

并發(fā)問(wèn)題。在Struts2中編寫

類,有如下二種方式:實(shí)現(xiàn)Interceptor接口繼承

Interceptor類(一般會(huì)選擇此種方式)12自定義

器器,都需要對(duì)下述三個(gè)方法進(jìn)行編寫 器類無(wú)論選擇哪種方式創(chuàng)建override。三個(gè)方法如下:1. void

init();此方法在

用于初始化器實(shí)例創(chuàng)建之后,intercept()方法被調(diào)用之前調(diào)用,器所需要資源。void

destroy();該方法在

器實(shí)例清除之前調(diào)用,用于

在init()方法中分配的資源。該方法只執(zhí)行一次。String

intercept(ActionInvocation

invocation)

throwsException;該方法在Action執(zhí)行之前被調(diào)用, 器為Action提供的附加功能在該方法中實(shí)現(xiàn)。利用invocation參數(shù),可以獲取action執(zhí)行的狀態(tài)。在intercept()方法中,如果要繼續(xù)執(zhí)行后續(xù)部分,可以調(diào)用invocation.invoke()。13自定義

器器示例代碼自定義package

com.shinowit;import

com.opensymphony.xwork2.ActionInvocation;import

erceptor.

Interceptor;public

class

AroundIntercept

extends Interceptor

{private

static

final

longserialVersionUID

=

1L;@Overridepublic

void

init()

{System.out.println("這是一個(gè)初始化方法");}@Overridepublic

String

intercept(ActionInvocation

invocation)

throws

Exception{String

result

=

"";System.out.println("在action的execute方法執(zhí)行之前動(dòng)作");result=invocation.invoke();System.out.println("在action的execute方法執(zhí)行之后動(dòng)作");return

result;注意:在編寫 器時(shí)要注意, 器必順是無(wú)狀態(tài)的,換句話

說(shuō),在器類中不應(yīng)該有實(shí)例變量。這是因?yàn)閟truts2對(duì)每一個(gè)Action的請(qǐng)求使用的是同一個(gè)

器實(shí)例來(lái)處理,如果

器有狀態(tài),在多線程并 況下,

器的狀態(tài)將不可測(cè)。14自定義

器自定義 器的配置<package

name="InterceptorDemo"

extends="struts-default"><interceptors><interceptor

name="aroundInterceptor"class="com.shinowit.AroundIntercept"></interceptor></interceptors><action

name="TimerAction"class="com.shinowit.TimerInterceptorAction"><interceptor-ref

name="aroundInterceptor"/><interceptor-ref

name="timer"/><result>/Timer.jsp</result></action></package>15自定義

器時(shí)該如何處理?可特殊 器抽象類只需要對(duì)Action中部分方法進(jìn)行以使用下面這個(gè)類:erceptor.MethodFilterInterceptorMethodFilterInterceptor通過(guò)指定include/excluded方法列表來(lái)選擇 或排除的方法,可以設(shè)置的參數(shù)如下:excludeMethods要排除的方法includeMethods要

的方法在設(shè)置 或排除的方法時(shí),如果有多個(gè)方法,那么以逗號(hào)(,)分隔,如果一個(gè)方法的名字同時(shí)出現(xiàn)在excludeMethods和includeMethods參數(shù)中,那么會(huì)當(dāng)作要 的方法。16自定義

器器示例,修改父類為基于MethodFilterInterceptor的MethodFilterInterceptrorpackage

com.shinowit;import

com.opensymphony.xwork2.ActionInvocation;import

erceptor.MethodFilterInterceptor;public

class

AroundIntercept

extendsMethodFilterInterceptor

{ntercept(ActionInvocation

invocation)

throws@OverrideprotectedStringException

{System.out.println("AroundIntercept被調(diào)用......");returninvocation.invoke();}}17自定義

器CrudAction.java代碼package

com.shinowit;import

com.opensymphony.xwork2.ActionSupport;public

class

CrudAction

extends

ActionSupport

{public

String

insert(){System.out.println("insert方法被調(diào)用");return

SUCCESS;}public

String

update(){System.out.println("update方法被調(diào)用");return

SUCCESS;}public

String

delete(){System.out.println("delete方法被調(diào)用");return

SUCCESS;}public

String

select(){System.out.println("select方法被調(diào)用");return

SUCCESS;}public

String

execute(){System.out.println("execute方法被調(diào)用");return

SUCCESS;}}18自定義

器基于MethodFilterInterceptor的

器示例<package

name="InterceptorDemo"

extends="struts-default"><interceptors><interceptor

name="aroundInterceptor"

class="com.shinowit.AroundIntercept"></interceptor></interceptors><action

name="crud_*"

class="com.shinowit.CrudAction"method="{1}"><interceptor-ref

name="aroundInterceptor"><param

name="includeMethods">select,update</param><param

name="excludeMethods">delete,insert</param></interceptor-ref><result>/index.jsp</result></action></package>19自定義

器基于方法過(guò)濾的器執(zhí)行效果2021自定義

器配置

器器需要在struts.xml中進(jìn)行配置才能為action提供服務(wù)。要為action配置

器,首先需要在interceptors元素中使用interceptor元素定義

器,然后

在action中使用interceptor-ref元素指定

的class,前者指定比如對(duì)如前面的器。Interceptor元素有兩個(gè)必需的屬性:name和器的名字,后者指定

器的完整類名。器,需要如下配置:<

package

name=“default"

extends

="struts-default"

><interceptors>

<!

-

-在這里定義

器-

-><interceptor

name=“around”

class=“AroundInterceptor”/></interceptors><

action

name=“test”

class=“ .AroundAction”

><

result

>

/Timer.jsp

</

result

>器--><interceptor-ref

name=“around”/><!–此處</

action

></

package

>22自定義

器配置

器如果在一個(gè)action需要多個(gè) 器,那又需要如何配置?另外,對(duì)于多個(gè) 器之間的執(zhí)行順序又是怎樣的?對(duì)于上述問(wèn)題有二個(gè)解決方法:為一個(gè)Action配置多個(gè)將多個(gè)

器配為一個(gè)器器棧,然后在action中23配置示例為一個(gè)Action配置多個(gè)

器<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在這里定義

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/></interceptors><

action

name=“test”

class=“

.TestAction”

><

result

>

/Timer.jsp

</

result

>器-->器--><interceptor-ref

name=“before”/><!–此處<interceptor-ref

name=“after”/><!–此處</

action

></

package

>24配置示例定義 器棧示例<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在這里定義

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/>器棧--><!—配置

器棧,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”

/><

interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><

action

name=“test”

class=“

.TestAction”

><result

>

/Timer.jsp

</

result

><interceptor-ref

name=“mystack”/><!–此處</

action></

package

>25配置示例缺省 器棧的配置<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在這里定義

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/><!—配置

器棧,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”/><

interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><!—此處指定了一個(gè)默認(rèn)的 器棧,也就意味著此名下所有的action都將會(huì)執(zhí)行此默認(rèn) 器棧中的 器(按出現(xiàn)順序)→<default-interceptor-ref

name=“mystack”/>.TestAction”

><

action

name=“test”

class=“<result

>

/Timer.jsp

</

result

></

action

></

package

>26配置示例當(dāng)配置缺省 器棧之后又在action中定義 器時(shí)<

package

name

=“default"

extends

="struts-default"

><interceptors>

<!

-

-在這里定義

器-

-><interceptor

name=“before”

class=“BeforeInterceptor”/><interceptor

name=“after”

class=“AfterInterceptor”/><!—配置

器棧,便于使用→<interceptor-stack

name=“mystack”><

interceptor-ref

name

=“before”

/><interceptor-ref

name

=“after”

/></interceptor-stack></interceptors><default-interceptor-ref

name=“mystack”/><

act

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論