程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的Struts2框架中攔阻器應用的實例教程

Java的Struts2框架中攔阻器應用的實例教程

編輯:關於JAVA

Java的Struts2框架中攔阻器應用的實例教程。本站提示廣大學習愛好者:(Java的Struts2框架中攔阻器應用的實例教程)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的Struts2框架中攔阻器應用的實例教程正文


1、攔阻器小介

攔阻器的功效相似於web.xml文件中的Filter,能對用戶的要求停止攔阻,經由過程攔阻用戶的要求來完成對頁面的掌握。攔阻器是在Struts-core-2.2.3.jar中停止設置裝備擺設的,原始的攔阻器是在struts-default.xml中設置裝備擺設的,外面封存了攔阻器的根本應用辦法。
Struts2攔阻器功效相似於Servlet過濾器。在Action履行execute辦法前,Struts2會起首履行struts.xml中援用的攔阻器,假如有多個攔阻器則會依照高低次序順次履行,在履行完一切的攔阻器的interceptor辦法後,會履行Action的execute辦法。
Struts2的攔阻器必需從com.opensymphoy.xwork2.interceptor.Interceptor中完成該接口,在被界說的攔阻器中有上面三個辦法須要被完成:

void destroy();  
void init();  
String intercept(ActionInvocation invocation) throws Exception; 

自界說的攔阻器須要重寫下面三個辦法。別的Struts2的攔阻器設置裝備擺設文件struts.xml它是繼續了原始文件struts-default.xml文件的,如許在響應的<package>中就會主動具有struts-default.xml中的一切設置裝備擺設信息了。詳細代碼以下:

<package name="demo" extends="struts-default" > ... </package> 

 

2、添加攔阻器

想要應用攔阻器必需要經由設置裝備擺設,struts2采取的是映照的辦法,所以想用應用某一個功效就必需在設置裝備擺設文件中設置裝備擺設,攔阻器也不破例。所以必需在package中添加響應的攔阻器元素,同時將攔阻器聯系關系響應的class文件,如許在履行action前才會履行響應的攔阻器,詳細應用辦法以下。

(1)添加設置裝備擺設文件struts.xml,並在該文件中添加攔阻器

<package name="testLogin" namespace="/" extends="struts-default"> 
  <!-- 攔阻器 --> 
  <interceptors> 
    <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> 
  </interceptors> 
     
  <action name="demo" class="com.action.LoginAction"> 
    <result name="error" type="redirect">/error.jsp</result> 
    <result name="success">/success.jsp</result> 
    <result name="checkError">/checkSession.jsp</result> 
    <interceptor-ref name="myInterceptor"></interceptor-ref> 
    <interceptor-ref name="defaultStack"></interceptor-ref> 
  </action> 
</package> 

下面的package中添加了一個名為myInterceptor的攔阻器,並為該攔阻器注冊了一個java類,該類稱號為MyInterceptor,並被封存在com.interceptor包中。別的還在該package中添加了響應的action,在履行該action前會起首履行myInterceptor攔阻器。

(2)編寫被注冊的攔阻器類MyInterceptor,該類必需完成com.opensymphoy.xwork2.interceptor.Interceptor接口,偏重寫響應的辦法

package com.interceptor; 
 
import java.util.Map; 
 
import com.entity.User; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.Interceptor; 
 
public class MyInterceptor implements Interceptor{ 
 
  private User user; 
   
   
  public User getUser() { 
    return user; 
  } 
 
  public void setUser(User user) { 
    this.user = user; 
  } 
 
  @Override 
  public void destroy() { 
    // TODO Auto-generated method stub 
    System.out.println("----destroy()----"); 
  } 
 
  @Override 
  public void init() { 
    // TODO Auto-generated method stub 
    System.out.println("-----Init()-------"); 
  } 
 
  @Override 
  public String intercept(ActionInvocation invocation) throws Exception { 
    // TODO Auto-generated method stub 
    System.out.println("----intercept()------"); 
    Map<String, Object> session= invocation.getInvocationContext().getSession(); 
    if(session.get("username")!=null){ 
      System.out.println("上岸勝利!");     
      //session.put("username",user.getUsername()); 
      return invocation.invoke(); 
    }else{ 
      System.out.println("上岸掉敗!"); 
      return "checkError"; 
    } 
  } 
 
} 

