?? struts 2的基石——攔截器(interceptor) - max on java - blogjava.htm
字號(hào):
style="COLOR: #000000">18</SPAN> <SPAN
style="COLOR: #000000">com.opensymphony.xwork2.interceptor.TimerInterceptor
doLog<BR>信息: Executed action </SPAN><SPAN
style="FONT-WEIGHT: bold; COLOR: #800000">[</SPAN> <SPAN
style="COLOR: #800000">//Timer!execute</SPAN> <SPAN
style="FONT-WEIGHT: bold; COLOR: #800000">]</SPAN> <SPAN
style="COLOR: #000000">took </SPAN><SPAN style="COLOR: #000000">500</SPAN> <SPAN
style="COLOR: #000000">ms.</SPAN> </DIV>
<P>OK,這正是我們期待的結(jié)果。上述例子演示了攔截器timer的用途——用于顯示執(zhí)行某個(gè)action方法的耗時(shí),在我們做一個(gè)粗略的性能調(diào)試時(shí),這相當(dāng)有用。</P>
<H2>自定義攔截器</H2>
<P>作為“框架(framework)”,可擴(kuò)展性是不可或缺的,因?yàn)槭郎蠜](méi)有放之四海而皆準(zhǔn)的東西。雖然,Struts
2為我們提供如此豐富的攔截器實(shí)現(xiàn),但是這并不意味我們失去創(chuàng)建自定義攔截器的能力,恰恰相反,在Struts 2自定義攔截器是相當(dāng)容易的一件事。</P>
<P> </P>
<TABLE
style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left"
cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD
style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/lightbulb_on.gif">
</TD>
<TD
style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 黑體, 宋體, Tahoma, Arial">大家在開(kāi)始著手創(chuàng)建自定義攔截器前,切記以下原則:<BR>攔截器必須是無(wú)狀態(tài)的,不要使用在A(yíng)PI提供的ActionInvocation之外的任何東西。</TD></TR></TBODY></TABLE>
<P>要求攔截器是無(wú)狀態(tài)的原因是Struts 2不能保證為每一個(gè)請(qǐng)求或者action創(chuàng)建一個(gè)實(shí)例,所以如果攔截器帶有狀態(tài),會(huì)引發(fā)并發(fā)問(wèn)題。</P>
<P>所有的Struts
2的攔截器都直接或間接實(shí)現(xiàn)接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜歡繼承類(lèi)com.opensymphony.xwork2.interceptor.AbstractInterceptor。</P>
<P>以下例子演示通過(guò)繼承AbstractInterceptor,實(shí)現(xiàn)授權(quán)攔截器。</P>
<P>首先,創(chuàng)建授權(quán)攔截器類(lèi)tutorial.AuthorizationInterceptor,代碼如下:</P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top> <SPAN style="COLOR: #0000ff">package</SPAN> <SPAN
style="COLOR: #000000">tutorial;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top></SPAN> <SPAN style="COLOR: #0000ff">import</SPAN> <SPAN
style="COLOR: #000000">java.util.Map;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top></SPAN> <SPAN style="COLOR: #0000ff">import</SPAN> <SPAN
style="COLOR: #000000">com.opensymphony.xwork2.Action;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top></SPAN> <SPAN style="COLOR: #0000ff">import</SPAN> <SPAN
style="COLOR: #000000">com.opensymphony.xwork2.ActionInvocation;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top></SPAN> <SPAN style="COLOR: #0000ff">import</SPAN> <SPAN
style="COLOR: #000000">com.opensymphony.xwork2.interceptor.AbstractInterceptor;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/None.gif"
align=top><BR><IMG id=Codehighlighter1_261_662_Open_Image
onclick="this.style.display='none'; Codehighlighter1_261_662_Open_Text.style.display='none'; Codehighlighter1_261_662_Closed_Image.style.display='inline'; Codehighlighter1_261_662_Closed_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedBlockStart.gif"
align=top><IMG id=Codehighlighter1_261_662_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_261_662_Closed_Text.style.display='none'; Codehighlighter1_261_662_Open_Image.style.display='inline'; Codehighlighter1_261_662_Open_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ContractedBlock.gif"
align=top></SPAN> <SPAN style="COLOR: #0000ff">public</SPAN> <SPAN
style="COLOR: #000000"></SPAN><SPAN style="COLOR: #0000ff">class</SPAN> <SPAN
style="COLOR: #000000">AuthorizationInterceptor </SPAN><SPAN
style="COLOR: #0000ff">extends</SPAN> <SPAN
style="COLOR: #000000">AbstractInterceptor </SPAN><SPAN
id=Codehighlighter1_261_662_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/dot.gif">
</SPAN><SPAN id=Codehighlighter1_261_662_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top><BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> @Override<BR><IMG id=Codehighlighter1_338_659_Open_Image
onclick="this.style.display='none'; Codehighlighter1_338_659_Open_Text.style.display='none'; Codehighlighter1_338_659_Closed_Image.style.display='inline'; Codehighlighter1_338_659_Closed_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_338_659_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_338_659_Closed_Text.style.display='none'; Codehighlighter1_338_659_Open_Image.style.display='inline'; Codehighlighter1_338_659_Open_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN> <SPAN style="COLOR: #0000ff">public</SPAN> <SPAN
style="COLOR: #000000">String intercept(ActionInvocation ai) </SPAN><SPAN
style="COLOR: #0000ff">throws</SPAN> <SPAN style="COLOR: #000000">Exception
</SPAN><SPAN id=Codehighlighter1_338_659_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/dot.gif">
</SPAN><SPAN id=Codehighlighter1_338_659_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> Map session </SPAN><SPAN
style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #000000">ai.getInvocationContext().getSession();<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> String role </SPAN><SPAN
style="COLOR: #000000">=</SPAN> <SPAN style="COLOR: #000000">(String)
session.get(</SPAN> <SPAN style="COLOR: #000000">"</SPAN> <SPAN
style="COLOR: #000000">ROLE</SPAN> <SPAN style="COLOR: #000000">"</SPAN> <SPAN
style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_461_619_Open_Image
onclick="this.style.display='none'; Codehighlighter1_461_619_Open_Text.style.display='none'; Codehighlighter1_461_619_Closed_Image.style.display='inline'; Codehighlighter1_461_619_Closed_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_461_619_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_461_619_Closed_Text.style.display='none'; Codehighlighter1_461_619_Open_Image.style.display='inline'; Codehighlighter1_461_619_Open_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN> <SPAN
style="COLOR: #0000ff">if</SPAN> <SPAN style="COLOR: #000000">(</SPAN> <SPAN
style="COLOR: #0000ff">null</SPAN> <SPAN style="COLOR: #000000"></SPAN><SPAN
style="COLOR: #000000">!=</SPAN> <SPAN style="COLOR: #000000">role) </SPAN><SPAN
id=Codehighlighter1_461_619_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/dot.gif">
</SPAN><SPAN id=Codehighlighter1_461_619_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> Object o </SPAN><SPAN
style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #000000">ai.getAction();<BR><IMG
id=Codehighlighter1_523_592_Open_Image
onclick="this.style.display='none'; Codehighlighter1_523_592_Open_Text.style.display='none'; Codehighlighter1_523_592_Closed_Image.style.display='inline'; Codehighlighter1_523_592_Closed_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_523_592_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_523_592_Closed_Text.style.display='none'; Codehighlighter1_523_592_Open_Image.style.display='inline'; Codehighlighter1_523_592_Open_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> </SPAN> <SPAN
style="COLOR: #0000ff">if</SPAN> <SPAN style="COLOR: #000000">(o </SPAN><SPAN
style="COLOR: #0000ff">instanceof</SPAN> <SPAN style="COLOR: #000000">RoleAware)
</SPAN><SPAN id=Codehighlighter1_523_592_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/dot.gif">
</SPAN><SPAN id=Codehighlighter1_523_592_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> RoleAware
action </SPAN><SPAN style="COLOR: #000000">=</SPAN> <SPAN
style="COLOR: #000000">(RoleAware) o;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top>
action.setRole(role);<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN> </SPAN><SPAN
style="COLOR: #000000"><BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN> <SPAN
style="COLOR: #0000ff">return</SPAN> <SPAN
style="COLOR: #000000">ai.invoke();<BR><IMG
id=Codehighlighter1_626_654_Open_Image
onclick="this.style.display='none'; Codehighlighter1_626_654_Open_Text.style.display='none'; Codehighlighter1_626_654_Closed_Image.style.display='inline'; Codehighlighter1_626_654_Closed_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockStart.gif"
align=top><IMG id=Codehighlighter1_626_654_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_626_654_Closed_Text.style.display='none'; Codehighlighter1_626_654_Open_Image.style.display='inline'; Codehighlighter1_626_654_Open_Text.style.display='inline';"
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ContractedSubBlock.gif"
align=top> }</SPAN> </SPAN><SPAN
style="COLOR: #000000"></SPAN><SPAN style="COLOR: #0000ff">else</SPAN> <SPAN
style="COLOR: #000000"></SPAN><SPAN id=Codehighlighter1_626_654_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/dot.gif">
</SPAN><SPAN id=Codehighlighter1_626_654_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> </SPAN> <SPAN
style="COLOR: #0000ff">return</SPAN> <SPAN
style="COLOR: #000000">Action.LOGIN;<BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN> </SPAN><SPAN
style="COLOR: #000000"> <BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedSubBlockEnd.gif"
align=top> }</SPAN> </SPAN><SPAN style="COLOR: #000000"><BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/InBlock.gif"
align=top> <BR><IMG
src="Struts 2的基石——攔截器(Interceptor) - Max On Java - BlogJava.files/ExpandedBlockEnd.gif"
align=top>}</SPAN> </SPAN></DIV>
<P>以上代碼相當(dāng)簡(jiǎn)單,我們通過(guò)檢查session是否存在鍵為“ROLE”的字符串,判斷用戶(hù)是否登陸。如果用戶(hù)已經(jīng)登陸,將角色放到Action中,調(diào)用Action;否則,攔截直接返回Action.LOGIN字段。為了方便將角色放入Action,我定義了接口tutorial.RoleAware,代碼如下:</P>
<DIV
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -