程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaWeb中Struts2攔阻器深刻剖析(一)

JavaWeb中Struts2攔阻器深刻剖析(一)

編輯:關於JAVA

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>

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved