Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発 11gリリース1 (10.3.6) B60993-04 |
|
前 |
次 |
次の項では、アノテーションを使用してWebコンポーネントを記述する方法について説明します。
Java EEメタデータ・アノテーションの使用により、標準のweb.xml
デプロイメント記述子は省略可能になりました。Servlet 2.5仕様(http://www.oracle.com/technetwork/java/javaee/servlet/index.html
を参照)では、サーブレット、フィルタ、リスナー、タグ・ハンドラなどの特定の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コンテナによって処理されます。コンテナはアノテーションを処理しながら、アノテーションによって影響を受ける記述子内の関連エントリを割り出し、記述子ツリーを更新します。Servlet 2.5仕様(http://www.oracle.com/technetwork/java/javaee/servlet/index.html
)では、インジェクション対象を定義することですべてのアノテーションを記述子内に宣言できると規定されています。Webコンテナは、注入対象で記述子ツリーを更新します。この結果、デプロイメントを継続しながらjava:comp/env
ツリーが必要なエントリで更新されます。
依存関係インジェクション(DI) - DIはインスタンスの作成時に(表8-1で示された型に対して)行われます。これは、リスナーとフィルタに対してはデプロイメント・フェーズで発生します。サーブレットに対してはデプロイメント中または実行時に発生する可能性があります。
注意: 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
アノテーションを使用して宣言されたサーブレットおよびフィルタの初期化パラメータを指定できます。