| Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発 11g リリース1 (10.3.6) B60993-05 |
|
![]() 前 |
![]() 次 |
次の項では、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アプリケーション・モジュールのデプロイメントの構成に関する項を参照してください。
リソースを構成するには:
コードで使用するリソース名、Javaタイプ、およびセキュリティ認可タイプをデプロイメント記述子に入力します。
リソース名をJNDI名にマップします。
次の例に、外部データ・ソースの使用方法を示します。この例は、accountDataSourceというデータ・ソースが定義されていることを前提としています。詳細は、Oracle WebLogic Server管理コンソール・ヘルプのJDBCデータ・ソースに関する項を参照してください。
例7-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>
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 WebLogic Enterprise JavaBeansのプログラミング』を参照してください。
Webアプリケーションで使用するために外部EJBを参照するには:
コード内でEJBをルックアップするために使用するEJB参照名、Javaクラス名、EJBのホームおよびリモート・インタフェースのクラス名を、Java EE標準のデプロイメント記述子web.xmlのejb-ref要素に入力します(web.xmlファイルは、WebアプリケーションのWEB-INFディレクトリにあります。)
WebLogic固有のデプロイメント記述子であるweblogic.xmlのejb-reference-description要素にある参照名を、weblogic-ejb-jar.xmlファイルに定義されたJNDI名にマップします。
WebアプリケーションがEnterprise Application Archive (EARファイル)の一部である場合は、Java EE標準のデプロイメント記述子web.xmlのejb-ref要素を使用して、そのEARで使用されている名前によってEJBを参照できます。
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要素のリンク。
アプリケーション内で、WebLogic Serverは他のアプリケーション・コンポーネントから参照されるEJBを参照するコンポーネントに関連付けられた環境にバインドします。これらのリソースは、java:comp/envを基準とした相対的なJNDI名のルックアップを通じて、実行時にアクセスされます。
EJBとWebアプリケーションを含むアプリケーション(エンタープライズ・アプリケーションとも呼ばれる)のアプリケーション・デプロイメント記述子(application.xml)の例を以下に示します(簡潔に示すために、この例ではXMLヘッダーは省略しています。)
例7-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要素は以下のようになります。
例7-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)には、以下のようなエントリが必要です。
例7-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です。
システム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には、レガシーCGI (Common Gateway Interface)スクリプトのサポート機能が用意されています。しかし、新しいプロジェクトでは、HTTPサーブレットまたはJavaServer Pagesを使用することをお薦めします。 |
WebLogic Serverは、CGIServletという内部WebLogicサーブレットを介してすべてのCGIスクリプトをサポートします。CGIを使用するには、このCGIServletをWebアプリケーション・デプロイメント記述子に登録します。「クライアントによるWebアプリケーションへのアクセス方法の構成」を参照してください。
WebLogic ServerでCGIを構成するには:
Java EE標準のWebアプリケーション・デプロイメント記述子web.xml内でservletおよびservlet-mapping要素を使用して、Webアプリケーション内でCGIServletを宣言します。(web.xmlファイルは、WebアプリケーションのWEB-INFディレクトリにあります。)CGIServletのクラス名は、weblogic.servlet.CGIServletです。このクラスをWebアプリケーションにパッケージ化する必要はありません。
次のinit-param要素を定義して、CGIServlet用の次の初期化属性を登録します。
cgiDir - CGIスクリプトが存在するディレクトリのパス。複数のディレクトリを指定するには、";" (Windows)または":" (UNIX)で区切ります。cgiDirを指定しない場合、Webアプリケーション・ルートの下のcgi-binがデフォルトのディレクトリとなります。
useByteStream - デフォルトでは、CGIスクリプトの出力の読取りには、文字ストリームが使用されます。スクリプトによりバイナリ・データが生成される際、文字エンコーディングのせいでストリームが破損する場合があります。ストリームが破損しないようにするには、useByteStreamパラメータを使用します。このパラメータをASCII出力に使用すると、パフォーマンスの向上にもつながります。
extension mapping - スクリプトを実行する実行可能ファイルまたはインタープリタにファイル拡張子をマップします。スクリプトが実行可能ファイルを必要としない場合、この初期化属性は省略可能です。
拡張子マッピング用のparam-nameは、*.plのように、アスタリスク、ドット、ファイル拡張子の順で指定する必要があります。
param-valueは、スクリプトを実行するインタープリタまたは実行可能ファイルへのパスを含んでいます。個別のマッピングに独立したinit-param要素を作成すると、複数のマッピングを作成できます。
例7-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
ここで
host:port - WebLogic Serverのホスト名とポート番号
myWebApp - Webアプリケーションの名前
cgi-bin - CGIServletにマップされるurl-pattern名
myscript.pl - cgiDir初期化属性で指定したディレクトリに存在するPerlスクリプトの名前