web.xmlロード順序

6961 ワード

web.xmlファイルには、servlet、spring、filter、listenerの構成が一般的に含まれています.では、彼らはどのような順序でロードされていますか?
ロード順序はspring beanの呼び出しに影響します.
例えば、filterはbeanを使用する必要がありますが、ロード順序はfilterをロードした後にspringをロードするので、filterの初期化操作のbeanはnullです.
まず、ロード順序がwebにあることを肯定することができます.xmlファイルの優先順位は関係ありません.
web.xmlでのlistenerとserverletのロード順序は、listener以降のserverletです.
最終結果:
先listener>>filter>>servlet>>spring
したがって、フィルタでbeanを使用する場合はspringのロードをListenerに変更することができます.

<listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

やった!
彼らの内部実行順序についても、以下の文章で遭遇した問題のように注意する必要があります.
web.xmlのfilter実行順序による文字化けし、覚えておいて!
バグの原因はwebであることが分かった.xmlの次の行:

<filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

servlet 2による.3規範filterの実行はwebに従う.xml構成の
filter-mappingは順番に実行するので、上記の構成では*に遭遇する.doのurl要求は,まずSecurityFilterのフィルタ処理を行い,このとき符号化処理を行わず,すでに乱符号化されており,次のfilter処理時にはすでに乱符号化されており,符号化処理を行うことはもはや役に立たない.
修正方式は、filter-mapping順序を調整し、以下のようにします.

  <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

まず決定できる点は、異なるタイプのノードのロード順序がwebにあることである.xmlに現れる順序は関係ありません.すなわち、filterがlistenerに書く前にfiterをロードすることはありません.
の4つのノードについて、サーバを起動するときのロード順序はcontext-param-->listener-->filter-->servletである
   
まずです.WEBプロジェクトを開始すると、WEBコンテナはコンフィギュレーション記述子ファイル(web.xml)のノード情報を読み込みます.は、サーブレットContextにキー値ペア、すなわちアプリケーションコンテキスト情報を提供するために使用されます.これらの情報は、listener、filter、servletを初期化するときに使用される可能性があります.
例えばListener(Listener)にはcontextInitialized(S o v e r t e ContextEvent contextEvent)の初期化方法があり、この方法ではcontextEventを用いることができる.getServiceletContext()は、サーブレットContextオブジェクトを取得し、次に、サーブレットContextからgetInitParameter(String)メソッドでのキー値を取得します.

ServletContext servletContext = contextEvent.getServletContext(); 
Object context-param   = servletContext .getInitParameter("context-param  ");

は、の2つのサブ要素を含む.前者はcontextの名前を設定し、後者はその値を設定します.
param-valueに複数の値がある場合は、カンマで区切ります.ではワイルドカードも使用できます.たとえば、次のようにします.

<strong> <context-param>  
       <param-name>contextConfigLocation</param-name>  
       <param-value>  
           classpath*:/applicationContext.xml,classpath*:/applicationContext-security.xml  
       </param-value>  
</context-param> </strong>

次にlistenerを初期化します.主なサブ要素はです.たとえば、次のようになります.

<listener>  
     <listener-class>  
         org.springframework.web.context.ContextLoaderListener  
     </listener-class>  
</listener>  

そしてfilterです.filter要素には、主におよびが含まれ、典型的なノード宣言は次の通りです.

<filter>
    <filter-name>Cache Filter - Friendly</filter-name>
    <filter-class>com.liferay.portal.servlet.filters.cache.CacheFilter</filter-class>
    <init-param>
        <param-name>pattern</param-name>
        <param-value>0</param-value>
    </init-param>
</filter>

filter-mappingは、filterに対応するurlマッチングモードを定義するために使用され、2つのサブ要素があり、それぞれであり、典型的なノードは以下の通りである.

 <filter-mapping>
     <filter-name>Cache Filter - Layout</filter-name>
     <url-pattern>/c/portal/layout</url-pattern>
 </filter-mapping>

注:同じタイプの構成セクションでは、表示される順序に関連しています.を例にとると、web.xmlではもちろん複数のを定義できますが、に関連する構成セクションはです.ここでは、同じを持つおよび構成セクションでは、の後に表示される必要があります.そうしないと、に解析されると、対応するはまだ定義されていません.Webコンテナの起動時に各を初期化すると、構成セクションが表示される順序で初期化され、要求リソースが複数のに一致する場合、ブロッキングリソースは構成セクションが表示される順序でdoFilter()メソッドを順次呼び出す.
最後にservletを初期化します.filterと同様にservletもの2つの部分に分けて宣言されています.典型的なservlet宣言は次のとおりです.

<servlet>
    <servlet-name>Friendly URL Servlet - Private User</servlet-name>
    <servlet-class>com.liferay.portal.servlet.FriendlyURLServlet</servlet-class>
    <init-param>
        <param-name>user</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>Friendly URL Servlet - Private User</servlet-name>
        <url-pattern>/user/*</url-pattern>
</servlet-mapping>

ここで、の値が正またはゼロの場合、サーブレット容器は、数値の小さいservletを先にロードし、他の数値の大きいservletを順次ロードする.値が負または未定義の場合:サーブレットコンテナは、Webクライアントがこのサーブレットに初めてアクセスするときにロードされます.