| Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発 11g リリース1 (10.3.3) B60993-01 | 
 | 
|  前 |  次 | 
次の項では、アノテーションを使用して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 WebLogic Serverアプリケーションの開発』のJava EEアノテーションと依存関係インジェクションの使用を参照してください。WebLogic Server Enterprise JavaBeansに対するEJB固有のアノテーションの詳細は、『Oracle WebLogic Server WebLogic Enterprise JavaBeansバージョン3.0のプログラミング』を参照してください。
この項では、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を実現するために次の手順が行われます。
アノテーション処理 - アノテーションは、Webアプリケーションのデプロイメント・フェーズ中にWebコンテナによって処理されます。コンテナはアノテーションを処理しながら、アノテーションによって影響を受ける記述子内の関連エントリを割り出し、記述子ツリーを更新します。http://java.sun.com/products/servlet/index.jspのServlet 2.5仕様では、注入対象を定義することですべてのアノテーションを記述子内に宣言できると規定されています。Webコンテナは、注入対象で記述子ツリーを更新します。この結果、デプロイメントを継続しながらjava:comp/envツリーが必要なエントリで更新されます。
依存関係インジェクション(DI) - DIはインスタンスの作成時に(表8-1で示された型に対して)行われます。DIは、リスナーとフィルタに対してはデプロイメント・フェーズ中に行われます。サーブレットに対してはデプロイメント時または実行時に行われます。
| 注意:Webアプリケーション・コンポーネントでは、1つのDIが失敗すると、同じコンポーネントに対する以後のすべてのDIが無視されます。 | 
表8-2に、Webコンテナによってサポートされる必要のあるすべてのアノテーションを示します。
表8-2 サポートされるアノテーションのリスト
| @アノテーション | 仕様の参照先 | 
|---|---|
| DeclaresRoles | 14.5.1 | 
| EJB | 14.5.2 | 
| EJB | 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インターセプタにPostConstruct、PreDestroy、PostActivateまたはPrePassivateアノテーションが付けられている場合、EJBコンポーネントでもそのようなアプリケーションのデプロイメントに失敗します。 | 
アノテーション処理中に障害が発生した場合には、デプロイメント例外が生成され、そのWebアプリケーションのデプロイメントは回避されます。DI中に障害が発生した場合には、その障害の理由を示す警告メッセージがコンテナによってサーバー・ログに書き込まれます。DI障害の発生時には、クラスのインスタンスにあるアノテーションで記述されたフィールドはnullになり、アノテーションで記述されたライフサイクル・メソッドは一切呼び出されません。
WebLogicサーブレット・コンテナには、サーブレット用の@WLServletアノテーション、およびフィルタ用のWLFilterアノテーションが用意されています。これらのアノテーションを使用すると、Webアプリケーション内でサーブレットおよびフィルタを開発でき、web.xml記述子でそれらを宣言する必要がなくなります。WebLogicサーブレット・コンテナには、WLServletおよびWLFilterアノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定するためのWLInitParamアノテーションも用意されています。
必要なメタデータはすべて、サーブレットまたはフィルタ内にアノテーションで記述できます。コンテナはそれらを検出し、そのアノテーションで記述されたサーブレットまたはフィルタがデプロイされるように記述子ツリーを更新します。
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に、サーブレット・クラスでのアノテーションの使用方法を示します。
例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アノテーション(weblogic.servlet.annotation.WLFilter)を使用してフィルタ・クラスを記述できます。このアノテーションには、フィルタのパラメータを宣言するための様々な属性を定義します。このアノテーションのすべての属性は、省略可能です。
表8-4 WLFilterアノテーションの属性
| 名前 | 説明 | データ型 | 必須? | 
|---|---|---|---|
| displayName | デプロイメント後のフィルタの表示名 | String | いいえ | 
| description | フィルタの説明 | String | いいえ | 
| icon | アイコンの場所 | String | いいえ | 
| name | フィルタの名前 | String | いいえ | 
| initParams | フィルタの初期化パラメータ | WLInitParam[] | いいえ | 
| mapping | フィルタのURLパターン | String[] | いいえ | 
例8-3に、フィルタ・クラスでのアノテーションの使用方法を示します。
例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アノテーション(weblogic.servlet.annotation.WLInitParam)を使用して、@WLServletおよび@WLFilterアノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定できます。