ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Web アプリケーション、サーブレット、JSP の開発
11g リリース 1 (10.3.1)
B55521-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

7 Web アプリケーションのリソースのコンフィグレーション

以下の節では、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.xmlweblogic.xml の両方のデプロイメント記述子を使用します。このマッピングにより、アプリケーション コードを変更せずにこれらのリソースを変更できるようになります。デプロイメント記述子には、Java コードで使用される名前、JNDI ツリーにバインドされているとおりのリソースの名前、リソースの Java タイプを指定します。また、リソースのセキュリティをサーブレットによってプログラム的に処理するか、または HTTP リクエストに関連付けられる資格に基づいて処理するかを指定します。また、JMS モジュールのリソース (キュー、トピック、接続ファクトリなど) にアクセスすることもできます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JMS のコンフィグレーションと管理』の「JMS アプリケーション モジュールのデプロイメントのコンフィグレーション」を参照してください。

リソースをコンフィグレーションするには、次の手順に従います。

  1. コードで使用するリソース名、Java タイプ、およびセキュリティ認可タイプをデプロイメント記述子に入力します。

  2. リソース名を JNDI 名にマップします。

    次の例に、外部データソースの使用方法を示します。この例は、accountDataSource というデータ ソースが定義されていることを前提としています。詳細については、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「JDBC データ ソースの作成」を参照してください。

コード リスト 7-1 外部データソースの使用例

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 Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。

Web アプリケーションで使用するために外部 EJB を参照するには、次の手順に従います。

  1. コード内で EJB をルックアップするために使用する EJB 参照名、Java クラス名、EJB のホームおよびリモート インタフェースのクラス名を、J2EE 標準のデプロイメント記述子 web.xmlejb-ref 要素に入力します (web.xml ファイルは、Web アプリケーションの WEB-INF ディレクトリにあります)。

  2. WebLogic 固有のデプロイメント記述子である weblogic.xmlejb-reference-description 要素にある参照名を、weblogic-ejb-jar.xml ファイルに定義された JNDI 名にマップします。

    Web アプリケーションがエンタープライズ アプリケーション アーカイブ (EAR ファイル) の一部である場合は、J2EE 標準のデプロイメント記述子 web.xmlejb-link 要素のある EAR で使用される名前で 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 つの役割を果たします。

アプリケーション スコープの EJB の参照

アプリケーションの内部で、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 を使用できるようにするには、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 要素は以下のようになります。

コード リスト 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 です。

ClasspathServlet による CLASSPATH からのリソースの提供

システム CLASSPATH から、または Web アプリケーションの WEB-INF/classes ディレクトリからクラスまたは他のリソースを提供する必要がある場合、ClasspathServlet と呼ばれる特殊なサーブレットを使用できます。ClasspathServlet はアプレットまたは RMI クライアントを使用し、サーバサイド クラスへのアクセスを必要とするアプリケーションで役に立ちます。ClasspathServlet は暗黙的に登録され、任意のアプリケーションから利用できます。

ClasspathServlet は、デフォルトでは常に有効です。無効にするには、ServerMBean のパラメータ ClassPathServletDisabledtrue に設定します (デフォルトは false)。

ClasspathServlet はシステム CLASSPATH から次の順序でクラスまたはリソースを返します。

  1. WEB-INF/classes

  2. WEB-INF/lib/* の下の jar ファイル

  3. システム 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 の使用


注意 :

WebLogic Server には、レガシー CGI (Common Gateway Interface) スクリプトのサポート機能が用意されています。しかし、新しいプロジェクトでは、HTTP サーブレットまたは JavaServer Pages を使用することをお勧めします。

WebLogic Server は、CGIServlet という内部 WebLogic サーブレットを介してすべての CGI スクリプトをサポートします。CGI を使用するには、この CGIServlet を Web アプリケーション デプロイメント記述子に登録します。「クライアントによる Web アプリケーションへのアクセス方法のコンフィグレーション」を参照してください。

CGI を使用するための WebLogic Server のコンフィグレーション

WebLogic Server で CGI をコンフィグレーションするには、次の手順に従います。

  1. J2EE 標準の Web アプリケーション デプロイメント記述子 web.xml 内の servlet および servlet-mapping 要素を使用して、Web アプリケーション内で CGIServlet を宣言します。web.xml ファイルは、Web アプリケーションの WEB-INF ディレクトリにあります。CGIServlet のクラス名は、weblogic.servlet.CGIServlet です。このクラスを Web アプリケーションにパッケージ化する必要はありません。

  2. 次の 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>

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 スクリプトの名前

CGI のベスト プラクティス

CGI のベスト プラクティスのリストについては、「CGI のベスト プラクティス」を参照してください。