5

Tomcat では、context.xml でリソース (JDBC 接続、Javax メール セッションなど) を指定し、web.xml でそれらを参照してから、次のように Java にロードできます。

Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/myDB");

ここでどんな魔法のブードゥーが起こっているのか興味があります!コンストラクターにハッシュテーブルまたはその他のオブジェクトを挿入する必要があると予想していたのでInitialContext、context.xml および web.xml で定義されたすべてのものをコンストラクターに挿入します。しかし、それは引数なしのコンストラクターです!!!

だから私は尋ねます.Tomcatは2つのXMLファイルとInitialContext引数のないコンストラクターの間の「ミッシングリンク」を埋めて、インスタンスDataSourceから魔法のように利用できるようにするために何をしますか? ctx前もって感謝します!

4

3 に答える 3

10

あなたが説明するように、魔法のブードゥー教にはいくつかの部分があります.

まず、起動プロセスの早い段階で Tomcat が次のように呼び出します。

System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
        "org.apache.naming.java.javaURLContextFactory");

これにより、JVM は、Tomcat 独自のファクトリを使用して InitialContext のインスタンスを作成するように指示されます。

2 番目の部分は、各 Web アプリケーションに独自のクラス ローダーがあり、すべてのユーザー コードがスレッド コンテキスト クラス ローダーとして設定されたクラス ローダーで実行されるという事実に基づいています。したがって、新しい InitialContext が作成されると、Tomcat はスレッド コンテキスト クラス ローダーを調べて、どの Web アプリケーションがリクエストを行っているかを判断できます。

そこから、新しい InitialContext オブジェクトを現在のアプリケーションに適した JNDI リソースのセットに接続するのは簡単なプロセスです。

于 2013-07-10T22:07:59.913 に答える
6

context.xml起動時に、Tomcatはそこで定義されているすべてのリソースを読み取って作成し、それらを JNDI コンテキストに登録します。あなたが投稿したコードは、それらのリソースを取得するための単なる方法です。

( web.xmlWeb アプリのデプロイ時に読み込まれます) では、定義されたリソースはまったく新しいものではありません。これらは Web アプリケーションに対してローカルですが、 で定義されたリソースを指しcontext.xmlます。これの目的は、Web アプリの Java コードがサーバー リソースを間接的に検索できるようにすることです。

于 2013-07-10T14:47:04.667 に答える
4

Tomcatのドキュメントによると:

InitialContext は、Web アプリケーションが最初にデプロイされるときに構成され、Web アプリケーション コンポーネントで使用できるようになります (読み取り専用アクセス用)。

私が推測しなければならなかった場合、彼らは構成ファイル($CATALINA_BASE/conf/server.xmlなど)の静的な場所を読み取り、デプロイされた各 Web アプリケーションにそれを提供するだけです。ドキュメントには、各ファイルの各タイプのエントリと、それぞれがどのように扱われるかについても詳しく説明されています。

IntialContext.javaのソース コードを見ると、HashTable に関するあなたの推測は正しいです。1 つのコンストラクターがあり、エントリを HashTable myProps に格納するように見えます。

于 2013-07-10T14:44:12.920 に答える