blob: 6aa84d9b34f92aecb3afafb7e1bd68a144902b1e [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>コンテキストと依存性の注入およびJSF 2.xの開始 - NetBeans IDEチュートリアル</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="A demonstration of how to set up a JSF 2.0 project with CDI support in NetBeans IDE">
<meta name="keywords" content="NetBeans, IDE, integrated development environment, JSF 2.0, JavaServer Faces,
Contexts and Dependency Injection, CDI, Web Beans">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
</head>
<body>
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<h1>コンテキストと依存性の注入およびJSF 2.xの開始</h1>
<p><em>執筆: Andy Gibson</em></p>
<div class="margin-around">
<div class="feedback-box margin-around float-left" style="margin-right:15px">
<h3>コンテキストと依存性の注入</h3>
<ol>
<li><strong>CDIおよびJSF 2.0の開始</strong>
<ul style="margin: 5px 0 0 -2em">
<li><a href="#creating">CDIをサポートするJava Webプロジェクトの作成</a></li>
<li><a href="#named">JSFの式言語からのBeanへのアクセス</a></li>
<li><a href="#upgrading">EJBへのアップグレード</a></li>
<li><a href="#seealso">関連項目</a></li>
</ul></li>
<li><a href="cdi-inject.html">CDIの注入および修飾子の操作</a></li>
<li><a href="cdi-validate.html">@Alternative Beanおよびライフサイクル注釈の適用</a></li>
<li><a href="cdi-events.html">CDIのイベントの操作</a></li>
</ol>
</div>
</div>
<img alt="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます">
<p><a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a>で指定されているコンテキストと依存性の注入(CDI: Contexts and Dependency Injection)はJava EE 6の不可欠な部分であり、サーブレット、エンタープライズBean、JavaBeansなどのJava EEコンポーネントが、アプリケーションのライフサイクル内で明確なスコープを持って存在できるようにするためのアーキテクチャを提供します。また、CDIサービスによって、EJBセッションBeanやJSF (JavaServer Faces)管理対象BeanなどのJava EEコンポーネントが注入可能になり、イベントの起動や監視による疎結合方式の対話が可能になります。</p>
<p>このチュートリアルは、Andy Gibson氏によって投稿された<a href="http://www.andygibson.net/blog/index.php/2009/12/16/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/">Getting Started with JSF 2.0 and CDI in JEE 6</a>というタイトルのブログをベースにしています。ここでは、IDEを使用して、JSF 2.0およびCDIをサポートするJava Webプロジェクトを設定する方法を示します。そしてCDI管理対象BeanをFaceletsページに接続する方法を示し、最後にEJBテクノロジとのCDI統合の簡単な例を示します。</p>
<p>NetBeans IDEは、コンテキストと依存性の注入のサポートを組込みでサポートしています。これには、プロジェクト作成時に<code>beans.xml</code> CDI構成ファイルを生成するオプション、注釈のためのエディタおよびナビゲーション・サポート、一般的に使用されるCDIアーティファクトを作成するための各種ウィザードなどが含まれています。</p>
<br style="clear:left;">
<div class="indent">
<p>このチュートリアルを完了するには、次のソフトウェアとリソースが必要です。</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">ソフトウェアまたはリソース</th>
<th class="tblheader" scope="col">必須バージョン</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2、7.3、7.4、8.0、Java EEバンドル版</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">バージョン7または8</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://glassfish.dev.java.net/">GlassFishサーバー</a></td>
<td class="tbltd1">Open Source Edition 3.xまたは4x</td>
</tr>
</tbody>
</table>
<p class="notes"><strong>注意: </strong></p>
</div>
<ul>
<li>NetBeans IDEのJavaバンドル版には、Java EE準拠のコンテナであるGlassFish Server Open Source Editionも含まれています。</li>
</ul>
<br>
<h2 id="creating">CDIをサポートするJava Webプロジェクトの作成</h2>
<p>この課題では、CDIをサポートするJSF 2.x対応のJava Webプロジェクトを作成します。</p>
<ol>
<li>IDEのメイン・ツールバーにある「新規プロジェクト」(<img alt="「新規プロジェクト」ボタン" src="../../../images_www/articles/73/javaee/cdi-intro/new-project-btn.png">)ボタンをクリックします([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])。</li>
<li>新規プロジェクト・ウィザードで、「Java Web」カテゴリを選択してから「Webアプリケーション」を選択します。「次」をクリックします。</li>
<li>プロジェクト名として「<code>cdiDemo</code>」と入力し、プロジェクトの場所を設定します。「次」をクリックします。</li>
<li>サーバーをGlassFishサーバーに設定します。</li>
<li>Java EEバージョンをJava EE 6 WebまたはJava EE 7 Webに設定します。
<p class="notes"><strong>注意:</strong>選択するJava EEバージョンによって、アプリケーションに対して有効なCDIバージョンが決まります。CDI 1.0とCDI 1.1には重要な違いがあります。</p>
<div class="indent">
<ul>
<li>Java EEバージョンとしてJava EE 6 Webを指定した場合は、「コンテキストと依存性の注入を有効にする」オプションが選択されていることを確認します。「コンテキストと依存性の注入を有効にする」オプションが選択されると、プロジェクト・テンプレートの作成時に、プロジェクトの<code>WEB-INF</code>フォルダに<code>beans.xml</code>ファイルが生成されます。<code>beans.xml</code>ファイルはCDIによって使用され、プロジェクトがCDI Beanを含むモジュールであることをJava EE準拠のサーバーに伝えます。Java EE 6 WebはCDI 1.0をサポートしており、生成された<code>beans.xml</code>ファイルでCDI 1.0がバージョンとして指定されます。</li>
<li>Java EEバージョンとしてJava EE 7 Webを指定した場合、デフォルトでCDI 1.1が有効になっており、<tt>beans.xml</tt>ファイルは不要です。Java EE 7では、<tt>beans.xml</tt>がない場合、デプロイされるアーカイブは<strong>暗黙的Beanアーカイブ</strong>です。IDEで新規ファイル・ウィザードを使用して、Java EE 7 Webアプリケーションで手動で<code>beans.xml</code>ファイルを生成する場合、デフォルトではデプロイされるアーカイブは<strong>明示的Beanアーカイブ</strong>になります。<code>beans.xml</code>ファイルでCDI 1.1がバージョンとして指定され、<tt>bean-discovery-mode</tt>の属性が<tt>all</tt>に設定されるためです。</li>
</ul>
<p>CDIアーカイブのタイプの詳細は、Java EE 7チュートリアルの<a href="http://docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm">CDIアプリケーションのパッケージ</a>を参照してください。</p>
</div>
<img alt="新規Webアプリケーション・ウィザードに用意されているCDIオプションの有効化" class="margin-around b-all" src="../../../images_www/articles/74/javaee/cdi-intro/new-web-application1.png" title="CDIオプションを選択すると、プロジェクトのbeans.xmlファイルが生成される"></li>
<li>「次」をクリックします。</li>
<li>「フレームワーク」パネルで「JavaServer Faces」オプションを選択します。</li>
<li>「構成」タブをクリックし、「優先ページ言語」として「Facelets」が選択されていることを確認します。「終了」をクリックします。
<p>「終了」をクリックすると、IDEはWebアプリケーション・プロジェクトを生成し、<code>index.xhtml</code>開始ページがエディタに表示されます。</p></li>
<li>「プロジェクト」ウィンドウで、「ライブラリ」>「GlassFish Server」ノードを展開すると、<code>weld-osgi-bundle.jar</code>ライブラリが自動的に追加されていることがわかります。GlassFish Serverには、JSR-299 CDI仕様のJBossの実装であるWeldが含まれています。 <br /> <img alt="「プロジェクト」ウィンドウに表示された新しいプロジェクト" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-intro/projects-window1.png" title="CDIのbeans.xmlファイルが挿入された新しいプロジェクトとWeld JARファイルが挿入されたGlassFishライブラリ">
<p>プロジェクトの作成時にJava EEバージョンとしてJava EE 6 Webを指定した場合は、「Web」ページ>「WEB-INF」フォルダに<code>beans.xml</code>ファイルが含まれます。現時点でこのファイルは空ですが、注釈の代替として、XMLでBeanの関連情報を指定するために使用できます。</p>
</li>
</ol>
<h2 id="named">JSFの式言語からのBeanへのアクセス</h2>
<p>この課題では、EL構文を使用してCDI管理対象BeanをFaceletsページに接続する方法を示します。</p>
<ol>
<li>「プロジェクト」ウィンドウで「ソース・パッケージ」ノードを右クリックし、「新規」>「Javaクラス」を選択します。</li>
<li>新規Javaクラス・ウィザードで、「クラス名」に「<strong>MessageServerBean</strong>」、「パッケージ」に「<strong>exercise1</strong>」と入力します。(ウィザードの完了時に新しいパッケージが作成されます。)「終了」をクリックします。 <br> <img alt="新規Javaクラス・ウィザード" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-intro/new-java-class.png" title="Javaクラス・ウィザードを使用した新しいJavaクラスの作成">
<p>新しいパッケージおよびクラスが生成され、エディタでクラスが開きます。</p></li>
<li>クラスに<code>@Named</code>および<code>@Dependent</code>注釈を付けて、文字列を返す1つのメソッドを作成します。
<pre class="examplecode">
package exercise1;
<strong>import javax.enterprise.context.Dependent;
import javax.inject.Named;</strong>
<strong>@Dependent
@Named</strong>
public class MessageServerBean {
<strong>public String getMessage() {
return "Hello World!";
}</strong>
}</pre>
<p class="tips"><code>@Dependent</code>および<code>@Named</code>注釈の入力中に[Ctrl]-[Space]を押すと、エディタのコード補完サポートとJavadocドキュメントを呼び出せます。エディタのコード補完機能を使用して注釈を適用する(適切な注釈を選択して[Enter]を押す)と、自動的に<code>import</code>文がファイルに追加されます。Javadocのポップアップで「外部Webブラウザにドキュメントを表示」(<img alt="「外部Webブラウザにドキュメントを表示」ボタン" src="../../../images_www/articles/73/javaee/cdi-intro/external-web-browser-btn.png">)ボタンをクリックし、別個のウィンドウにフルサイズのJavadocを表示することもできます。</p>
<p class="notes"><strong>注意:</strong><tt>@Dependent</tt>注釈は、管理対象Beanのスコープを定義します。<strong>暗黙的Beanアーカイブ</strong>では、管理対象Beanは検出可能なだけで、スコープが指定されている場合にコンテナによってのみ管理されます。プロジェクトの作成時に<tt>beans.xml</tt>を作成しなかった場合、Java EEバージョンとしてJava EE 7 Webを指定すると、このチュートリアルのアプリケーションは暗黙的Beanアーカイブとしてパッケージされます。管理対象beanのスコープの指定の詳細は、Java EE 7チュートリアルの<a href="http://docs.oracle.com/javaee/7/tutorial/doc/jsf-configure001.htm">注釈を使用した管理対象Beanの構成</a>を参照してください。</p>
</li>
<li>ファイルを保存します([Ctrl]-[S]、Macの場合は[⌘]-[S])。<code>@Named</code>注釈を追加することで、CDIで定義されているように<code>MessageServerBean</code>クラスは<em>管理対象Bean</em>になります。</li>
<li>エディタで([Ctrl]-[Tab]を押して) <code>index.xhtml</code> Faceletsページに切り替え、<code>&lt;h:body></code>タグに次の内容を追加します。
<pre class="examplecode">
&lt;h:body&gt;
Hello from Facelets
<strong>&lt;br/&gt;
Message is: #{messageServerBean.message}
&lt;br/&gt;
Message Server Bean is: #{messageServerBean}</strong>
&lt;/h:body&gt;</pre>
<span class="tips">EL式で[Ctrl]-[Space]を押すと、コード補完の候補を利用できます。エディタのコード補完によって、管理対象Beanおよびそのプロパティが一覧表示されます。<code>MessageServerBean</code>クラスは<code>@Named</code>注釈によってCDI管理対象Beanに変換されるため、JSF管理対象Beanと同じようにEL構文内でアクセスできるようになります。</span><br> <img alt="新規Javaクラス・ウィザード" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-intro/facelets-el-completion.png" title="Javaクラス・ウィザードを使用した新しいJavaクラスの作成"></li>
<li>IDEのメイン・ツールバーにある「プロジェクトの実行」(<img alt="「プロジェクトの実行」ボタン" src="../../../images_www/articles/73/javaee/cdi-common/run-project-btn.png">)ボタンをクリックします。プロジェクトがコンパイルされてGlassFishにデプロイされ、アプリケーションの開始ページ(<code>index.xhtml</code>)がブラウザで開きます。「Hello World!」メッセージが<code>MessageServerBean</code>によってページに表示されます。<br><img alt="ブラウザに表示された開始ページ" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-intro/browser-output1.png" title="アプリケーションの開始ページにMessageServerBeanの詳細が表示される"></li>
<li>メッセージBeanに戻って、メッセージを何か他のもの(「Hello Weld!」など)に変更します。ファイルを保存([Ctrl]-[S]、Macの場合は[⌘]-[S])してからブラウザをリフレッシュします。新しいメッセージが自動的に表示されます。IDEの「保存時にデプロイ」機能によって、保存した変更はすべて自動的にコンパイルされてサーバーに再デプロイメントされます。<br><br>ページの3行目から、クラス名が<code>exercise1.MessageServerBean</code>であることが確認できます。このBeanは単なるPOJO (Plain Old Java Object)であることに注目してください。Java EEで開発しているにもかかわらず、トランザクションやインターセプタなどが複数のレイヤーに重なった複雑なクラス階層は必要ありません。</li>
</ol>
<div class="indent">
<h3>仕組み</h3>
<p>アプリケーションがデプロイされると、サーバーはCDI管理対象Beanを探します。Java EE 7アプリケーションでは、パスのクラスでCDI注釈がデフォルトでスキャンされます。Java EE 6アプリケーションでは、モジュールに<code>beans.xml</code>ファイルが含まれる場合、パスのクラスでCDI注釈がスキャンされます。CDIモジュールでは、すべてのBeanはWeldに登録され、<code>@Named</code>注釈を使用してBeanが注入ポイントと照合されます。<code>index.xhtml</code>ページがレンダリングされたとき、JSFは、JSFに登録された式リゾルバを使用してページの<code>messageServerBean</code>の値を解決しようとしました。このうちの1つが、<code>messageServerBean</code>という名前で登録された<code>MessageServerBean</code>クラスを持つWeld ELリゾルバです。<code>@Named</code>注釈で別の名前を指定することもできましたが、指定しなかったため、クラス名の最初の文字を小文字にしたデフォルト名で登録されました。Weldリゾルバは、JSFからのリクエストに応じてこのBeanのインスタンスを返します。EL式を使用する場合にのみBeanを命名する必要があります。CDIではクラスの型と修飾子注釈を使用することで、型を保証して注入できるため、注入の機構としてBeanの命名を使用しないでください。</p>
</div>
<br>
<h2 id="upgrading">EJBへのアップグレード</h2>
<p>Java EEのスタックを使用しているため、EJB 3.1のおかげで少し変更を加えるのみでBeanをEJBとして簡単にデプロイできます。</p>
<ol>
<li><code>MessageServerBean</code>を開き、クラス・レベルで<code>javax.ejb.Stateless</code>注釈を追加して、文字列を「Hello EJB!」に変更します。
<pre class="examplecode">
package exercise1;
<strong>import javax.ejb.Stateless;</strong>
import javax.enterprise.context.Dependent;
import javax.inject.Named;
/**
*
* @author nbuser
*/
@Dependent
@Named
<strong>@Stateless</strong>
public class MessageServerBean {
public String getMessage() {
return &quot;<strong>Hello EJB!</strong>&quot;;
}
}</pre></li>
<li>ファイルを保存([Ctrl]-[S]、Macの場合は[⌘]-[S])してからブラウザに移動してリフレッシュします。次のような出力が表示されます。<br><img alt="ブラウザに表示されたEJBの詳細" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-intro/browser-output-ejb1.png" title="@Stateless注釈を使用した、MessageServerBeanからEJBへの変換"><br>驚くことに、ただ1つの注釈でPOJOが各種機能を備えたEJBに変わりました。変更を保存してからページをリフレッシュすると、変更した内容が表示されました。これを行うために、独特のプロジェクト構成、ローカル・インタフェース、または難解なデプロイメント・ディスクリプタは一切必要ありませんでした。</li>
</ol>
<div class="indent">
<h3>異なるEJBのタイプ</h3>
<p><code>@Stateful</code>注釈を使用することもできます。または、シングルトン・インスタンスのための新しい<code>@Singleton</code>注釈を試すこともできます。そうすると、<code>javax.ejb.Singleton</code><code>javax.inject.Singleton</code>の2つの注釈があることに気付くでしょう。なぜシングルトンが2つあるのでしょうか。EJB以外の環境でCDIを使用している場合、CDIのシングルトン(<code>javax.inject.Singleton</code>)を使用してEJBの外部でシングルトン・インスタンスを定義できます。EJBのシングルトン(<code>javax.ejb.Singleton</code>)は、トランザクション管理などのEJBの機能をすべて提供します。つまり、必要に応じて、またはEJB作業環境の有無に応じて選択できるようになっています。</p>
</div>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Getting%20Started%20with%20CDI%20and%20JSF%202.0">このチュートリアルに関するご意見をお寄せください</a>
</div>
<br style="clear:both;">
<h2 id="seealso">関連項目</h2>
<p>このシリーズの次回ではCDI注入に焦点をあて、Java EE環境での依存性の管理のためにCDIを使用する方法について詳しく見ていきます。</p>
<ul>
<li><a href="cdi-inject.html">CDIの注入および修飾子の操作</a></li>
</ul>
<p>CDIおよびJSF 2.0の詳細は、次のリソースを参照してください。</p>
<div class="indent">
<h3>コンテキストと依存性の注入</h3>
<ul>
<li><a href="cdi-validate.html">@Alternative Beanおよびライフサイクル注釈の適用</a></li>
<li><a href="cdi-events.html">CDIのイベントの操作</a></li>
<li><a href="http://blogs.oracle.com/enterprisetechtips/entry/using_cdi_and_dependency_injection">エンタープライズ技術ヒント: JSF 2.0アプリケーションでのJavaのCDIおよび依存性の注入の使用</a></li>
<li><a href="http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic.htm">Java EE 6チュートリアル: Java EEのコンテキストと依存性の注入の概要</a></li>
<li><a href="http://jcp.org/en/jsr/detail?id=299">JSR 299: コンテキストと依存性の注入の仕様</a></li>
</ul>
<h3>JavaServer Faces 2.0</h3>
<ul>
<li><a href="../web/jsf20-intro.html">JavaServer Faces 2.x入門</a></li>
<li><a href="../web/jsf20-crud.html">データベースからのJavaServer Faces 2.x CRUDアプリケーションの生成</a></li>
<li><a href="../../samples/scrum-toys.html">Scrum Toys - JSF 2.0の完全版サンプル・アプリケーション</a></li>
<li><a href="http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html">JavaServer Facesテクノロジ</a> (公式ホーム・ページ)</li>
<li><a href="http://docs.oracle.com/javaee/7/tutorial/doc/jsf-page.htm">Java EE 7チュートリアル: WebページでのJavaServer Facesテクノロジの使用</a></li>
<li><a href="http://jcp.org/en/jsr/summary?id=314">JSR 314: JavaServer Faces 2.0の仕様</a></li>
</ul>
</div>
</body>
</html>