(3)經由後面兩步後,攔阻器曾經設置裝備擺設完成,最初一部就是應用攔阻器了,在顯示頁面上添加響應的標簽,並為標簽指定下面創立的名為demo的action,然後履行頁面便可在掌握台中打印出響應的攔阻器內容。

<%@ page language="java" contentType="text/html; charset=UTF-8" 
  pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
  <form action="demo"> 
    用戶名:<input type="text" name="username"><br> 
    密 碼:<input type="text" name="password"><br> 
    <input type="submit" name="ok" value="提交"> 
  </form> 
</body> 
</html> 

打印輸入內容:

剖析輸入成果,法式編譯階段起首會去讀取設置裝備擺設文件struts.xml,在該設置裝備擺設文件action中次序查找能否添加了攔阻器,假如添加了攔阻器則依據攔阻器稱號在<interceptors>中查找能否界說了該攔阻器或許攔阻器棧,假如發明界說的是攔阻器則依據攔阻器查找對應的注冊的class,最初在包外調找注冊的class並履行響應的init()辦法;法式運轉階段的年夜致流程和編譯階段相似,用戶在前台提交要求後,會依照注冊的action在struts.xml中查找與之絕對應的,假如查找到將會查找攔阻器,沒有查找到的話會響應的拋錯,最初履行攔阻器注冊類的intercept辦法。

3、攔阻器棧

攔阻器異樣有棧的概念,它是將應用的攔阻器界說到共有的狀況上去完成同一治理,如許在package中便可以做到攔阻器的同享了,年夜年夜方便了攔阻器的應用。在一個package中常常會用到反復的interceptor,假如每次都在Action中添加interceptor-ref的話就會很費事,那末攔阻器棧就是為懂得決這個成績而發生的,詳細設置裝備擺設以下:

<package name="testLogin" namespace="/" extends="struts-default"> 
    <!-- 攔阻器 --> 
    <interceptors> 
      <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> 
      <!-- 界說公共的攔阻器鏈,在action標簽中只須要援用攔阻器鏈 --> 
      <interceptor-stack name="defaultstack1"> 
        <interceptor-ref name="myInterceptor"></interceptor-ref> 
        <interceptor-ref name="defaultStack"></interceptor-ref> 
      </interceptor-stack> 
    </interceptors> 
     
    <action name="demo" class="com.action.LoginAction"> 
      <result name="error" type="redirect">/error.jsp</result> 
      <result name="success">/success.jsp</result> 
      <result name="checkError">/checkSession.jsp</result> 
      <interceptor-ref name="defaultstack1"></interceptor-ref> 
    </action> 
</package> 

實例中應用了interceptor-stack來界說了一個稱號為defaultstack1的攔阻器棧,在該棧中添加了要履行的攔阻器,把攔阻器做了封裝,在Action中直接挪用該攔阻器棧便可,完成了攔阻器棧的同享。

4、默許攔阻器棧

別的可以界說默許的攔阻器棧,即:假如某個Action中沒有界說攔阻器,那末它會默許履行該公共的攔阻器。它和interceptors標簽屬於統一品級的,應用default-interceptor-ref界說。

<package name="testLogin" namespace="/" extends="struts-default"> 
  <!-- 攔阻器 --> 
  <interceptors> 
    <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> 
    <!-- 界說公共的攔阻器鏈,在action標簽中只須要援用攔阻器鏈 --> 
    <interceptor-stack name="defaultinter"> 
      <interceptor-ref name="myInterceptor"></interceptor-ref> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
    </interceptor-stack> 
  </interceptors> 
   
  <!-- 界說默許的攔阻器棧,會主動注冊到action中 --> 
  <default-interceptor-ref name="defaultinter"></default-interceptor-ref> 
   
  <action name="demo" class="com.action.LoginAction"> 
    <result name="error" type="redirect">/error.jsp</result> 
    <result name="success">/success.jsp</result> 
    <result name="checkError">/checkSession.jsp</result> 
  </action> 
</package> 

界說的默許的攔阻器棧只是在Action沒有指定攔阻器的情形下才履行自界說默許的攔阻器棧的,假如在Action中重界說了攔阻器,那末它會籠罩自界說默許的攔阻器棧的。

5、不履行任何攔阻器

