Oracle® Fusion Middleware Oracle WebLogic Server 10.3.6 Webアプリケーション、サーブレット、JSPの開発 11gリリース1 (10.3.6) B60993-07 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Server 10.3.6で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
注意: ClasspathServlet はシステムCLASSPATH にあるすべてのリソースを提供するので、システムCLASSPATH には公開できないリソースは置かないでください。 |
注意: 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>