WebLogic Server Web アプリケーション、サーブレット、JSP の開発
![]() |
![]() |
![]() |
![]() |
以下の節では、Web アプリケーション リソースをコンフィグレーションする方法について説明します。
Web アプリケーションで使用するリソースは、通常 Web アプリケーションの外部にデプロイされます。オプションとして、JDBC データソースを EAR ファイルの一部として Web アプリケーションのスコープの中でデプロイできます。
Web アプリケーションで外部リソースを使用するには、web.xml
および weblogic.xml
デプロイメント記述子を使用して、アプリケーションが使用する JNDI リソース名をグローバル JNDI リソース名で解決する必要があります (web.xml
ファイルは、Web アプリケーションの WEB-INF
ディレクトリにあります)。詳細については、「リソースのコンフィグレーション」を参照してください。
JDBC データソースは、weblogic-application.xml デプロイメント記述子内でそれらのリソースをコンフィグレーションすることによって、Web アプリケーション EAR ファイルの一部としてデプロイすることもできます。スコープがアプリケーションとして定義された、EAR ファイルの一部としてデプロイされるリソースを、アプリケーション スコープ リソースと呼びます。これらのリソースは、アプリケーションに対してはプライベートなままであり、アプリケーション コンポーネントは「リソースのコンフィグレーション」で説明するように <resource-ref>
を追加することで、リソース名にアクセスできます。
Web アプリケーションから JNDI (Java Naming and Directory Interface) を介してデータソースなどのリソースにアクセスする場合、コード内でルックアップする JNDI 名を、グローバル JNDI ツリーにバインドされている実際の JNDI 名にマップできます。このマッピングを行うには、web.xml
と weblogic.xml
の両方のデプロイメント記述子を使用します。このマッピングにより、アプリケーション コードを変更せずにこれらのリソースを変更できるようになります。デプロイメント記述子には、Java コードで使用される名前、JNDI ツリーにバインドされているとおりのリソースの名前、リソースの Java タイプを指定します。また、リソースのセキュリティをサーブレットによってプログラム的に処理するか、または HTTP リクエストに関連付けられる資格に基づいて処理するかを指定します。また、JMS モジュールのリソース (キュー、トピック、接続ファクトリなど) にアクセスすることもできます。詳細については、『WebLogic JMS のコンフィグレーションと管理』の「JMS アプリケーション モジュールのデプロイメントのコンフィグレーション」を参照してください。
リソースをコンフィグレーションするには、次の手順に従います。
次の例に、外部データソースの使用方法を示します。この例は、accountDataSource
というデータ ソースが定義されていることを前提としています。詳細については、Administration Console オンライン ヘルプの「JDBC データ ソースの作成」を参照してください。
Servlet code:javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup
("myDataSource");
web.xml
のエントリ :
<resource-ref>
.. .
<res-ref-name>myDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
.. .
</resource-ref>
weblogic.xml のエントリ :
<resource-description>
<res-ref-name>myDataSource</res-ref-name>
<jndi-name>accountDataSource</jndi-name>
</resource-description>
Web アプリケーションは、外部参照を使用することによって、異なるアプリケーション (異なる EAR ファイル) の一部としてデプロイされた EJB にアクセスできます。参照される EJB は、その weblogic-ejb-jar.xml
デプロイメント記述子のグローバル JNDI ツリーに名前をエクスポートします。Web アプリケーション モジュールでの EJB 参照は、ejb-reference-description
要素をその weblogic.xml
デプロイメント記述子に追加することによって、このグローバル JNDI 名にリンクできます。
この手順は、Web アプリケーションと EJB との間接レベルを提供しており、サード パーティの EJB や Web アプリケーションを使用していて、EJB を直接呼び出すコードを変更できない場合に便利です。ほとんどの場合、この間接機能を使用しなくても EJB は直接呼び出すことができます。詳細については、『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
Web アプリケーションで使用するために外部 EJB を参照するには、次の手順に従います。
ejb-ref
要素に入力します (web.xml
ファイルは、Web アプリケーションの WEB-INF
ディレクトリにあります)。
web.xml デプロイメント記述子の ejb-ref 要素では、サーブレットまたは JSP のいずれかが特定の EJB を使用することを宣言します。weblogic.xml デプロイメント記述子の ejb-reference-description 要素で、その参照を EJB にバインドします。バインドされた EJB はグローバル JNDI ツリーに通知されます。
ejb-reference-descriptor 要素は、ejb-ref-name 要素を使って解決する ejb-ref 要素を示します。つまり、同じ ejb-ref-name 要素を持つ ejb-reference-descriptor 要素と ejb-ref 要素を同時に使用できます。
ejb-link の構文が追加されたことによって、EJB を使用するサーブレットまたは JSP と使用される EJB が同じアプリケーション内にある場合には、ejb-reference-descriptor 要素は不要になりました。
ejb-ref-name 要素は、web.xml デプロイメント記述子内で次の 2 つの役割を果たします。
ejb-ref-name 要素を ejb1 とした場合、サーブレットまたは JSP のコードは次のようになります。
Context ctx = new InitialContext();
ctx = (Context)ctx.lookup("java:comp/env");
Object o = ctx.lookup("ejb1");
Ejb1Home home = (Ejb1Home) PortableRemoteObject.narrow(o, Ejb1Home.class);
アプリケーションの内部で、WebLogic Server は、他のアプリケーション コンポーネントによって参照される EJB を、参照するコンポーネントに関連付けられた環境にバインドします。これらのリソースは、java:comp/env を基準とした相対的な JNDI 名のルックアップを通じて、実行時にアクセスされます。
EJB と Web アプリケーションを含むアプリケーション (エンタープライズ アプリケーションとも呼ばれる) のアプリケーション デプロイメント記述子 (application.xml) の例を以下に示します (簡潔に示すために、この例では XML ヘッダは省略しています)。
<application>
<display-name>MyApp</display-name>
<module>
<web>
<web-uri>myapp.war</web-uri>
<context-root>myapp</context-root>
</web>
</module>
<module>
<ejb>ejb1.jar</ejb>
</module>
</application>
Web アプリケーションのコードで ejb1.jar 内の EJB を使用できるようにするには、J2EE 標準の Web アプリケーション デプロイメント記述子 web.xml に、JAR ファイルを参照する ejb-link と、呼び出される EJB の名前を含む ejb-ref スタンザが含まれている必要があります。
ejb-link エントリのフォーマットは以下のようにする必要があります。
filename#ejbname
filename は Web アプリケーションに対する相対的な JAR ファイル名、ejbname はその JAR ファイル内の EJB です。ejb-link 要素は以下のようになります。
<ejb-link>../ejb1.jar#myejb</ejb-link>
JAR のパスは WAR ファイルに対して相対的なので、「../」で始まります。また、ejbname がそのアプリケーション全体でユニークな場合、JAR のパスは省略してもかまいません。その結果、エントリは以下のようになります。
<ejb-link>myejb</ejb-link>
ejb-link 要素は、Web アプリケーションの web.xml 記述子に含まれる ejb-ref 要素の下位要素です。ejb-ref 要素は以下のようになります。
<web-app>
...
<ejb-ref>
<ejb-ref-name>ejb1</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>mypackage.ejb1.MyHome</home>
<remote>mypackage.ejb1.MyRemote</remote>
<ejb-link>../ejb1.jar#myejb</ejb-link>
</ejb-ref>
...
</web-app>
<ejb-link>../ejb1.jar#ejb1</ejb-link>,
この構文で # の左側の部分は、参照される EJB モジュールの相対パスです。# の右側の構文は、そのモジュールで参照される特定の EJB です。上記の例では、EJB の JAR ファイルと WAR ファイルが同じレベルにあります。
ejb-link で参照される名前 (この例では myejb) は、参照される EJB の記述子の ejb-name 要素に対応しています。その結果、この ejb-ref が参照している EJB モジュールのデプロイメント記述子 (ejb-jar.xml) には、以下のようなエントリが必要です。
<ejb-jar>
...
<enterprise-beans>
<session>
<ejb-name>myejb</ejb-name>
<home>mypackage.ejb1.MyHome</home>
<remote>mypackage.ejb1.MyRemote</remote>
<ejb-class>mypackage.ejb1.MyBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
...
</ejb-jar>
実行時に、Web アプリケーション コードが java:/comp/env に基づいて EJB の JNDI 名をルックアップすることを確認します。サーブレット コードの例は以下のとおりです。
MyHome home = (MyHome)ctx.lookup("java:/comp/env/ejb1");
この例で使用される名前 (ejb1) は、上記の web.xml の抜粋の ejb-ref 要素で定義される ejb-ref-name です。
システム CLASSPATH
から、または Web アプリケーションの WEB-INF/classes
ディレクトリからクラスまたは他のリソースを提供する必要がある場合、ClasspathServlet
と呼ばれる特殊なサーブレットを使用できます。ClasspathServlet
はアプレットまたは RMI クライアントを使用し、サーバサイド クラスへのアクセスを必要とするアプリケーションで役に立ちます。ClasspathServlet
は暗黙的に登録され、任意のアプリケーションから利用できます。
ClasspathServlet
は、デフォルトでは常に有効です。無効にするには、ServerMBean のパラメータ ClassPathServletDisabled を true に設定します (デフォルトは false)。
ClasspathServlet
はシステム CLASSPATH
から次の順序でクラスまたはリソースを返します。
Web アプリケーションの WEB-INF/classes
ディレクトリからリソースを提供する場合、次のような URL でリソースを呼び出します。
http://server:port/myWebApp/classes/my/resource/myClass.class
この場合、リソースは Web アプリケーションのルートを基準にした次のディレクトリにあります。
WEB-INF/classes/my/resource/myClass.class
警告 : ClasspathServlet
はシステム CLASSPATH
にあるすべてのリソースを提供するので、システム CLASSPATH
には公開できないリソースは置かないでください。
注意 : WebLogic Server には、レガシー CGI (Common Gateway Interface) スクリプトのサポート機能が用意されています。しかし、新しいプロジェクトでは、HTTP サーブレットまたは JavaServer Pages を使用することをお勧めします。
WebLogic Server は、CGIServlet
という内部 WebLogic サーブレットを介してすべての CGI スクリプトをサポートします。CGI を使用するには、この CGIServlet
を Web アプリケーション デプロイメント記述子に登録します。「クライアントによる Web アプリケーションへのアクセス方法のコンフィグレーション」を参照してください。
WebLogic Server で CGI をコンフィグレーションするには、次の手順に従います。
コード リスト 6-5 CGIServlet の登録に使用する Web アプリケーション デプロイメント記述子エントリの例
<servlet>
<servlet-name>CGIServlet</servlet-name>
<servlet-class>weblogic.servlet.CGIServlet</servlet-class>
<init-param>
<param-name>cgiDir</param-name>
<param-value>
/bea/wlserver6.0/config/mydomain/applications/myWebApp/cgi-bin
</param-value>
</init-param>
<init-param>
<param-name>*.pl</param-name>
<param-value>/bin/perl.exe</param-value>
</init-param>
</servlet>
...
<servlet-mapping>
<servlet-name>CGIServlet</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
Perl スクリプトを要求するために使用する URL は、次のパターンに従う必要があります。
http://host:port
/myWebApp
/cgi-bin
/myscript.pl
CGI のベスト プラクティスのリストについては、「CGI のベスト プラクティス」を参照してください。
![]() ![]() |
![]() |
![]() |