還有一種情形是一個package中界說了默許的攔阻器,然則在編寫的某個Action中其實不須要履行任何攔阻器,那末此時可以在響應的Action中添加一個稱號為defaultStack的攔阻器便可,它是體系默許的攔阻器,不會有任何操作。

<package name="testLogin" namespace="/" extends="struts-default"> 
  <!-- 攔阻器 --> 
  <interceptors> 
    <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> 
    <!-- 界說公共的攔阻器鏈,在action標簽中只須要援用攔阻器鏈 --> 
    <interceptor-stack name="defaultinter"> 
      <interceptor-ref name="myInterceptor"></interceptor-ref> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
    </interceptor-stack> 
  </interceptors> 
   
  <!-- 界說默許的攔阻器棧,會主動注冊到action中 --> 
  <default-interceptor-ref name="defaultinter"></default-interceptor-ref> 
   
  <action name="demo" class="com.action.LoginAction"> 
    <result name="error" type="redirect">/error.jsp</result> 
    <result name="success">/success.jsp</result> 
    <result name="checkError">/checkSession.jsp</result> 
     
    <!-- 添加defaultStack包管不履行攔阻器 --> 
    <interceptor-ref name="defaultStack"></interceptor-ref> 
  </action> 
</package> 

6、攔阻辦法

6.1 用法
下面的攔阻器只是完成了對Action的攔阻,其實攔阻器的功效很壯大,它也能夠攔阻響應Action辦法。和攔阻Action分歧的是想要攔阻辦法就必需繼續類MethodFilterInterceptor,該類封存在xwork-core.jar中,又一次證實了WebWork是Struts2的焦點。別的還須要在設置裝備擺設文件中添加響應的屬性來肯定攔阻的辦法和不攔阻的辦法,詳細設置裝備擺設辦法以下:

<package name="testLogin" namespace="/" extends="struts-default"> 
  <!-- 攔阻器 --> 
  <interceptors> 
    <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> 
    <!-- 界說公共的攔阻器鏈,在action標簽中只須要援用攔阻器鏈 --> 
    <interceptor-stack name="defaultinter"> 
      <interceptor-ref name="myInterceptor"></interceptor-ref> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
    </interceptor-stack> 
  </interceptors> 
   
  <action name="demo" class="com.action.LoginAction"> 
    <result name="error" type="redirect">/error.jsp</result> 
    <result name="success">/success.jsp</result> 
    <result name="checkError">/checkSession.jsp</result> 
     
    <!-- 在defaultStack中設置裝備擺設攔阻辦法,參數includeMethods中添加被攔阻的辦法稱號,excludeMethods中添加不須要攔阻的稱號 --> 
    <interceptor-ref name="defaultStack"> 
      <param name="includeMethods">添加要攔阻的辦法稱號</param><!-- 攔阻辦法 --> 
      <param name="excludeMethods">添加不須要攔阻的辦法稱號</param><!-- 不攔阻辦法 --> 
    </interceptor-ref> 
  </action> 
</package> 

繼續MethodFilterInterceptor類的響應攔阻辦法的類中的代碼:

package com.interceptor; 
 
import java.util.Map; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 
 
public class inter extends MethodFilterInterceptor { 
 
  @Override 
  public String doIntercept(ActionInvocation invocation) throws Exception { 
    System.out.println("--intercept()--"); 
    //獲得響應的Session 
    Map<String,Object> session=invocation.getInvocationContext().getSession(); 
     
    Map request=(Map)ActionContext.getContext().get("request"); 
     
    String username=(String)request.get("user.username"); 
    if(session.get("username") != null){ 
      String result=invocation.invoke(); 
       
      System.out.println("--end()--"); 
      return result; 
    } 
  } 
 
} 

6.2 Demo
來看一個攔阻辦法的實例,並對成果停止剖析。上面的實例演示攔阻辦法的輸入成果,在實例平分別創立了一個loginAction類,添加Action要履行的辦法;Inter類,攔阻器中重寫MethodFilterInterceptor辦法,在掌握台中輸入能否對某個辦法停止攔阻;login.jsp文件,添加三個按鈕,分離演示三個辦法的履行。
(1)struts.xml內辦法攔阻器的界說,在package中界說了一個稱號為inter的攔阻器,在攔阻器中指定了參數,includeMethods用來攔阻Method1,excludeMethods中的Method2表現不攔阻Methods2辦法,詳細設置裝備擺設以下代碼:

