Struts2攔截器簡單示例

攔截器(Interceptor )是Struts 2 的核心組成部分。很多功能(Feature )都是構建在攔截器基礎之上的,例如文件的上傳和下載、國際化、轉換器和數據校驗等,Struts 2 利用內建的攔截器,完成了框架內的大部分操作。
Struts 2 文檔中對攔截器的解釋爲——攔截器是動態攔截Action 調用的對象。它提供了一種機制,使開發者可以定義一個特定的功能模塊,這個模塊可以在Action 執行之前或者之後運行,也可以在一個Action 執行之前阻止Action 執行。同時也提供了一種可以提取Action 中可重用的部分的方式
攔截器在Struts2中的示意圖:
從上圖可以看出,Struts 2 架構的 Action 被一個或者多個攔截器(攔截器棧)所包圍,所有的用戶請求都會被攔截器所攔截,然後交給 Action 處理,處理結果以邏輯視圖方式返回給用戶。而這個調用執行流程,是由 Struts 2 的配置文件來實現的,後面會詳細介紹。攔截器是 Struts 2 核心部分之一。
當用戶請求到達 Struts 2 ServletDispatcher 時, Struts 2 會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表( List ),最後一個一個地調用列表中的攔截器
攔截器時序圖如下圖所示:
Struts 2 架構中, Action 的調用都是通過攔截器來實現的。有的讀者可能會疑惑,爲什麼沒有明確說明攔截器,爲什麼可以直接調用 Action ?那是因爲 Struts 2 架構如果不做顯式的攔截器配置,則系統會調用默認的攔截器來調用 Action ,在用戶看來,好像沒有配置攔截器
 
Hello World攔截器示例.
程序要演示的是顯示地讓攔截器調用Action,來體會攔截器的用途。
一般情況下我們都會先寫出一個Action,然後配置struts.xml文件
MyAction.java
public   class   MyAction  extends   ActionSupport { 

  //以下屬性信息都是從前臺(JSP頁面獲得) 
  private   String username; 
    
  private   String mymsg; 
    
  private   String password1; 
    
  private   String password2; 
    
  private   Date birthday; 

  public   String execute(){ 
    if (username!=null &&this .getPassword1().equals(this .getPassword2())&&!this .getUsername().trim().equals("")){ 
        
      //輸出調試信息 
      System.out.println("Action信息,正在執行Action....  " ); 
      return   SUCCESS; 
    }else { 
      return   INPUT; 
    } 
  } 
    
    

  public   String getUsername() { 
    return   username; 
  } 



  public   void   setUsername(String username) { 
    this .username = username; 
  } 



  public   String getMymsg() { 
    return   mymsg; 
  } 

  public   void   setMymsg(String mymsg) { 
    this .mymsg = mymsg; 
  } 

  public   String getPassword1() { 
    return   password1; 
  } 

  public   void   setPassword1(String password1) { 
    this .password1 = password1; 
  } 

  public   String getPassword2() { 
    return   password2; 
  } 

  public   void   setPassword2(String password2) { 
    this .password2 = password2; 
  } 

  public   Date getBirthday() { 
    return   birthday; 
  } 

  public   void   setBirthday(Date birthday) { 
    this .birthday = birthday; 
  } 
    
} 
 
自定義攔截器MyInterceptor.java
public   class   MyInterceptor  extends   AbstractInterceptor { 

  //攔截方法 
  public   String intercept(ActionInvocation invocation)  throws   Exception { 

    MyAction myA=(MyAction) invocation.getAction(); 
    System.out.println("攔截器信息:hello world 攔截器" ); 
    //執行action或者下一個攔截器 
    String result=invocation.invoke(); 
    System.out.println("攔截器信息:Action執行完畢" ); 
    return   result; 
  } 

}
下面我們開始配置struts.xml文件
首先我定義了一個my.xml文件
<? xml   version ="1.0"   encoding ="UTF-8"   ?>  
<!DOCTYPE struts PUBLIC 
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
        "http://struts.apache.org/dtds/struts-2.0.dtd"> 

< struts >  

        < package   name ="mynew"   namespace ="/"   extends ="struts-default" >  
         
          < interceptors >  
            < interceptor   name ="myInterceptor"   class ="com.MyInterceptor" >  
            </ interceptor >  
          </ interceptors >  
     
    < action   name ="myAction"   class ="com.MyAction" >  
      < result   name ="success" > /success.jsp</ result >  
      < result   name ="input" > /index.jsp</ result >  
      <!--  引用默認攔截器  --> 
      < interceptor-ref   name ="defaultStack" > </ interceptor-ref >  
      <!--  引用自定義攔截器  --> 
      < interceptor-ref   name ="myInterceptor" > </ interceptor-ref >  
    </ action >  
        </ package >  
</ struts >  
 
這樣的話就要在struts.xml引入,
<? xml   version ="1.0"   encoding ="UTF-8"   ?>  
<!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.devMode"   value ="true"   />  
  < include   file ="my.xml" > </ include >  
</ struts >  
如果讀者不習慣的話完全可以寫在struts.xml文件中
 
index.jsp
< %@   page  language ="java"   import ="java.util.*"   pageEncoding ="UTF-8" %>  
< %@   taglib  prefix ="s"   uri ="/struts-tags"   %>  
< html >  
    < head >  
    </ head >  
     
    < body >  
      < s:form   method ="post"   action ="myAction" >     
        < s:textfield   name ="username"   label ="用戶名" > </ s:textfield >  
        < s:password   name ="password1"   label ="密碼" > </ s:password >  
        < s:password   name ="password2"   label ="確認密碼" > </ s:password >  
    < s:submit   value ="註冊" > </ s:submit >  
      </ s:form >  
    </ body >  
</ html >  
success.jsp
<%@ page language="java"   contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8" %> 
<%@ taglib prefix="s"   uri="/struts-tags"   %> 
<!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> 
  <h3>註冊成功</h3> 
  用戶名:<s:property value="username" /><p> 
  密碼:    <s:property value="password1" /> 
</body> 
</html>
後臺輸出結果:
攔截器信息:hello world 攔截器 
Action信息,正在執行Action....    
2010-11-1 20:39:11 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn 
警告: Could not find property [org.apache.catalina.jsp_file] 
攔截器信息:Action執行完畢
發佈了15 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章