データベースからの JavaServer Faces 2.0 CRUD アプリケーションの生成
このチュートリアルでは、NetBeans IDE を使用し、バックエンドのデータベースと対話する Web アプリケーションを作成します。このアプリケーションでは、データベースに格納されたデータを表示および変更できます。この機能は CRUD (作成、読み取り、更新、削除) とも呼ばれます。開発するアプリケーションは、次のものに依存します。
- JavaServer Faces (JSF) 2.0。フロントエンドの Web ページ、検査処理、および要求-応答サイクルの管理に使用します。
- Java Persistence API (JPA) 2.0。EclipseLink を使用してデータベースからエンティティークラスを生成し、トランザクションを管理します。EclipseLink は JPA のリファレンス実装であり、GlassFish サーバーのデフォルトの持続性プロバイダです。
- Enterprise JavaBeans (EJB) 3.1。エンティティークラスにアクセスするステートレス EJB を提供し、アプリケーションのビジネスロジックを格納します。
IDE には、アプリケーション用のコードをすべて生成する、2 つのウィザードが用意されています。1 つ目は「データベースからのエンティティークラス」ウィザードです。これを使用すると、提供されたデータベースからエンティティークラスを生成できます。エンティティークラスの作成後、「エンティティーからの JSF ページクラス」ウィザードを使用して、そのエンティティークラスの JSF 管理対象 Bean と EJB、およびエンティティークラスデータのビューを処理する一連の Facelets ページを作成します。このチュートリアルの最後の「アプリケーションの操作」節には、このアプリケーションの理解を深め、IDE の習熟に役立つ、さまざまな課題を用意しています (省略可能)。