<!DOCTYPE struts PUBLIC 
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
  <constant name="struts.action.extension" value=","></constant> 
   
  <package name="login" extends="struts-default">  
    <interceptors> 
      <interceptor name="inter" class="com.interceptor.inter"> 
        <param name="includeMethods">Method1</param> <!-- 攔阻Method1辦法 --> 
        <param name="excludeMethods">Method2</param> 
      </interceptor> 
      <interceptor-stack name="myInterceptor"> 
        <interceptor-ref name="inter"></interceptor-ref> 
        <interceptor-ref name="defaultStack"></interceptor-ref> 
      </interceptor-stack> 
    </interceptors> 
       
    <action name="loginaction" class="com.action.loginAction"> 
      <result name="success">success.jsp</result> 
      <result name="error">error.jsp</result> 
      <result name="cancel" type="redirectAction">Welcome</result> 
      <interceptor-ref name="inter"></interceptor-ref> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
    </action> 
  </package> 
</struts> 

(2)loginAction類,設置裝備擺設login.jsp中的action,分離在該類中添加Method1-Method3三個辦法,個中Method1被攔阻,Method2和Method3不被攔阻,最初我們檢查輸入成果。

package com.action; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
public class loginAction extends ActionSupport { 
  @Override 
  public String execute() throws Exception { 
    if(this.username.equals("admin") && this.password.equals("admin")){ 
      return "success"; 
    }else if(this.username.equals("cancel") && this.password.equals("cancel")){ 
      return "cancel"; 
    }else{ 
      return "error"; 
    } 
  } 
   
  public void Method1(){ 
    System.out.println("履行辦法:Method1"); 
  } 
   
  public void Method2(){ 
    System.out.println("履行辦法:Method2"); 
  } 
   
  public void Method3(){ 
    System.out.println("履行辦法:Method3"); 
  } 
   
  private String username; 
  private String password; 
   
  public String getUsername(){ 
    return this.username; 
  } 
   
  public void setUsername(String username){     
    this.username=username; 
  } 
   
  public String getPassword(){ 
    return this.password; 
  } 
   
  public void setPassword(String password){ 
    this.password=password; 
  } 
   
   
} 

(3)inter類,繼續MethodFilterInterceptor類,用來完成攔阻辦法。重寫doIntercept辦法,在該辦法中添加攔阻的響應信息。

package com.interceptor; 
 
import java.util.Date; 
import java.util.Map; 
 
import com.action.loginAction; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 
 
public class inter extends MethodFilterInterceptor { 
   
  @Override 
  protected String doIntercept(ActionInvocation invocation) throws Exception { 
    // TODO Auto-generated method stub  
     System.out.println("攔阻器在Action履行前攔阻"+new Date());  
     String result=invocation.invoke(); //履行Action辦法 
     System.out.println("攔阻器在Action履行後攔阻"+new Date());  
    return result;  
 
  } 
 
} 

(4)login.jsp,在jsp頁面上添加三個按鈕,分離演示三個辦法,斷定攔阻器對辦法的攔阻情形。三個按鈕在點擊後回發的action是在javascript中靜態的停止添加的,如許做到達了一個form中履行分歧的action的辦法,固然還有其它的辦法,將會鄙人篇文章中評論辯論。

<%@ page language="java" contentType="text/html; charset=UTF-8" 
  pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
<script type="text/javascript"> 
   
  //辦法1,界說被攔阻的辦法的實例 
  function method1(){ 
    var form=document.forms[0]; 
    form.action="loginaction!Method1"; 
    form.submit(); 
  } 
   
  //辦法2,為按鈕2添加不攔阻的辦法 
  function method2(){ 
    var form=document.forms[0]; 
    form.action="loginaction!Method2"; 
    form.submit(); 
  } 
   
  //辦法3,為按鈕3添加不攔阻的辦法 
  function method3(){ 
    var form=document.forms[0]; 
    form.action="loginaction!Method3"; 
    form.submit(); 
  } 
