6 Webアプリケーションのリソースの構成
この章の内容は以下のとおりです。
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モジュールのリソース(キュー、トピック、接続ファクトリなど)にアクセスすることもできます。
詳細は、『Oracle WebLogic Server JMSリソースの管理』の「JMSアプリケーション・モジュールのデプロイメントの構成」を参照してください。
リソースを構成するには:
例6-1 外部データ・ソースの使用例
servlet code: javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("myDataSource"); web.xml entries: <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 entries: <resource-description> <res-ref-name>myDataSource</res-ref-name> <jndi-name>accountDataSource</jndi-name> </resource-description>
外部EJBの参照
Webアプリケーションは、外部参照を使用することによって、異なるアプリケーション(異なるEARファイル)の一部としてデプロイされたEJBにアクセスできます。参照されるEJBは、そのweblogic-ejb-jar.xml
デプロイメント記述子のグローバルJNDIツリーに名前をエクスポートします。Webアプリケーション・モジュールでのEJB参照は、ejb-reference-description
要素をそのweblogic.xml
デプロイメント記述子に追加することによって、このグローバルJNDI名にリンクできます。
この手順では、WebアプリケーションとEJB間の一定レベルのインダイレクションを提供しており、サード・パーティのEJBやWebアプリケーションを使用していてEJBを直接呼び出すようにコードを変更できない場合に便利です。ほとんどの場合、このインダイレクションを使用しなくてもEJBを直接呼び出すことができます。『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』を参照してください。
Webアプリケーションで使用するために外部EJBを参照するには:
ejb-ref*要素についての詳細
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つの役割を果たします。
-
ユーザー・コード(サーブレットまたはJSP)がEJBのルックアップに使用する名前。したがって、
ejb-ref-name
要素がejb1
である場合は、java:comp/env
を基準とした相対的なejb1
のJNDI名ルックアップを行います。ejb-ref-name
要素は、サーブレットまたはJSPが組み込まれたWebアプリケーションのコンポーネント環境(java:comp/env
)にバインドされます。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);
-
ejb-ref
要素とejb-reference-descriptor
要素のリンク。
アプリケーション・スコープのEJBの参照
アプリケーション内で、WebLogic Serverは他のアプリケーション・コンポーネントから参照されるEJBを参照するコンポーネントに関連付けられた環境にバインドします。これらのリソースは、java:comp/env
を基準とした相対的なJNDI名のルックアップを通じて、実行時にアクセスされます。
EJBとWebアプリケーションを含むアプリケーション(エンタープライズ・アプリケーションとも呼ばれる)のアプリケーション・デプロイメント記述子(application.xml
)の例を以下に示します(簡潔に示すために、この例ではXMLヘッダーは省略しています。)
例6-2 デプロイメント記述子の例
<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を使用できるようにするには、Java EE標準の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
要素は以下のようになります。
例6-3 <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
要素の構文は次のとおりです。
<ejb-link>../ejb1.jar#ejb1</ejb-link>,
この構文で#
の左側の部分は、参照されるEJBモジュールの相対パスです。#
の右側の構文は、そのモジュールで参照される特定のEJBです。上記の例では、EJBのJARファイルとWARファイルが同じレベルにあります。
ejb-link
で参照される名前(この例ではmyejb
)は、参照されるEJBの記述子のejb-name
要素に対応しています。その結果、このejb-ref
が参照しているEJBモジュールのデプロイメント記述子(ejb-jar.xml
)には、以下のようなエントリが必要です。
例6-4 <ejb-jar>要素
<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>
ejb-name
要素はmyejb
に設定されています。
実行時に、Webアプリケーション・コードはjava:/comp/env
に基づいてEJBのJNDI名をルックアップします。サーブレット・コードの例は次のとおりです。
MyHome home = (MyHome)ctx.lookup("java:/comp/env/ejb1");
この例で使用される名前(ejb1)は、上記のweb.xml
の抜粋のejb-ref
要素で定義されるejb-ref-nameです。
ClasspathServletによるCLASSPATHからのリソースの提供
システムCLASSPATH
から、またはWebアプリケーションのWEB-INF/classes
ディレクトリからクラスまたは他のリソースを提供する必要がある場合、ClasspathServlet
と呼ばれる特殊なサーブレットを使用できます。ClasspathServlet
はアプレットまたはRMIクライアントを使用し、サーバー側クラスへのアクセスを必要とするアプリケーションで役に立ちます。ClasspathServlet
は暗黙的に登録され、任意のアプリケーションから利用できます。
ClasspathServlet
は、デフォルトでは常に有効です。無効にするには、ServerMBean
のパラメータClassPathServletDisabled
をtrue
に設定します(デフォルトはfalse
)。
ClasspathServlet
はシステムCLASSPATH
から次の順序でクラスまたはリソースを返します。
-
WEB-INF/classes
-
WEB-INF/lib/*
の下のJARファイル -
システム
CLASSPATH
WebアプリケーションのWEB-INF/classes
ディレクトリからリソースを提供する場合、次のようなURLでリソースを呼び出します。
http://server:port/myWebApp/classes/my/resource/myClass.class
この場合、リソースはWebアプリケーションのルートを基準にした次のディレクトリにあります。
WEB-INF/classes/my/resource/myClass.class
ノート:
WebLogic Serverでは、より制限的で厳しいセキュリティ設定を強制する保護された本番モードが提供され、脅威に対する脆弱性が軽減されます。ServerTemplateMBean
には、セキュア・モードが有効な場合に、JDBCおよびJMS機能に必要な既知のパッケージのクラス・ファイルのみを提供するClasspathServletSecureModeEnabled
属性が含まれます。
セキュア・モードが無効になっている場合は、ClasspathServlet
がサービスを提供する前述のどの場所にも公開しないリソースまたはクラスを配置しないでください。
2021年4月のパッチ・セット更新(PSU)では、ClasspathServletSecureModeEnabled
属性はデフォルトでtrue
に設定されています。
WebLogic ServerでのCGIの使用
WebLogic Serverは、CGIServlet
という内部WebLogicサーブレットを介してすべてのCGIスクリプトをサポートします。CGIを使用するには、このCGIServlet
をWebアプリケーション・デプロイメント記述子に登録します。
「クライアントによるWebアプリケーションへのアクセス方法の構成」を参照してください
ノート:
WebLogic Serverには、レガシーCGI (Common Gateway Interface)スクリプトのサポート機能が用意されています。新規のプロジェクトに対しては、HTTPサーブレットまたはJavaServer Pagesを使用することをお薦めします。
CGIを使用するためのWebLogic Serverの構成
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>
CGIスクリプトのリクエスト
Perlスクリプトをリクエストするために使用するURLは、次のパターンに従う必要があります。
http://host:port/myWebApp/cgi-bin/myscript.pl
ここで
host:port
- WebLogic Serverのホスト名とポート番号
myWebApp
- Webアプリケーションの名前
cgi-bin
- CGIServlet
にマップされるurl-pattern
名
myscript.pl
- cgiDir
初期化属性で指定したディレクトリに存在するPerlスクリプトの名前