注: このチュートリアルは NetBeans IDE versions 6.8 および 6.9 が対象です。NetBeans IDE 6.7 を使用している場合は、このチュートリアルの 6.7 バージョンを参照してください。
目次
このチュートリアルを完了するには、次のソフトウェアとリソースが必要です。
注
- NetBeans IDE の Java バンドル版には、このチュートリアルに必要な、Java EE 6 準拠サーバーの GlassFish サーバー 3.0.1 も含まれています。
- このチュートリアルのソリューションプロジェクトを入手するには、ConsultingAgencyJSF20.zip をダウンロードしてください。
データベースの作成
このチュートリアルでは、consult という名前のコンサルティングエージェンシーデータベースを使用します。このデータベースは IDE のインストールに含まれないため、このチュートリアルを開始する前に、まずデータベースを作成する必要があります。
consult データベースは、さまざまなデータベース構造を処理する IDE サポートの幅広さを示すことを目的として設計されました。したがって、推奨されるデータベース設計の一例やベストプラクティスを示すものではありません。その代わりに、データベース設計に使用できる関連機能の多くを取り入れようとしています。たとえば、consult データベースには、すべての種類の関係、複合主キー、および多数の異なるデータ型が含まれています。データベース構造の詳しい概要については、このページのあとに出てくる表を参照してください。
注:
- このチュートリアルでは MySQL データベースサーバーを使用しますが、JavaDB データベースサーバーを使用してチュートリアルを完了することもできます。JavaDB でデータベースを作成するには、javadb-consult.zip アーカイブをダウンロードして展開します。このアーカイブには、
consult データベースを作成、ドロップ、および生成するための SQL スクリプトが含まれています。
- MySQL を操作する IDE の構成については、「MySQL データベースへの接続」チュートリアルを参照してください。
- JavaDB を操作する IDE の構成については、「Java DB (Derby) データベースの操作」チュートリアルを参照してください。
次の手順に従ってデータベースを作成し、IDE からそのデータベースに接続します。
- mysql-consult.zip をダウンロードし、アーカイブをローカルシステムに展開します。アーカイブを展開すると、データベースを作成および生成するための SQL スクリプトが表示されます。このアーカイブには、ドロップする表のためのスクリプトも含まれています。
- 「サービス」ウィンドウで「データベース」ノードを展開し、「MySQL」ノードを右クリックして「サーバーを起動」を選択します。
- 「MySQL サーバー」ノードを右クリックし、「データベースを作成」を選択します。
- 「MySQL データベースの作成」ダイアログでデータベース名として「consult」と入力します。「了解」をクリックします。「データベース」ノードの下に新しいノードが表示されます (
jdbc:mysql://localhost:3306/consult [デフォルトスキーマの root])。
- 新しいノードを右クリックし、「接続」を選択します。
- メインメニューから「ファイル」>「ファイルを開く」を選択し、展開したファイル
mysql_create_consult.sql に移動します。「開く」をクリックします。ファイルが SQL エディタで自動的に開きます。

- SQL エディタツールバーの「接続」ドロップダウンリストで
consult データベースが選択されていることを確認し、「SQL を実行」(
) ボタンをクリックします。
「SQL を実行」をクリックすると、「出力」ウィンドウに次の出力が表示されます。

データベース構造の確認
表が正しく作成されたかどうかを確認するには、データベース接続ノードの下の「表」ノードを展開します。表のノードを展開すると、表の列、インデックス、および外部キーを確認できます。列を右クリックして「プロパティー」を選択すると、その列に関する追加情報が表示されます。
注: 「表」ノードの下に表が表示されない場合は、「表」ノードを右クリックし、「再表示」を選択します。
consult データベースの構造を見ると、さまざまな関係とさまざまな型のフィールドを含む表がデータベースにあることがわかります。データベースからエンティティークラスを作成するときは、フィールドの型ごとに適したコードが自動的に生成されます。
次の表では、consult データベース内の表について説明します。
| CLIENT |
コンサルティングエージェンシーのクライアント |
生成されない複合主キー (フィールドは外部キーを構成しません) |
| CONSULTANT |
クライアントが契約に基づいて雇うことができる、コンサルティングエージェンシーの従業員 |
LONG VARCHAR 型の resume フィールドを含みます |
| CONSULTANT_STATUS |
コンサルティングエージェンシーでのコンサルタントのステータス (「Active」や「Inactive」などのステータスが考えられる) |
生成されない CHAR 型の主キー |
| RECRUITER |
クライアントとコンサルタントのやり取りを担当する、コンサルティングエージェンシーの従業員 |
|
| PROJECT |
クライアントがコンサルティングエージェンシーのコンサルタントを要員として充てるプロジェクト |
CLIENT 表に対する外部キーを構成する 2 つのフィールドを含む、生成されない複合主キー |
| BILLABLE |
コンサルタントがプロジェクトの任務に費やし、コンサルティングエージェンシーが関連クライアントに対して請求する時間数 |
CLOB 型の artifact フィールドを含みます |
| ADDRESS |
クライアントの請求先住所 |
|
| PROJECT_CONSULTANT |
コンサルタントが現在割り当てられているプロジェクトを示す結合表 |
PROJECT と CONSULTANT とを相互参照します。PROJECT には複合主キーがあります |
consult データベースには、さまざまな関係が含まれています。エンティティークラスをデータベースから作成する場合、列の SQL 型に基づいて、適切な Java 型のプロパティーが自動的に生成されます。次の表では、consult データベースのエンティティー関係を説明します。逆方向の関係は示していません。
| CLIENT |
RECRUITER |
手動編集ありで null 可能な 1 対 1 の関係、編集なしで null 可能な 1 対多の関係 |
CLIENT には多数の RECRUITER があり、RECRUITER には 0 または 1 つの CLIENT があります (手動で編集されていない場合) |
| CLIENT |
ADDRESS |
null 可能ではない 1 対 1 の関係 |
CLIENT には 1 つの ADDRESS があり、ADDRESS には 0 または 1 つの CLIENT があります |
| CLIENT |
PROJECT |
null 可能ではない 1 対多の関係。Project エンティティーで、client フィールドの値は Project の主キーの一部です |
CLIENT には多数の PROJECT があり、PROJECT には 1 つの CLIENT があります |
| CONSULTANT |
PROJECT |
多対多 |
CONSULTANT には複数の PROJECT があり、PROJECT には多数の CONSULTANT があります |
| CONSULTANT |
BILLABLE |
null 可能ではない 1 対多の関係 |
CONSULTANT には多数の BILLABLE があり、BILLABLE には 1 つの CONSULTANT があります |
| CONSULTANT_STATUS |
CONSULTANT |
null 可能ではない 1 対多の関係 |
CONSULTANT_STATUS には多数の CONSULTANT があり、CONSULTANT には 1 つの CONSULTANT_STATUS があります |
| CONSULTANT |
RECRUITER |
null 可能な 1 対多の関係 |
CONSULTANT には 0 または 1 つの RECRUITER があり、RECRUITER には多数の CONSULTANT があります |
| BILLABLE |
PROJECT |
null 可能ではない 1 対多の関係 |
BILLABLE には 1 つの PROJECT があり、PROJECT には多数の BILLABLE があります |
データベースが作成されたので、次に Web アプリケーションを作成し、「データベースからのエンティティークラス」ウィザードを使用して、データベースの表に基づいてエンティティークラスを生成できます。
Web アプリケーションプロジェクトの作成
この課題では、Web プロジェクトを作成し、JavaServer Faces フレームワークをプロジェクトに追加します。プロジェクトを作成するときは、「新規プロジェクト」ウィザードの「フレームワーク」パネルで「JavaServer Faces」を選択します。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。
- 「Java Web」カテゴリから「Web アプリケーション」を選択します。「次へ」をクリックします。
- プロジェクト名として「
ConsultingAgency」と入力し、プロジェクトの場所を設定します。「次へ」をクリックします。
- サーバーを GlassFish サーバー 3.0.1 に設定し、Java EE バージョンを Java EE 6 Web に設定します。「次へ」をクリックします。
- 「フレームワーク」パネルで「JavaServer Faces」オプションを選択します。「完了」をクリックします。
「完了」をクリックすると、IDE は Web アプリケーションプロジェクトを生成し、index.xhtml がエディタに表示されます。
データベースからのエンティティークラスの生成
IDE でデータベースに接続したあと、「データベースからのエンティティークラス」ウィザードを使用して、データベース内の表に基づいてすばやくエンティティークラスを生成できます。IDE では、選択した各表のエンティティークラスを生成でき、関連する表に必要なエンティティークラスを生成することもできます。
- 「プロジェクト」ウィンドウで「
ConsultingAgency」プロジェクトノードを右クリックし、「新規」>「データベースからのエンティティークラス」を選択します。このオプションがリストにない場合は「その他」を選択します。次に、「ファイル」ウィザードで「持続性」カテゴリを選択し、「データベースからのエンティティークラス」を選択します。
- 「データソース」ドロップダウンリストから「新しいデータソース」を選択して「データソースを作成」ダイアログを開きます。
- 「JNDI 名」に「
jdbc/consult」と入力し、「データベース接続」に「jdbc:mysql://localhost:3306/consult [デフォルトスキーマの root]」を選択します。
重要: このチュートリアルでデータソースを作成して EclipseLink を操作するには、データベースをパスワードで保護しておく必要があります。パスワードが設定されていないデフォルトの MySQL root アカウントを使用している場合は、コマンド行プロンプトからパスワードを設定できます。
たとえば、パスワードを nbuser に設定する場合は、コマンド行プロンプトで MySQL のインストールディレクトリの bin ディレクトリに移動し、次のように入力します。
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('nbuser')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
詳細は、MySQL 公式リファレンスマニュアルの「初期 MySQL アカウントの保護」を参照してください。
- 「了解」をクリックしてダイアログを閉じ、ウィザードに戻ります。
consult データベース内の表が「使用可能な表」リストボックスに表示されます。
- 「すべてを追加」ボタンをクリックし、データベースに格納されているすべての表を選択します。「次へ」をクリックします。

- 「パッケージ」名に「
jpa.entities」と入力します。名前付きクエリーを生成するためのチェックボックスが選択されていることを確認します。
- 「持続性ユニットを作成」ボタンをクリックして「持続性ユニットを作成」ダイアログを開きます。
ダイアログ内の「作成」をクリックして持続性ユニットを作成し、ウィザードに戻ります。
注: 持続性ユニットのデフォルト値をそのまま使用します。
- 「完了」をクリックします。IDE は、プロジェクトの
jpa.entities パッケージにエンティティークラスを生成します。
ウィザードを使用してデータベースからエンティティークラスを作成するとき、IDE でデータベース表間の関係が確認されます。「プロジェクト」ウィンドウで「jpa.entities」パッケージノードを展開すると、IDE によって PROJECT_CONSULTANT 表を除くすべての表のエンティティークラスを生成されていることがわかります。PROJECT_CONSULTANT のエンティティークラスが作成されなかった理由は、この表が結合表であるためです。
また、IDE は複合主キーを持つ CLIENT と PROJECT の各表に 2 つの追加クラスを生成します。これらの表の主キークラス (ClientPK.java と ProjectPK.java) の名前には、PK が付加されています。
エンティティークラスに生成されたコードを見ると、エンティティークラスの自動生成 ID フィールドに @GeneratedValue 注釈が、一部のフィールドに @Basic(optional = "false") 注釈がウィザードによって追加されていることがわかります。「エンティティーからの JSF ページクラス」ウィザードでは、@Basic(optional = "false") 注釈に基づき、これらのフィールドで null 可能ではない列の違反を防止するためのチェック機能を含むコードを生成できます。
エンティティークラスからの JSF ページの生成
エンティティークラスが作成されたので、次にデータを表示および変更するための Web インタフェースを作成できます。ここでは、「エンティティーからの JSF ページクラス」ウィザードを使用して、JavaServer Faces ページを生成します。ウィザードで生成されるコードは、エンティティークラス内に格納された持続性注釈に基づいて生成されます。
ウィザードでは、エンティティークラスごとに次のものが生成されます。
- エンティティーインスタンスの作成、取得、変更、および削除のためのステートレスセッション Bean
- JSF セッションスコープ指定管理対象 Bean
- CRUD 機能のための 4 つの Facelets ファイル (
Create.xhtml、Edit.xhtml、List.xhtml、および View.xhtml) を格納するディレクトリ
- JSF 管理対象 Bean (
JsfUtil、PaginationHelper) に使用されるユーティリティークラス
- ローカライズされたメッセージのプロパティーバンドル、およびプロジェクトの Faces 構成ファイル内 (このファイルがない場合、
faces-config.xml ファイルが作成される) の対応するエントリ
- 描画されるコンポーネントのデフォルトのスタイルシートおよび Facelets テンプレートファイルを含む、補助 Web ファイル
JSF ページを生成するには、次の手順に従います。
- 「プロジェクト」ウィンドウで、プロジェクトノードを右クリックし、「新規」>「エンティティーからの JSF ページクラス」を選択してウィザードを開始します。このオプションがリストにない場合は「その他」を選択します。次に、「ファイル」ウィザードで、「JavaServer Faces」カテゴリを選択し、「エンティティーからの JSF ページクラス」を選択します。
「利用可能なエンティティークラス」ボックスに、プロジェクトに含まれる 7 つのエンティティークラスが一覧表示されます。このボックスには、組み込み可能なクラス (ClientPK.java と ProjectPK.java) は一覧表示されません。
- 「すべてを追加」をクリックして、すべてのクラスを「選択されているエンティティークラス」ボックスに移動します。
「次へ」をクリックします。
- ウィザードのステップ 3 の「生成された JSF ページとクラス」で、「JPA セッション Bean パッケージ」に「
jpa.session」と入力します。
- 「JSF クラスパッケージ」に「
jsf」と入力します。
- 「ローカリゼーションバンドル名」フィールドに「
/resources/Bundle」と入力します。これにより、resources という名前のパッケージが生成され、これに Bundle.properties ファイルが属します。ここを空白のままにした場合、プロパティーバンドルはプロジェクトのデフォルトのパッケージ内に作成されます。
IDE をプロジェクトの規則により適応させるために、ウィザードで生成した任意のファイルをカスタマイズできます。「テンプレートのカスタマイズ」リンクをクリックし、ウィザードで使用されるファイルテンプレートを変更します。
一般に、IDE で管理されるすべてのテンプレートには、「テンプレートマネージャー」(「ツール」>「テンプレート」) を使用してアクセスし、変更を加えることができます。
- 「完了」をクリックします。ステートレスセッション Bean が
jpa.session パッケージ内に生成され、JSF セッションスコープ指定管理対象 Bean が jsf パッケージ内に生成されます。各ステートレスセッション Bean は、対応するエンティティークラスの操作を処理します。これには、Java Persistence API を使用したエンティティークラスのインスタンスの作成、編集、および破棄が含まれます。各 JSF 管理対象 Bean は、javax.faces.convert.Converter インタフェースを実装し、対応するエンティティークラスのインスタンスとString 型オブジェクトの間の変換を行います。
「Web ページ」ノードを展開すると、エンティティークラスごとにフォルダが生成されたことがわかります。各フォルダには、Create.xhtml、Edit.xhtml、List.xhtml、および View.xhtml ファイルが格納されます。index.xhtml ファイルも変更され、各 List.xhtml ページへのリンクが挿入されます。
各 JSF 管理対象 Bean は、4 つの対応する Facelets ファイルに固有のもので、適切なセッション Bean 内のメソッドを呼び出すコードが格納されます。
「resources」フォルダノードを展開し、ウィザードで生成されたデフォルトの jsfcrud.css スタイルシートを検索します。アプリケーションの開始ページ (index.xhtml) または Facelets テンプレートファイル (template.xhtml) をエディタで開くと、次のようなスタイルシートへの参照が表示されます。
<h:outputStylesheet name="css/jsfcrud.css"/>
Facelets テンプレートファイルは、各エンティティークラスの 4 つの各 Facelets ファイルで使用されます。
「ソースパッケージ」ノードを展開すると、セッション Beans、JSF 管理対象 Bean、ユーティリティークラス、およびウィザードで生成されたプロパティーバンドルが確認できます。
ウィザードでは、プロパティーバンドルの場所を登録するための Faces 構成ファイル (faces-config.xml) も生成されます。「構成ファイル」ノードを展開し、faces-config.xml を XML エディタで開くと、次のエントリが格納されていることがわかります。
<application>
<resource-bundle>
<base-name>/resources/Bundle</base-name>
<var>bundle</var>
</resource-bundle>
</application>
また、新規 resources パッケージを展開すると、クライアントのデフォルト言語のメッセージが格納されている Bundle.properties ファイルがあります。このメッセージは、エンティティークラスプロパティーから派生します。
新規プロパティーバンドルを追加するには、Bundle.properties ファイルを右クリックし、「カスタマイズ」を選択します。「カスタマイザ」ダイアログで、新しいロケールをアプリケーションに追加できます。
アプリケーションの操作
これで、エンティティークラス、エンティティークラスを制御するための EJB セッション Beans、データベースを表示および編集するための JSF によるフロントエンドがプロジェクトに組み込まれたので、プロジェクトを実行して結果を確認してみます。
次に、このアプリケーションと IDE で提供される機能の習熟に役立つ、一連の短い課題を示します (省略可能)。
関連項目
JSF 2.0 の詳細については、次のリソースを参照してください。
NetBeans の記事およびチュートリアル
外部リソース
ブログ