</script> 
</head> 
<body> 
  <form> 
    用戶名:<input type="text" name="username"><br> 
    密   碼:<input type="text" name="password"><br> 
    <input type="submit" name="ok" value="按鈕1" onclick="method1()"> 
    <input type="submit" name="ok1" value="按鈕2" onclick="method2()"> 
    <input type="submit" name="ok2" value="按鈕3" onclick="method3()"> 
  </form> 
</body> 
</html> 

運轉完成後的頁面視圖:

(5)剖析運轉成果,分離單擊按鈕1、2、3,在掌握台中輸入成果,按鈕1是綁定的method1,該辦法在struts.xml中停止了攔阻假如成果准確的話會顯示被攔阻的成果,而響應的按鈕2和3只輸入運轉成果,由於它們沒有被攔阻。那看上面的成果圖:

成果圖正好恰是了我們的剖析成果,按鈕1被攔阻了,履行了inter類中的doIntercept辦法,二響應的按鈕2和3沒有被攔阻。也就是說,Method1被放到了辦法攔阻器的白名單內,履行要攔阻該辦法;Method2被放到了攔阻器黑名單內,不須要攔阻該辦法;Method3不做任何處置。

7、結語

關於攔阻器的內容就總結到這裡,攔阻器供給了很壯大的功效,使得開辟人員可以或許在運轉時掌握輸入成果,增長了編程的靈巧性。別的關於任何實際性的器械都不要試圖去記憶,必定要感性的去剖析,多多理論,著手做幾個實例,剖析成果更深入的懂得。

PS:Struts2(XWork)供給的攔阻器的功效解釋

攔阻器

名字

解釋

Alias Interceptor

alias

在分歧要求之間將要求參數在分歧名字件轉換,要求內容不變

Chaining Interceptor

chain

讓前一個Action的屬性可以被後一個Action拜訪,如今和chain類型的result(<result type=”chain”>)聯合應用。

Checkbox Interceptor

checkbox

添加了checkbox主動處置代碼,將沒有選中的checkbox的內容設定為false,而html默許情形下不提交沒有選中的checkbox。

Cookies Interceptor

cookies

應用設置裝備擺設的name,value來是指cookies

Conversion Error Interceptor

conversionError

將毛病從ActionContext中添加到Action的屬性字段中。

Create Session Interceptor

createSession

主動的創立HttpSession,用來為須要應用到HttpSession的攔阻器辦事。

Debugging Interceptor

debugging

供給分歧的調試用的頁面來展示外部的數據狀態。

Execute and Wait Interceptor

execAndWait

在後台履行Action,同時將用戶帶到一個中央的期待頁面。

Exception Interceptor

exception

將異常定位到一個畫面

File Upload Interceptor

fileUpload

供給文件上傳功效

I18n Interceptor

i18n

記載用戶選擇的locale

Logger Interceptor

logger

輸入Action的名字

Message Store Interceptor

store

存儲或許拜訪完成ValidationAware接口的Action類湧現的新聞,毛病,字段毛病等。

Model Driven Interceptor

model-driven

假如一個類完成了ModelDriven,將getModel獲得的成果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

假如一個Action完成了ScopedModelDriven,則這個攔阻器會從響應的Scope中掏出model挪用Action的setModel辦法將其放入Action外部。

Parameters Interceptor

params

將要求中的參數設置到Action中去。

Prepare Interceptor

prepare

假如Acton完成了Preparable,則該攔阻器挪用Action類的prepare辦法。

Scope Interceptor

scope

將Action狀況存入session和application的簡略辦法。

Servlet Config Interceptor

servletConfig

供給拜訪HttpServletRequest和HttpServletResponse的辦法,以Map的方法拜訪。

Static Parameters Interceptor

staticParams

從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。

Roles Interceptor

roles

肯定用戶能否具有JAAS指定的Role,不然不予履行。

Timer Interceptor

timer

輸入Action履行的時光

Token Interceptor

token

經由過程Token來防止雙擊

Token Session Interceptor

tokenSession

和Token Interceptor一樣,不外雙擊的時刻把要求的數據存儲在Session中

Validation Interceptor

validation

應用action-validation.xml文件中界說的內容校驗提交的數據。

Workflow Interceptor

workflow

挪用Action的validate辦法,一旦有毛病前往,從新定位到INPUT畫面

Parameter Filter Interceptor

N/A

從參數列表中刪除不用要的參數

Profiling Interceptor

profiling

經由過程參數激活profile

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