Oracle® Fusion Middleware Oracle WebLogic Server Web アプリケーション、サーブレット、JSP の開発 11g リリース 1 (10.3.1) B55521-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 Fusion Middleware Oracle WebLogic Server アプリケーションの開発』の「Java EE アノテーションと依存性注入の使用」を参照してください。WebLogic Server エンタープライズ JavaBean に対する EJB 固有のアノテーションの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ 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 コンテナによって処理されます。コンテナは、アノテーションを処理しながら、アノテーションによって影響を受ける記述子内の関連エントリを割り出し、記述子ツリーを更新します。Servlet 2.5 仕様 (http://java.sun.com/products/servlet/index.jsp
) では、注入対象を定義することで、すべてのアノテーションを記述子内に宣言できると規定されています。Web コンテナは注入対象で記述子ツリーを更新します。この結果、デプロイメントを継続しながら java:comp/env
ツリーが必要なエントリで更新されます。
依存性注入 (DI) - DI はインスタンスの作成時に (表 8-1 で示された型に対して) 行われます。DI は、リスナとフィルタに対してはデプロイメント フェーズ中に行われます。サーブレットに対してはデプロイメント時でも実行時でも行われます。
注意 : Web アプリケーション コンポーネントでは、1 つの DI が失敗すると、同じコンポーネントに対する以後のすべての DI が無視されます。 |
表 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 インターセプタに 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 に、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
アノテーション (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
アノテーション (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 のように初期化パラメータを宣言することと同じです。