JavaWeb中Struts2攔阻器深刻剖析(一)。本站提示廣大學習愛好者:(JavaWeb中Struts2攔阻器深刻剖析(一))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb中Struts2攔阻器深刻剖析(一)正文
1、struts2中的攔阻器(框架功效焦點)
1、過濾器VS攔阻器
過濾器VS攔阻器功效是一回事。過濾器是Servlet標准中的技巧,可以對要求和呼應停止過濾。
攔阻器是Struts2框架中的技巧,完成AOP(面向切面)的編程思惟,是可插拔的, 可以對拜訪某個 Action 辦法之前或以後實行攔阻。
攔阻器棧(Interceptor Stack): 將攔阻器按必定的次序聯絡成一條鏈. 在拜訪被攔阻的辦法時, Struts2攔阻器鏈中的攔阻器就會按其之前界說的次序被順次挪用
Struts2履行道理 - 底層剖析
2、自界說攔阻器
struts2界說了一個攔阻器接口Interceptor接口。
Interceptor接口外面有三個籠統辦法
•init: 該辦法將在攔阻器被創立後立刻被挪用, 它在攔阻器的性命周期內只被挪用一次. 可以在該辦法中對相干資本停止需要的初始化
•interecept: 每攔阻一個舉措要求, 該辦法就會被挪用一次.
•destroy: 該辦法將在攔阻器被燒毀之前被挪用, 它在攔阻器的性命周期內也只被挪用一次.
Struts 會順次挪用法式員為某個 Action 而注冊的每個攔阻器的 interecept 辦法.每次挪用 interecept 辦法時, Struts 會傳遞一個 ActionInvocation 接口的實例.
ActionInvocation: 代表一個給定舉措的履行狀況, 攔阻器可以從該類的對象裡取得與該舉措相干聯的 Action 對象和 Result 對象. 在完成攔阻器本身的義務以後, 攔阻器將挪用 ActionInvocation 對象的 invoke 辦法進步到 Action 處置流程的下一個環節.
還可以挪用 ActionInvocation 對象的 addPreResultListener 辦法給 ActionInvocation 對象 “掛” 上一個或多個 PreResultListener 監聽器. 該監聽器對象可以在舉措履行終了以後, 開端履行舉措成果之前做些工作
自界說攔阻器步調:
a、編寫一個類,完成com.opensymphony.xwork2.interceptor.Interceptor接口,或許繼續
com.opensymphony.xwork2.interceptor.AbstractInterceptor類。(適配器形式),普通都選擇繼續AbstractInterceptor(攔阻器會駐留內存)。由於AbstractInterceptor 類完成了 Interceptor 接口. 並為 init, destroy 供給了一個空白的完成
編寫兩個攔阻器InterceptorDemo1 ,和InterceptorDemo2
package com.itheima.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class InterceptorDemo1 extends AbstractInterceptor { //舉措的每次拜訪都邑挪用該辦法 public String intercept(ActionInvocation invocation) throws Exception { System.out.println("攔阻前Demo1"); String rtvalue = invocation.invoke();//放行,這裡為何前往string? 由於終究的成果前往的Action的Result,而action的成果是string類型 System.out.println("攔阻後Demo1"); return rtvalue; } } package com.itheima.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.opensymphony.xwork2.interceptor.PreResultListener; public class InterceptorDemo2 extends AbstractInterceptor { //舉措的每次拜訪都邑挪用該辦法 public String intercept(ActionInvocation invocation) throws Exception { // invocation.addPreResultListener(new PreResultListener() { // // public void beforeResult(ActionInvocation invocation, String resultCode) { // System.out.println("成果顯示前"); // } // }); System.out.println("攔阻前Demo2"); String rtvalue = invocation.invoke();//放行 System.out.println("攔阻後Demo2"); return rtvalue; } }
b、須要在struts.xml中停止界說,界說攔阻器,先界說在應用。
<package name="p1" extends="struts-default"> <!-- 界說攔阻器:只對以後包有用 --> <interceptors> <interceptor name="interceprotDemo1" class="com.itheima.interceptor.InterceptorDemo1"></interceptor> <interceptor name="interceprotDemo2" class="com.itheima.interceptor.InterceptorDemo2"></interceptor> </interceptors> </package>
c、在舉措設置裝備擺設中便可以應用了
<action name="action1" class="com.itheima.action.Demo1Action" method="execute"> <!-- 應用界說的攔阻器。如過沒有指定任何的攔阻器,默許應用default-stack棧中的一切攔阻器; 一旦指定了任何一個攔阻器,默許的就有效了 --> <interceptor-ref name="interceprotDemo1"></interceptor-ref> <interceptor-ref name="interceprotDemo2"></interceptor-ref> <result>/success.jsp</result> </action>
完成舉措類Demo1Action
package com.itheima.action; import com.opensymphony.xwork2.ActionSupport; public class Demo1Action extends ActionSupport { @Override public String execute() throws Exception { System.out.println("execute履行了"); return SUCCESS; } }
運轉成果
由於struts2中如文件上傳,數據驗證,封裝要求參數到action等功效都是由體系默許的defaultStack中的攔阻器完成的,所以我們界說的攔阻器須要援用體系默許的defaultStack,如許運用才可使用struts2框架供給的浩瀚功效。
如過沒有指定任何的攔阻器,默許應用default-stack棧中的一切攔阻器;一旦指定了任何一個攔阻器,默許的就有效了除要應用自界說的攔阻器以外,還要應用defaultStack,可以這麼辦
辦法一:(本身應用),只需在action中設置裝備擺設自界說的和defaultStack默許的便可以了。
辦法二:(年夜家都用的時刻),假如願望包下的一切action都應用自界說的攔阻器, 要應用攔阻器棧 interceptor-stack,界說一個interceptor-stack,然後在action中可以經由過程<default-interceptor-ref name=“mydefaultStack”/>把攔阻器界說為默許攔阻器,mydefaultStack名字可以本身取。
<interceptors> <interceptor name="interceprotDemo1" class="com.itheima.interceptor.InterceptorDemo1"></interceptor> <interceptor name="interceprotDemo2" class="com.itheima.interceptor.InterceptorDemo2"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="interceprotDemo1"></interceptor-ref> <interceptor-ref name="interceprotDemo2"></interceptor-ref> </interceptor-stack> </interceptors> <action name="action3" class="com.itheima.action.LoginAction" method="login"> <interceptor-ref name="mydefaultStack"></interceptor-ref> <result>/success.jsp</result> </action>
3、Struts2 自帶的攔阻器
案例1:檢討用戶能否登錄
1、 編寫頁面login.jsp
<body> <form action="${pageContext.request.contextPath}/login.action" method="post"> <input type="text" name="username"/><br/> <input type="text" name="password"/><br/> <input type="submit" value="登錄"/> </form> </body>
2、編寫登錄校驗的攔阻器LoginCheckInterceptor 類
package com.itheima.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class LoginCheckInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { HttpSession session = ServletActionContext.getRequest().getSession();//經由過程ServletActionContext對象取得session對象 Object user = session.getAttribute("user"); if(user==null){ //沒有登錄 return "login";//前往到某個邏輯視圖 } return invocation.invoke();//放行 } }
3、編寫設置裝備擺設文件struts.xml
<package name="p2" extends="struts-default"> <interceptors> <interceptor name="loginCheckInterceptor" class="com.itheima.interceptor.LoginCheckInterceptor"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginCheckInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <action name="login" class="com.itheima.action.CustomerAction" method="login"> <result>/login.jsp</result> </action> </package>
4、編寫舉措類CustomerAction
package com.itheima.action; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class CustomerAction extends ActionSupport { public String login(){ System.out.println("登錄"); ServletActionContext.getRequest().getSession().setAttribute("user", "ppp"); return SUCCESS; } }
案例2:監測舉措辦法的履行效力
編寫時光監測過濾器TimerInterceptor
package com.itheima.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class TimerInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { long time = System.nanoTime(); String rtvalue = invocation.invoke(); System.out.println(rtvalue+"履行耗時:"+(System.nanoTime()-time)+"納秒"); return rtvalue; } }
編寫設置裝備擺設文件
<package name="p2" extends="struts-default"> <interceptors> <interceptor name="loginCheckInterceptor" class="com.itheima.interceptor.LoginCheckInterceptor"></interceptor> <interceptor name="timerInterceptor" class="com.itheima.interceptor.TimerInterceptor"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginCheckInterceptor"></interceptor-ref> <interceptor-ref name="timerInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <result name="login">/login.jsp</result> </action> </package>
從下面可以看出,在一個action 中可以設置裝備擺設多個過濾器。
4、自界說攔阻器:可以或許指定攔阻的辦法或不攔阻的辦法
可以或許指定攔阻的辦法或不攔阻的辦法,編寫過濾器時,可以完成類MethodFilterInterceptor,外面有兩個字段,經由過程注入參數便可以指定那些不攔阻,兩個參數只需用一個便可,當攔阻較少是,可以用includeMethods ,當攔阻較多是,可以用消除的辦法excludeMethods 。
excludeMethods = Collections.emptySet();//消除那些
includeMethods = Collections.emptySet();//包含那些
案例:再續登錄校驗的例子。
1、編寫過濾器LoginCheckInterceptor
package com.itheima.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; public class LoginCheckInterceptor extends MethodFilterInterceptor { protected String doIntercept(ActionInvocation invocation) throws Exception { HttpSession session = ServletActionContext.getRequest().getSession(); Object user = session.getAttribute("user"); if(user==null){ //沒有登錄 return "login";//前往到某個邏輯視圖 } return invocation.invoke();//放行 } }
2、編寫設置裝備擺設文件
3、編寫舉措類CustomerAction
package com.itheima.action; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class CustomerAction extends ActionSupport { public String add(){ System.out.println("挪用add的service辦法"); return SUCCESS; } public String edit(){ System.out.println("挪用edit的service辦法"); return SUCCESS; } public String login(){ System.out.println("登錄"); ServletActionContext.getRequest().getSession().setAttribute("user", "ppp"); return SUCCESS; } }
4、編寫頁面
addCustomer.jsp
<body> 添加客戶 </body>
editCustomer.jsp
<body> 修正客戶 </body>
login.jsp
<body> <form action="${pageContext.request.contextPath}/login.action" method="post"> <input type="text" name="username"/><br/> <input type="text" name="password"/><br/> <input type="submit" value="登錄"/> </form> </body>
success.jsp
<body> oyeah </body>
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。