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

戻る
戻る
 
次へ
次へ
 

8 Web コンポーネント用の WebLogic アノテーション

以下の節では、アノテーションを使用して Web コンポーネントを記述する方法について説明します。

サーブレット アノテーションと依存性注入

Java EE メタデータ アノテーションの使用により、標準の web.xml デプロイメント記述子は省略可能になりました。Servlet 2.5 仕様 (http://java.sun.com/products/servlet/index.jsp を参照) では、サーブレット、フィルタ、リスナ、タグ ハンドラなどの特定の Web コンポーネントでアノテーションを定義できると規定されています。アノテーションを使用すると、外部リソースに対する依存性を宣言できます。コンテナはこれらのコンポーネントのアノテーションを検出し、コンポーネントのライフサイクル メソッドが呼び出される前に必要な依存性を注入します。依存性注入 (DI) は特定のコンポーネントに対してのみ行われます。「アノテーションをサポートする Web コンポーネント クラス」を参照してください。

アノテーション処理と DI は、バージョンが 2.5 に設定されているすべての Web アプリケーションで実行されます。ただし、アノテーション処理は負荷が大きく、含まれるクラスのサイズによっては Web アプリケーションのデプロイメント時間が長くなる場合があります。Web アプリケーションにアノテーションがなく、バージョンが 2.5 に設定されている場合は、web.xml 記述子で metadata-complete 属性を true に設定することで、Web アプリケーション クラスの不要なアノテーション スキャンを回避できます。または、WebLogic Server の起動時に -Dweblogic.servlet.DIDisabled=true フラグを設定して、すべての Web アプリケーションに対してアノテーション処理と DI を無効にすることもできます。

WebLogic Server アプリケーションでの Java EE アノテーションと依存性注入の使い方の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server アプリケーションの開発』の「Java EE アノテーションと依存性注入の使用」を参照してください。WebLogic Server エンタープライズ JavaBean に対する EJB 固有のアノテーションの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans バージョン 3.0 プログラマーズ ガイド』を参照してください。

アノテーションをサポートする Web コンポーネント クラス

この節では、Java EE に準拠した Web コンテナにおける、リソースに対するアノテーションおよび依存性注入 (DI) の動作について説明します。

Web コンテナでは、表 8-1 に示されているクラスの型に対してのみアノテーションが処理されます。

表 8-1 アノテーションおよび依存性注入をサポートする Web コンポーネントとインタフェース

コンポーネント タイプ インタフェース

サーブレット

javax.servlet.Servlet

フィルタ

javax.servlet.Filter

リスナ

javax.servlet.ServletContextListener
javax.servlet.ServletContextAttributeListener
javax.servlet.ServletRequestListener
javax.servlet.ServletRequestAttributeListener
javax.servlet.http.HttpSessionListener
javax.servlet.http.HttpSessionAttributeListener

タグ ハンドラ

javax.servlet.jsp.tagext.SimpleTag
javax.servlet.jsp.tagext.BodyTag

Web コンテナは、Java Bean のようなクラスおよびその他のヘルパー クラスに対しては、アノテーションを処理しません。Web コンテナでは、DI を実現するために次の手順が行われます。

  1. アノテーション処理 - アノテーションは、Web アプリケーションのデプロイメント フェーズ中に Web コンテナによって処理されます。コンテナは、アノテーションを処理しながら、アノテーションによって影響を受ける記述子内の関連エントリを割り出し、記述子ツリーを更新します。Servlet 2.5 仕様 (http://java.sun.com/products/servlet/index.jsp) では、注入対象を定義することで、すべてのアノテーションを記述子内に宣言できると規定されています。Web コンテナは注入対象で記述子ツリーを更新します。この結果、デプロイメントを継続しながら java:comp/env ツリーが必要なエントリで更新されます。

  2. 依存性注入 (DI) - DI はインスタンスの作成時に (表 8-1 で示された型に対して) 行われます。DI は、リスナとフィルタに対してはデプロイメント フェーズ中に行われます。サーブレットに対してはデプロイメント時でも実行時でも行われます。


    注意 :

    Web アプリケーション コンポーネントでは、1 つの DI が失敗すると、同じコンポーネントに対する以後のすべての DI が無視されます。

Web コンテナによってサポートされるアノテーション

表 8-1 に、Web コンテナによってサポートされる必要のあるすべてのアノテーションを示します。

表 8-2 サポートされるアノテーションのリスト

@ アノテーション 仕様の参照先

DeclaresRoles

14.5.1

EJB

14.5.2

EJBs

14.5.3

PersistenceContext

14.5.5

PersistenceUnit

14.5.7

PersistenceUnits

14.5.8

PersistenceContexts

14.5.6

PostConstruct

14.5.9

PreDestroy

14.5.10

Resource

14.5.4

Resources

14.5.11

WebServiceRef

14.5.13

WebServiceRefs

14.5.14

RunAs

14.5.12


Web コンテナは、Java EE コンテナのアノテーション処理および依存性注入のメカニズムを利用して、この機能を実現します。

Servlet 2.5 仕様では、web.xml 記述子で metadata-complete 属性が true に設定されている場合、Web コンテナはアノテーションを処理できないと規定されています。アノテーションが適切に定義され、アノテーション処理が成功し、依存性が正常に注入されると、アノテーションで記述されたフィールドは正常に初期化され、アノテーションで記述されたメソッドはライフサイクルの適切なフェーズで呼び出されます。DI が失敗すると、これらのアノテーションで記述されたフィールドは null になります。


注意 :

サーブレット、フィルタなどの Web コンポーネント クラス内の複数のメソッドに PostConstruct または PreDestroy アノテーションが付けられている場合、Web コンポーネントではそうしたアプリケーションのデプロイメントに失敗します。同様に、セッション Bean などの EJB コンポーネント クラスに PostConstruct または PreDestroy アノテーションが付けられている場合や、EJB インターセプタに PostConstructPreDestroyPostActivate、または PrePassivate アノテーションが付けられている場合、EJB コンポーネントでもそうしたアプリケーションのデプロイメントに失敗します。

障害の検出と回復

アノテーション処理中に障害が発生した場合には、デプロイメント例外が生成され、その Web アプリケーションのデプロイメントは回避されます。DI 中に障害が発生した場合には、その障害の理由を示す警告メッセージがコンテナによってサーバ ログに書き込まれます。DI 障害の発生時には、クラスのインスタンスにあるアノテーションで記述されたフィールドは null になり、アノテーションで記述されたライフサイクル メソッドは一切呼び出されません。

制限事項

WebLogic サーブレット コンテナでは、web.xml 記述子で宣言される Web コンポーネントに対するアノテーションがサポートされています。weblogic.servlet.WeblogicServletContext メソッドを介して動的に登録されたリスナ、フィルタ、およびサーブレットに対してはアノテーションは処理されず、そうしたコンポーネントに対して DI は行われません。

アノテーションによるサーブレットの記述

WebLogic サーブレット コンテナには、サーブレット用の @WLServlet アノテーション、およびフィルタ用の WLFilter アノテーションが用意されています。これらのアノテーションを使用すると、Web アプリケーション内でサーブレットおよびフィルタを開発でき、web.xml 記述子でそれらを宣言する必要がなくなります。WebLogic サーブレット コンテナには、WLServlet および WLFilter アノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定するための WLInitParam アノテーションも用意されています。

必要なメタデータはすべて、サーブレットまたはフィルタ内にアノテーションで記述できます。コンテナはそれらを検出し、そのアノテーションで記述されたサーブレットまたはフィルタがデプロイされるように記述子ツリーを更新します。

WLServlet

WLServlet アノテーション (weblogic.servlet.annotation.WLServlet) を使用してサーブレット クラスを記述できます。このアノテーションには、サーブレットのパラメータを宣言するためのさまざまな属性を定義します。このアノテーションのすべての属性は、省略可能です。

属性

表 8-3 WLServlet アノテーションの属性

名前 説明 データ型 必須/省略可能

displayName

デプロイメント後のサーブレットの表示名

String

省略可能

description

サーブレットの説明

String

省略可能

icon

アイコンの場所

String

省略可能

name

サーブレットの名前

String

省略可能

initParams

サーブレットの初期化パラメータ

WLInitParam[]

省略可能

loadOnStartup

サーブレットを起動時にロードすべきかどうか

int

省略可能

runAs

サーブレットの run-as ユーザ

String

省略可能

mapping

サーブレットの URL パターン

String[]

省略可能


コード リスト 8-1 に、Servlet クラスでのアノテーションの使い方を示します。

コード リスト 8-1 WLServlet アノテーション

@WLServlet (
   name = "FOO",
   runAs = "SuperUser"
   initParams = { @WLInitParam (name="one", value="1") }
   mapping = {"/foo/*"}
)
. . .

WebLogic サーブレット コンテナは、アノテーションを検出し、このサーブレットをデプロイするためにインストールします。Web アプリケーション デプロイメントのアノテーション処理フェーズ中に、web.xml 記述子に対応する記述子 Bean が、このアノテーションに対応する関連エントリで更新されます。

コード リスト 8-2 に、更新後の記述子 Bean を示します。

コード リスト 8-2 更新された web.xml 記述子

<web-app>
. . .
   <servlet>
      <servlet-name>FOO</servlet-name>
      <servlet-class>my.TestServlet</servlet-class>
      <init-param>
         <param-name>one</param-name>
         <param-value>1</param-value>
      </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>FOO</servlet-name>
      <url-pattern>/foo/*</url-pattern>
   </servlet-mapping>
. . .
</web-app>

障害の検出と回復

このアノテーションの処理中にエラーが発生した場合には、デプロイメント エラーとなり、サーバ ログに適切なメッセージが書き込まれます。

WLFilter

WLFilter アノテーション (weblogic.servlet.annotation.WLFilter) を使用してフィルタ クラスを記述できます。このアノテーションには、フィルタのパラメータを宣言するためのさまざまな属性を定義します。このアノテーションのすべての属性は、省略可能です。

属性

表 8-4 WLFilter アノテーションの属性

名前 説明 データ型 必須/省略可能

displayName

デプロイメント後のフィルタの表示名

String

省略可能

description

フィルタの説明

String

省略可能

icon

アイコンの場所

String

省略可能

name

フィルタの名前

String

省略可能

initParams

フィルタの初期化パラメータ

WLInitParam[]

省略可能

mapping

フィルタの URL パターン

String[]

省略可能


コード リスト 8-3 に、Filter クラスでのアノテーションの使い方を示します。

コード リスト 8-3 WLFilter アノテーション

@WLFilter (
   name = "BAR",
   initParams = { @WLInitParam (name="one", value="1") } 
   Mapping = {"/bar/*"}
)
. . .

WebLogic サーブレット コンテナは、アノテーションを検出し、このフィルタをデプロイするためにインストールします。Web アプリケーション デプロイメントのアノテーション処理フェーズ中に、web.xml 記述子に対応する記述子 Bean が、このアノテーションに対応する関連エントリで更新されます。

コード リスト 8-4 に、更新後の記述子 Bean を示します。

コード リスト 8-4 更新された web.xml 記述子

<web-app>
. . .
   <filter>
      <filter-name>BAR</filter-name>
      <filter-class>my.TestFilter</filter-class>
      <init-param>
         <param-name>one</param-name>
         <param-value>1</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>BAR</filter-name>
      <url-pattern>/bar/*</url-pattern>
   </filter-mapping>
. . .
</web-app>

障害の検出と回復

このアノテーションの処理中にエラーが発生した場合には、デプロイメント エラーとなり、サーバ ログに適切なメッセージが書き込まれます。

WLInitParam

@WLInitParam アノテーション (weblogic.servlet.annotation.WLInitParam) を使用して、@WLServlet および @WLFilter アノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定できます。

属性

表 8-5 WLInitParam アノテーションの属性

名前 説明 データ型 必須/省略可能

name

初期化パラメータの名前

String

省略可能

value

初期化パラメータの値

String

省略可能


コード リスト 8-5 に、WLInitParam アノテーションの例を示します。

コード リスト 8-5 WLInitParam アノテーションの例

initParams = {@WLInitParam(name="one", value="1"),
               @WLInitParam(name="two", value="2")}

上記のアノテーションを使用して Servlet クラスまたは Filter クラスを記述することは、web.xml 記述子でコード リスト 8-6 のように初期化パラメータを宣言することと同じです。

コード リスト 8-6 web.xml での初期化パラメータ

. . .
<init-param>
  <param-name>one</param-name>
  <param-value>1</param-value>
</init-param>
<init-param>
  <param-name>two</param-name>
  <param-value>2</param-value>
</init-param>
. . .