JAVA Web.xmlロード順序の詳細


web.xmlロードプロセス(ステップ):
1.WEBプロジェクトを起動する時、コンテナ(Tomcat)はその設定ファイルweb.xmlを読みに行きます。二つのノードを読みます。

2.続いて、コンテナはServlet Contectを作成します。このWEBプロジェクトのすべての部分はこのコンテキストを共有します。
3.容器はをキーペアに変換し、Servlet Contectに渡す。
4.容器作成のクラス例、すなわち傍受を作成する。
5.モニターにはcontext Initialized(Servlet Contront Event args)初期化方法があります。
Servlet Context=Servlet ContEvent.get Servlet Conttext()
context-paramの値=Servlet Controtext.get Init Parameter(「context-paramのキー」);
6.このcontext-paramの値を得ると、いくつかの操作ができます。この時、あなたのWEBプロジェクトはまだ完全に起動されていません。この動作はすべてのServletよりも早くなります。
言い換えれば、この時、「context-param」のキーの値に対する操作は、あなたのWEBプロジェクトが完全に起動する前に実行されます。
7.例を挙げます。プロジェクトが始まる前にデータベースを開きたいかもしれません。
ここでデータベースの接続方式を設定し、モニタークラスでデータベースの接続を初期化することができます。
8.この傍受は自分で書いたタイプで、初期化方法以外にも廃棄方法があります。アプリケーションを閉じる前に資源を放出します。たとえばデータベース接続のクローズです。
web.xmlノードローディング順序:
ノードのロード順序は、web.xmlファイルにおけるそれらの順序とは無関係であることは確実である。filterがlistenerの前に書いてあるからといって、先にfilterをロードすることはありません。最終的に得られた結論は、listener->filter->servlet
同時に、Servlet Conteetにキーペア、すなわちアプリケーションコンテキスト情報を提供するためのコンフィギュレーションノードが存在する。私達のlistener、filterなどは初期化の時これらの文脈の中の情報を使って、それならcontext-param配置節はlistener配置節の前で書くべきですか?実際にはcontext-param構成セクションは任意の位置に書くことができます。
context-param->listener->filter->servlet
ある種類の配置節にとって、それらの出現の順序は関係があります。filterを例にとって、web.xmlではもちろん複数のfilterが定義されています。filterに関する1つのコンフィグレーションはfilter-mappingです。ここで注意しなければならないのは、同じfilter-nameを持つfilterとfilter-mappingコンフィグレーションに対して、filter-mappingはfilterの後に現れなければなりません。それに対応するfilter-nameはまだ定義されていません。web容器起動時に各filterを初期化する場合は、filterプロファイルセクションの出現順に初期化され、複数のfilter-mappingにリソースのマッチングを要求する場合、filterブロックリソースは、filter-mapping配置セクションの出現順にdofilter()を順次呼び出す方法である。
servletはfilterと同様であり、ここではもはや説明を省略する。
【Springのロード】
例えば、filterはbeanを使用する必要がありますが、ロード順序は、先にfilterをロードしてからspringをロードすると、filterで初期化操作中のbeanはnullとなります。
したがって、フィルタでbeanに使用する場合は、springのロードをListenerの方式に変更することができます。
<listener>
<listener-class>
org.springframe ework.web.co.ntenxt.context LoaderListener


最終結論:
web.xmlのローディング順序は、[context-param-]listener->filter->servlet->spring]であり、同じタイプのノード間の実際のプログラムが起動されるときの順番は、対応するmappingの順に呼び出すものである。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。