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に変更することができます.
やった!
彼らの内部実行順序についても、以下の文章で遭遇した問題のように注意する必要があります.
web.xmlのfilter実行順序による文字化けし、覚えておいて!
バグの原因はwebであることが分かった.xmlの次の行:
servlet 2による.3規範filterの実行はwebに従う.xml構成の
filter-mappingは順番に実行するので、上記の構成では*に遭遇する.doのurl要求は,まずSecurityFilterのフィルタ処理を行い,このとき符号化処理を行わず,すでに乱符号化されており,次のfilter処理時にはすでに乱符号化されており,符号化処理を行うことはもはや役に立たない.
修正方式は、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)メソッドでのキー値を取得します.
は、との2つのサブ要素を含む.前者はcontextの名前を設定し、後者はその値を設定します.
param-valueに複数の値がある場合は、カンマで区切ります.ではワイルドカードも使用できます.たとえば、次のようにします.
次にlistenerを初期化します.主なサブ要素はです.たとえば、次のようになります.
そしてfilterです.filter要素には、主に、およびが含まれ、典型的なノード宣言は次の通りです.
filter-mappingは、filterに対応するurlマッチングモードを定義するために使用され、2つのサブ要素があり、それぞれとであり、典型的なノードは以下の通りである.
注:同じタイプの構成セクションでは、表示される順序に関連しています.を例にとると、web.xmlではもちろん複数のを定義できますが、に関連する構成セクションはです.ここでは、同じを持つおよび構成セクションでは、がの後に表示される必要があります.そうしないと、に解析されると、対応するはまだ定義されていません.Webコンテナの起動時に各を初期化すると、構成セクションが表示される順序で初期化され、要求リソースが複数のに一致する場合、ブロッキングリソースは構成セクションが表示される順序でdoFilter()メソッドを順次呼び出す.
最後にservletを初期化します.filterと同様にservletもとの2つの部分に分けて宣言されています.典型的なservlet宣言は次のとおりです.
ここで、の値が正またはゼロの場合、サーブレット容器は、数値の小さいservletを先にロードし、他の数値の大きいservletを順次ロードする.値が負または未定義の場合:サーブレットコンテナは、Webクライアントがこのサーブレットに初めてアクセスするときにロードされます.
ロード順序は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をロードすることはありません.
まず
例えば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 ");
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>
注:同じタイプの構成セクションでは、表示される順序に関連しています.
最後にservletを初期化します.filterと同様に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>
ここで、