亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaWeb中Struts2攔截器深入分析(一)

 更新時間:2016年06月29日 09:49:25   投稿:lijiao  
這篇文章主要為大家詳細介紹了JavaWeb中Struts2攔截器的功能,感興趣的小伙伴們可以參考一下

一、struts2中的攔截器(框架功能核心)

1、過濾器VS攔截器

過濾器VS攔截器功能是一回事。過濾器是Servlet規(guī)范中的技術(shù),可以對請求和響應進行過濾。

攔截器是Struts2框架中的技術(shù),實現(xiàn)AOP(面向切面)的編程思想,是可插拔的, 可以對訪問某個 Action 方法之前或之后實施攔截。

攔截器棧(Interceptor Stack): 將攔截器按一定的順序聯(lián)結(jié)成一條鏈. 在訪問被攔截的方法時, Struts2攔截器鏈中的攔截器就會按其之前定義的順序被依次調(diào)用

Struts2執(zhí)行原理 - 底層分析

這里寫圖片描述

2、自定義攔截器

struts2定義了一個攔截器接口Interceptor接口。
Interceptor接口里面有三個抽象方法

這里寫圖片描述

•init: 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次. 可以在該方法中對相關(guān)資源進行必要的初始化
 •interecept: 每攔截一個動作請求, 該方法就會被調(diào)用一次.
•destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次.
Struts 會依次調(diào)用程序員為某個 Action 而注冊的每一個攔截器的 interecept 方法.每次調(diào)用 interecept 方法時, Struts 會傳遞一個 ActionInvocation 接口的實例.

ActionInvocation: 代表一個給定動作的執(zhí)行狀態(tài), 攔截器可以從該類的對象里獲得與該動作相關(guān)聯(lián)的 Action 對象和 Result 對象. 在完成攔截器自己的任務之后, 攔截器將調(diào)用 ActionInvocation 對象的 invoke 方法前進到 Action 處理流程的下一個環(huán)節(jié).

還可以調(diào)用 ActionInvocation 對象的 addPreResultListener 方法給 ActionInvocation 對象 “掛” 上一個或多個 PreResultListener 監(jiān)聽器. 該監(jiān)聽器對象可以在動作執(zhí)行完畢之后, 開始執(zhí)行動作結(jié)果之前做些事情

自定義攔截器步驟:

a、編寫一個類,實現(xiàn)com.opensymphony.xwork2.interceptor.Interceptor接口,或者繼承
com.opensymphony.xwork2.interceptor.AbstractInterceptor類。(適配器模式),一般都選擇繼承AbstractInterceptor(攔截器會駐留內(nèi)存)。因為AbstractInterceptor 類實現(xiàn)了 Interceptor 接口. 并為 init, destroy 提供了一個空白的實現(xiàn)

編寫兩個攔截器InterceptorDemo1 ,和InterceptorDemo2

package com.itheima.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorDemo1 extends AbstractInterceptor {
 //動作的每次訪問都會調(diào)用該方法
 public String intercept(ActionInvocation invocation) throws Exception {
  System.out.println("攔截前Demo1");
  String rtvalue = invocation.invoke();//放行,這里為什么返回string?
因為最終的結(jié)果返回的Action的Result,而action的結(jié)果是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 {
 //動作的每次訪問都會調(diào)用該方法
 public String intercept(ActionInvocation invocation) throws Exception {

//  invocation.addPreResultListener(new PreResultListener() {
//   
//   public void beforeResult(ActionInvocation invocation, String resultCode) {
//    System.out.println("結(jié)果顯示前");
//   }
//  });

  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>

實現(xiàn)動作類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執(zhí)行了");
  return SUCCESS;
 }

}

運行結(jié)果

這里寫圖片描述

因為struts2中如文件上傳,數(shù)據(jù)驗證,封裝請求參數(shù)到action等功能都是由系統(tǒng)默認的defaultStack中的攔截器實現(xiàn)的,所以我們定義的攔截器需要引用系統(tǒng)默認的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:監(jiān)測動作方法的執(zhí)行效率

編寫時間監(jiān)測過濾器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+"執(zhí)行耗時:"+(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、自定義攔截器:能夠指定攔截的方法或不攔截的方法

能夠指定攔截的方法或不攔截的方法,編寫過濾器時,可以實現(xiàn)類MethodFilterInterceptor,里面有兩個字段,通過注入?yún)?shù)就可以指定那些不攔截,兩個參數(shù)只要用一個即可,當攔截較少是,可以用includeMethods ,當攔截較多是,可以用排除的方法excludeMethods 。

excludeMethods = Collections.emptySet();//排除那些
includeMethods = Collections.emptySet();//包括那些

案例:再續(xù)登錄校驗的例子。

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("調(diào)用add的service方法");
  return SUCCESS;
 }
 public String edit(){
  System.out.println("調(diào)用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>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ThreadLocal?在上下文傳值場景實踐源碼

    ThreadLocal?在上下文傳值場景實踐源碼

    這篇文章主要為大家介紹了ThreadLocal在上下文傳值場景下的實踐源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • java 讀寫Parquet格式的數(shù)據(jù)的示例代碼

    java 讀寫Parquet格式的數(shù)據(jù)的示例代碼

    本篇文章主要介紹了java 讀寫Parquet格式的數(shù)據(jù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 基于Hutool的圖片驗證碼功能模塊實現(xiàn)

    基于Hutool的圖片驗證碼功能模塊實現(xiàn)

    為了提高系統(tǒng)的安全性,防止接口被暴力刷新,驗證碼是個好的手段,圖片驗證碼沒有短信驗證碼的費用,其是個人開發(fā)者學習的重點,這篇文章主要介紹了基于Hutool的圖片驗證碼功能模塊實現(xiàn),需要的朋友可以參考下
    2022-10-10
  • Spring框架應用的權(quán)限控制系統(tǒng)詳解

    Spring框架應用的權(quán)限控制系統(tǒng)詳解

    在本篇文章里小編給大家整理的是關(guān)于基于Spring框架應用的權(quán)限控制系統(tǒng)的研究和實現(xiàn),需要的朋友們可以學習下。
    2019-08-08
  • MyBatis-Plus動態(tài)表名的使用

    MyBatis-Plus動態(tài)表名的使用

    本文主要介紹了MyBatis-Plus動態(tài)表名的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 在spring中使用自定義注解注冊監(jiān)聽器的方法

    在spring中使用自定義注解注冊監(jiān)聽器的方法

    本篇文章主要介紹了在spring中使用自定義注解注冊監(jiān)聽器的方法,本文就是在分析監(jiān)聽器回調(diào)原理的基礎上,在spring環(huán)境中使用自定義的注解實現(xiàn)一個監(jiān)聽器。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù)

    如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù)

    這篇文章主要介紹了如何通過ServletInputStream讀取http請求傳入的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Flink流處理引擎零基礎速通之數(shù)據(jù)的抽取篇

    Flink流處理引擎零基礎速通之數(shù)據(jù)的抽取篇

    今天不分享基礎概念知識了,來分享一個馬上工作需要的場景,要做數(shù)據(jù)的抽取,不用kettle,想用flink。實際就是flink的sql、table層級的api
    2022-05-05
  • Java StringBuilder的用法示例

    Java StringBuilder的用法示例

    這篇文章主要給大家介紹了關(guān)于Java StringBuilder用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Kafka使用Java客戶端進行訪問的示例代碼

    Kafka使用Java客戶端進行訪問的示例代碼

    本篇文章主要介紹了Kafka使用Java客戶端進行訪問的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論