struts2.1.3カスタムFilterの使用後

8480 ワード

struts 2で
ActionContextCleanUp,
StrutsPrepareAndExecuteFilter,
StrutsPrepareFilter,StrutsExecuteFilter,
FilterDispatcherd
 
ドキュメントの説明を見たばかりです(はっきり言っていますが、ドキュメントのほうがいいですね):
org.apache.struts2.dispatcher
Class FilterDispatcher
Deprecated. Since Struts 2.1.3, use  StrutsPrepareAndExecuteFilter  instead or  StrutsPrepareFilter  and  StrutsExecuteFilter  if needing using the ActionContextCleanUp  filter in addition to this one
 
org.apache.struts2.dispatcher  Class ActionContextCleanUp
Deprecated. Since Struts 2.1.3, use  StrutsPrepareFilter  and  StrutsExecuteFilter  to use other Servlet filters that need access to the ActionContext
 
org.apache.struts2.dispatcher.ng.filter  Class StrutsPrepareAndExecuteFilter
Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use when you don't have another filter that needs access to action context information, such as Sitemesh.
 
org.apache.struts2.dispatcher.ng.filter  Class StrutsPrepareFilter
Prepares the request for execution by a later  StrutsExecuteFilter  filter instance.
 
org.apache.struts2.dispatcher.ng.filter  Class StrutsExecuteFilter
Executes the discovered request information. This filter requires the  StrutsPrepareFilter  to have already been executed in the current chain.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FilterDispatcherはstruts 2である.0.xから2.1.2バージョンのコアフィルタStrutsPrepareAndExecuteFilterは2.1からである.3からFilterDispatcherの代わりになった.
StrutsPrepareAndExecuteFilterはStrutsPrepareFilterとStrutsExecuteFilterの組み合わせですが、StrutsPrepareFilterとStrutsExecuteFilterの組み合わせでStrutsPrepareAndExecuteFilterの代わりになるのはいつですか?以下に説明します.
このような改革はもちろんメリットがある.どうしてそう言いますか.もし私たちが自分でフィルタを定義すれば、strtus 2のフィルタの前に置くべきで、struts 2フィルタの後に置くと、あなたの自分のフィルタのactionに対するフィルタ作用は廃棄され、有効ではありません!jsp/htmlにアクセスしない限り!それでは私は今需要があって、私はActionの環境を使わなければならなくて、またactionを実行する前にfilterを持っていくつかの事をしたいと思って、FilterDispatcherではできません.では、StrutsPrepareAndExecuteFilterは彼をStrutsPrepareFilterとStrutsExecuteFilterに分割することができ、この2つのフィルタの間に私たちのフィルタを加えることができます.あなたに比喩を打って、今患者が手術をしなければならなくて、今struts 2は2つの事をして、病床(環境)に乗って、手術を実行します.!では、麻薬を打つ仕事は?患者が立って打つことはあり得ないでしょう.だから、病床の环境が必要で、麻薬を打ってから手术をしなければなりません.この比喩はとてもイメージ的です.
 
 
ActionContextCleanUpも2.1からである.3は、StrutsPrepareFilterとStrutsExecuteFilterの組み合わせで置き換えられます.
例を見てみましょう.
2.1.3前にsitemeshのwebを使います.xmlの構成:
<filter>  
   <filter-name>ActionContextCleanUp</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
</filter>  
<filter>  
   <filter-name>sitemesh</filter-name>  
   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>struts2</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
</filter>  
<filter-mapping>  
   <filter-name>ActionContextCleanUp</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>sitemesh</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>struts2</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  

ここで、ActionContextCleanUp filter SiteMesh filter FilterDispatcherの順序は変更できません.
ActionContextCleanUpの役割は、jspページにアクセスするためのカスタム属性を含むactionの属性のライフサイクルを延長し、actionContextcleanupフィルタによって属性をクリアさせ、actionが自分でクリアさせないようにすることです.
WebWorkを使用するには、Web上でしか必要ありません.xmlはFilterDispatcherの1つのフィルタを構成して、FilterDispatcherのJavaDocとソースコードを読んで、それが呼び出されたことを見ることができます:
finally{            ActionContextCleanUp.cleanUp(req); }
ActionContextCleanUpには、次のようなコードがあります.
         req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);
FilterDispatcherがこの属性を検出すると、ActionContextの内容はクリアされず、ActionContextCleanUpの後続コードによってクリアされ、一連のFilterが正しいActionContextにアクセスすることが保証されます.
 
Struts 2から2.1である.3バージョンが始まると、死んでもだめで、いつも間違っています.新しいバージョンではもうこのような方法は採用できませんでした.【struts 2.1.3からActionContextCleanUpとFilterDispatcherフィルタを開始します.使用することは推奨されません.StrutsPrepareFilterとStrutsExecuteFilterで置き換えます】Struts 2.1.3から以下の構成に変更して統合する必要があります.そうしないと、デザイナページまたはデザイナページ
中にはStruts 2のラベルは使用できません.使用するとエラーメッセージが表示されますthe Struts Dispatcher not found
<filter>  
   <filter-name>StrutsPrepareFilter</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>sitemesh</filter-name>  
   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>StrutsExecuteFilter</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>  
</filter>  
<filter-mapping>  
   <filter-name>StrutsPrepareFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>sitemesh</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>StrutsExecuteFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  

フィルタをStrutsPrepareFilter,sitemesh,StrutsExecuteFilterの順に配置し、sitemeshを挟んでください.
以上の構成で正しく使用できます. 
JAvaカスタムFilter例
Filterを使用するには、Filterの作成とFilterの構成の2つのセクションがあります.
1.Filterの作成:
1)javaxを実現する.servlet.Filterインタフェース
2)インタフェースにおける方法を実現する.
public void init(FilterConfig config) throws ServletException ,
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterchain) throws IOException, ServletException ,
public void destroy()の3つの方法.
 
ここで、doFilterではfilterchain.doFilter(servletRequest, servletResponse);既存のリクエストを続行するためのアクティビティ.
例えばサイトにアクセスしましたjspページは、このページにアクセスする前にデータベースをクエリーしてこのページを初期化したい場合、doFilterメソッドでデータベースクエリーのコードを記述できます.でも後で必ずfilterchainと書きます.doFilter(servletRequest, servletResponse);これにより、データベースクエリーの実行後にindexにジャンプする.jsp.すなわち、filter後も元のリクエストを実行し続けます.
 
注:doFilterのパラメータのrequestおよびresponseパラメータは、セッションを取得する場合はHttpServertRequestおよびHttpServertResponseに変換するサーブレットRequestおよびサーブレットResponseです.requestを通過します.getSession()HttpSessionを取得します.
 
コード例:
import java.io.IOException;  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;  
  
public class UserroleFilter implements Filter{  
      
    public void destroy() {  
          
    }  
      
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,  
            FilterChain filterchain) throws IOException, ServletException {  
      
        HttpServletResponse response = (HttpServletResponse) servletResponse;  
        HttpServletRequest request = (HttpServletRequest)servletRequest;  
        HttpSession session = request.getSession();  
        //                
        filterchain.doFilter(servletRequest, servletResponse);  
    }  
      
    public void init(FilterConfig config) throws ServletException {  
          
    }  
} 

2.Filterの構成:
Webでxmlでフィルタを使用してフィルタをフィルタする要求を構成します.
<filter>  
    <filter-name>selfTestFilter</filter-name>  
    <filter-class>com.maggie.filter.SelfTestFilter</filter-class>  
    </filter>  
<filter-mapping>  
    <filter-name>selfTestFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>