corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

データベースからの 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 6.8 および 6.9 が対象です

注: このチュートリアルは NetBeans IDE versions 6.8 および 6.9 が対象です。NetBeans IDE 6.7 を使用している場合は、このチュートリアルの 6.7 バージョンを参照してください。

目次

このチュートリアルを完了するには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE の Java バンドル版 6.8 または 6.9
Java Development Kit (JDK) 6
GlassFish Server Open Source Edition 3
mysql-consult.zip (MySQL)
または
javadb-consult.zip (JavaDB)
n/a

  • 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 からそのデータベースに接続します。

  1. mysql-consult.zip をダウンロードし、アーカイブをローカルシステムに展開します。アーカイブを展開すると、データベースを作成および生成するための SQL スクリプトが表示されます。このアーカイブには、ドロップする表のためのスクリプトも含まれています。
  2. 「サービス」ウィンドウで「データベース」ノードを展開し、「MySQL」ノードを右クリックして「サーバーを起動」を選択します。
  3. 「MySQL サーバー」ノードを右クリックし、「データベースを作成」を選択します。
  4. 「MySQL データベースの作成」ダイアログでデータベース名として「consult」と入力します。「了解」をクリックします。「データベース」ノードの下に新しいノードが表示されます (jdbc:mysql://localhost:3306/consult [デフォルトスキーマの root])。
  5. 新しいノードを右クリックし、「接続」を選択します。
  6. メインメニューから「ファイル」>「ファイルを開く」を選択し、展開したファイル mysql_create_consult.sql に移動します。「開く」をクリックします。ファイルが SQL エディタで自動的に開きます。
    SQL エディタのスクリーンショット
  7. SQL エディタツールバーの「接続」ドロップダウンリストで consult データベースが選択されていることを確認し、「SQL を実行」(「SQL を実行」ボタン) ボタンをクリックします。

    「SQL を実行」をクリックすると、「出力」ウィンドウに次の出力が表示されます。
    「出力」ウィンドウのスクリーンショット

データベース構造の確認

表が正しく作成されたかどうかを確認するには、データベース接続ノードの下の「表」ノードを展開します。表のノードを展開すると、表の列、インデックス、および外部キーを確認できます。列を右クリックして「プロパティー」を選択すると、その列に関する追加情報が表示されます。

「サービス」ウィンドウのスクリーンショット

注: 「表」ノードの下に表が表示されない場合は、「表」ノードを右クリックし、「再表示」を選択します。

consult データベースの構造を見ると、さまざまな関係とさまざまな型のフィールドを含む表がデータベースにあることがわかります。データベースからエンティティークラスを作成するときは、フィールドの型ごとに適したコードが自動的に生成されます。

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」を選択します。

  1. 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。
  2. 「Java Web」カテゴリから「Web アプリケーション」を選択します。「次へ」をクリックします。
  3. プロジェクト名として「ConsultingAgency」と入力し、プロジェクトの場所を設定します。「次へ」をクリックします。
  4. サーバーを GlassFish サーバー 3.0.1 に設定し、Java EE バージョンを Java EE 6 Web に設定します。「次へ」をクリックします。
  5. 「フレームワーク」パネルで「JavaServer Faces」オプションを選択します。「完了」をクリックします。

    「完了」をクリックすると、IDE は Web アプリケーションプロジェクトを生成し、index.xhtml がエディタに表示されます。

データベースからのエンティティークラスの生成

IDE でデータベースに接続したあと、「データベースからのエンティティークラス」ウィザードを使用して、データベース内の表に基づいてすばやくエンティティークラスを生成できます。IDE では、選択した各表のエンティティークラスを生成でき、関連する表に必要なエンティティークラスを生成することもできます。

  1. 「プロジェクト」ウィンドウで「ConsultingAgency」プロジェクトノードを右クリックし、「新規」>「データベースからのエンティティークラス」を選択します。このオプションがリストにない場合は「その他」を選択します。次に、「ファイル」ウィザードで「持続性」カテゴリを選択し、「データベースからのエンティティークラス」を選択します。
  2. 「データソース」ドロップダウンリストから「新しいデータソース」を選択して「データソースを作成」ダイアログを開きます。
  3. 「JNDI 名」に「jdbc/consult」と入力し、「データベース接続」に「jdbc:mysql://localhost:3306/consult [デフォルトスキーマの root]」を選択します。
    「データソースを作成」ダイアログ

  4. 「了解」をクリックしてダイアログを閉じ、ウィザードに戻ります。consult データベース内の表が「使用可能な表」リストボックスに表示されます。
  5. 「すべてを追加」ボタンをクリックし、データベースに格納されているすべての表を選択します。「次へ」をクリックします。
    「新規 データベースからのエンティティークラス」ウィザード
  6. 「パッケージ」名に「jpa.entities」と入力します。名前付きクエリーを生成するためのチェックボックスが選択されていることを確認します。
  7. 「持続性ユニットを作成」ボタンをクリックして「持続性ユニットを作成」ダイアログを開きます。
    「新規 データベースからのエンティティークラス」ウィザード
    ダイアログ内の「作成」をクリックして持続性ユニットを作成し、ウィザードに戻ります。

    注: 持続性ユニットのデフォルト値をそのまま使用します。

  8. 「完了」をクリックします。IDE は、プロジェクトの jpa.entities パッケージにエンティティークラスを生成します。

ウィザードを使用してデータベースからエンティティークラスを作成するとき、IDE でデータベース表間の関係が確認されます。「プロジェクト」ウィンドウで「jpa.entities」パッケージノードを展開すると、IDE によって PROJECT_CONSULTANT 表を除くすべての表のエンティティークラスを生成されていることがわかります。PROJECT_CONSULTANT のエンティティークラスが作成されなかった理由は、この表が結合表であるためです。

「プロジェクト」ウィンドウのスクリーンショット

また、IDE は複合主キーを持つ CLIENTPROJECT の各表に 2 つの追加クラスを生成します。これらの表の主キークラス (ClientPK.javaProjectPK.java) の名前には、PK が付加されています。

エンティティークラスに生成されたコードを見ると、エンティティークラスの自動生成 ID フィールドに @GeneratedValue 注釈が、一部のフィールドに @Basic(optional = "false") 注釈がウィザードによって追加されていることがわかります。「エンティティーからの JSF ページクラス」ウィザードでは、@Basic(optional = "false") 注釈に基づき、これらのフィールドで null 可能ではない列の違反を防止するためのチェック機能を含むコードを生成できます。


エンティティークラスからの JSF ページの生成

エンティティークラスが作成されたので、次にデータを表示および変更するための Web インタフェースを作成できます。ここでは、「エンティティーからの JSF ページクラス」ウィザードを使用して、JavaServer Faces ページを生成します。ウィザードで生成されるコードは、エンティティークラス内に格納された持続性注釈に基づいて生成されます。

ウィザードでは、エンティティークラスごとに次のものが生成されます。

  • エンティティーインスタンスの作成、取得、変更、および削除のためのステートレスセッション Bean
  • JSF セッションスコープ指定管理対象 Bean
  • CRUD 機能のための 4 つの Facelets ファイル (Create.xhtmlEdit.xhtmlList.xhtml、および View.xhtml) を格納するディレクトリ
  • JSF 管理対象 Bean (JsfUtilPaginationHelper) に使用されるユーティリティークラス
  • ローカライズされたメッセージのプロパティーバンドル、およびプロジェクトの Faces 構成ファイル内 (このファイルがない場合、faces-config.xml ファイルが作成される) の対応するエントリ
  • 描画されるコンポーネントのデフォルトのスタイルシートおよび Facelets テンプレートファイルを含む、補助 Web ファイル

JSF ページを生成するには、次の手順に従います。

  1. 「プロジェクト」ウィンドウで、プロジェクトノードを右クリックし、「新規」>「エンティティーからの JSF ページクラス」を選択してウィザードを開始します。このオプションがリストにない場合は「その他」を選択します。次に、「ファイル」ウィザードで、「JavaServer Faces」カテゴリを選択し、「エンティティーからの JSF ページクラス」を選択します。

    「利用可能なエンティティークラス」ボックスに、プロジェクトに含まれる 7 つのエンティティークラスが一覧表示されます。このボックスには、組み込み可能なクラス (ClientPK.javaProjectPK.java) は一覧表示されません。
  2. 「すべてを追加」をクリックして、すべてのクラスを「選択されているエンティティークラス」ボックスに移動します。
    「新規 エンティティーからの JSF ページクラス」ウィザード
    「次へ」をクリックします。
  3. ウィザードのステップ 3 の「生成された JSF ページとクラス」で、「JPA セッション Bean パッケージ」に「jpa.session」と入力します。
  4. 「JSF クラスパッケージ」に「jsf」と入力します。
  5. 「ローカリゼーションバンドル名」フィールドに「/resources/Bundle」と入力します。これにより、resources という名前のパッケージが生成され、これに Bundle.properties ファイルが属します。ここを空白のままにした場合、プロパティーバンドルはプロジェクトのデフォルトのパッケージ内に作成されます。
    「新規 エンティティーからの JSF ページクラス」ウィザードの手順 3

    IDE をプロジェクトの規則により適応させるために、ウィザードで生成した任意のファイルをカスタマイズできます。「テンプレートのカスタマイズ」リンクをクリックし、ウィザードで使用されるファイルテンプレートを変更します。
    「テンプレートのカスタマイズ」ドロップダウンリスト
    一般に、IDE で管理されるすべてのテンプレートには、「テンプレートマネージャー」(「ツール」>「テンプレート」) を使用してアクセスし、変更を加えることができます。

  6. 「完了」をクリックします。ステートレスセッション Bean が jpa.session パッケージ内に生成され、JSF セッションスコープ指定管理対象 Bean が jsf パッケージ内に生成されます。各ステートレスセッション Bean は、対応するエンティティークラスの操作を処理します。これには、Java Persistence API を使用したエンティティークラスのインスタンスの作成、編集、および破棄が含まれます。各 JSF 管理対象 Bean は、javax.faces.convert.Converter インタフェースを実装し、対応するエンティティークラスのインスタンスとString 型オブジェクトの間の変換を行います。

「Web ページ」ノードを展開すると、エンティティークラスごとにフォルダが生成されたことがわかります。各フォルダには、Create.xhtmlEdit.xhtmlList.xhtml、および View.xhtml ファイルが格納されます。index.xhtml ファイルも変更され、各 List.xhtml ページへのリンクが挿入されます。

「プロジェクト」ウィンドウ内の「Web ページ」ディレクトリのスクリーンショット

各 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 で提供される機能の習熟に役立つ、一連の短い課題を示します (省略可能)。

完了したプロジェクトの確認

  1. プロジェクトを実行するには、「プロジェクト」ウィンドウでプロジェクトノードを右クリックして「実行」を選択するか、メインツールバーで「プロジェクトを実行」(「プロジェクトを実行」ボタン) をクリックします。

    アプリケーションの開始ページが表示されると、リンクリストが表示され、これらを使用して各データベース表に格納されたエントリを表示することができます。
    ブラウザ内の ConsultingAgency の開始ページ
    これらのリンクは、「エンティティーからの JSF ページクラス」ウィザードを完了したら、開始ページ (index.xhtml) に追加されます。これらはコンサルティングエージェンシーデータベース上で CRUD 機能を提供する Facelets ページへのエントリポイントとして提供されます。
    <h:body>
        Hello from Facelets
        <h:form>
            <h:commandLink action="/address/List" value="Show All Address Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/billable/List" value="Show All Billable Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/client/List" value="Show All Client Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/consultant/List" value="Show All Consultant Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/consultantStatus/List" value="Show All ConsultantStatus Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/project/List" value="Show All Project Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/recruiter/List" value="Show All Recruiter Items"/>
        </h:form>
    </h:body>
  2. Show All Consultant Items」リンクをクリックします。前出のコードを参照すると、ターゲットページが /consultant/List.xhtml であることがわかります。JSF 2.0 では、ファイル拡張子は暗黙のナビゲーションによって推定されます。
    コンサルタントページ
    このデータベースには、現在サンプルデータが含まれていません。「Create New Consultant」リンクをクリックし、表示される Web フォームを使用することで、データを手動で追加できます。これにより、/consultant/Create.xhtml ページの表示がトリガーされます。また、SQL スクリプトを IDE で実行し、サンプルデータを含む表を生成することもできます。次の副節では、両方の選択肢を示します。

インデックスリンクをクリックすると、開始ページ内に一覧表示されたリンクに戻ることができます。これらのリンクには、各データベース表に保存されたデータのビューと、各エンティティーフォルダの List.xhtml ファイルを表示するためのトリガーがあります。後述の説明にあるように、データを表に追加したあと、各エントリにほかのリンクが表示され、単一の表レコードのデータを表示 (View.xhtml)、編集 (Edit.xhmtl)、および破棄できます。

SQL スクリプトを使用したデータベースの生成

提供されたスクリプトを実行します。このスクリプトにより、データベース表のサンプルデータが生成されます。このスクリプト (mysql_insert_data_consult.sql) はコンサルティングエージェンシーデータベースの ZIP ファイルに格納されており、必要なソフトウェアの表からダウンロードできます。

操作するデータベースサーバー (MySQL または JavaDB) に応じて、提供されているスクリプトを実行できます。このスクリプトにより、データベース表のサンプルデータが生成されます。MySQL の場合は、mysql_insert_data_consult.sql スクリプトになります。JavaDB の場合は、javadb_insert_data_consult.sql スクリプトになります。どちらのスクリプトも、必要なソフトウェアの表からダウンロードできるそれぞれのアーカイブの中に含まれています。

  1. メインメニューから「ファイル」>「ファイルを開く」を選択し、コンピュータ上のスクリプトの場所に移動します。「開く」をクリックします。ファイルが IDE の SQL エディタで自動的に開きます。
  2. SQL エディタのツールバーの「接続」ドロップダウンリストで consult データベースが選択されていることを確認します。
    SQL エディタとデータ挿入スクリプトのスクリーンショット
    エディタ内を右クリックして「文を実行」を選択するか、「SQL を実行」(「SQL を実行」ボタン) ボタンをクリックします。スクリプトの実行結果は「出力」ウィンドウで確認できます。
  3. GlassFish サーバーを再起動します。consult データベースに含まれる新しいデータをサーバーが再読み込みしたりキャッシュに保存したりできるようにするには、この手順が必要となります。これを行うには、「出力」ウィンドウの GlassFish サーバーのタブ (サーバーのログが表示されているタブ) をクリックし、左側の余白にある「サーバーを再起動」(「サーバーを再起動」ボタン) ボタンをクリックします。GlassFish サーバーが停止し、再起動します。
  4. プロジェクトを再度実行し、「Show All Consultant Items」リンクをクリックします。リストが空でなくなっていることがわかります。



Facelets ページでのエディタのサポートの確認

  1. エディタで /consultant/List.xhtml ページを開きます。描画する Facelets の template.xhtml ファイルに依存するページが 8 行目に示されます。
    <ui:composition template="/template.xhtml">

    行番号を表示するには、エディタの左マージンを右クリックし、「行番号を表示」を選択します。

  2. IDE の「ファイル」ダイアログを使用し、template.xhtml を開きます。Alt-Shift-O (Mac の場合は Ctrl-Shift-O) キーを押して、「template」と入力します。
    「ファイルに移動」ダイアログ
    「了解」をクリックするか、Enter キーを押します。
  3. このテンプレートは、ほかのファイルからタイトルと本体に内容を挿入するための <ui:insert> タグを適用します。<ui:insert> タグの上にカーソルを置いて、Ctrl- スペースキーを押し、ドキュメントポップアップウィンドウを呼び出します。
    エディタに表示されたドキュメントポップアップ
    JSF タグおよびその属性上で Ctrl- スペースキーを押すと、ドキュメントポップアップを呼び出しできます。表示されるドキュメントは、公式の JSF タグライブラリドキュメントで提供されている説明から取得したものです。
  4. List.xhtml ファイルに戻ります (Ctrl-Tab キーを押す)。<ui:define> タグは、テンプレートのタイトルと本体に適用する内容を定義するために使用されます。このパターンは、各エンティティークラスに対して生成される 4 つの Facelets ファイル (Create.xhtmlEdit.xhtmlList.xhtml、および View.xhtml) すべてに使用されます。
  5. Bundle.properties ファイルに含まれる、ローカライズされたメッセージに使用される任意の EL 式にカーソルを置きます。Ctrl- スペースキーを押してローカライズされたメッセージを表示します。

    前出の画像に、「List」を解決する EL 式が表示されています。これは、テンプレートのタイトルに適用され、ブラウザに描画されるページから検証できます。
  6. ファイルの最下部にスクロールし、92 行目にある「Create New Consultant」リンクのコードに移動します。この内容は次のとおりです。
    <h:commandLink action="#{consultantController.prepareCreate}" value="#{bundle.ListConsultantCreateLink}"/>
  7. commandLinkaction 属性の上で Ctrl- スペースキーを押し、ドキュメントポップアップを呼び出します。

    action 属性は、ブラウザ内でリンクがクリックされた際の要求を処理するメソッドを示します。次のドキュメントが表示されます。

    ユーザーがこのコンポーネントをアクティブにしたときに起動するアプリケーションアクションを表すメソッド式。この式は、パラメータを取得せず、オブジェクト (論理的な結果を取得するために呼び出される toString() オブジェクト) を返す public メソッドに評価される必要があり、このオブジェクトはこのアプリケーションの NavigationHandler に渡されます。

    つまり、action 値は通常、String 型として評価される JSF 管理対象 Bean 内のメソッドを参照します。この文字列は、要求を適切なビューに転送するため、JSF の NavigationHandler に使用されます。これは次の手順で確認します。
  8. カーソルを consultantController の上に置き、Ctrl- スペースキーを押します。エディタのコード補完で、consultantController が JSF 管理対象 Bean であることが示されます。
    エディタ内で呼び出されたコード補完
  9. カーソルを prepareCreate に移動し、Ctrl- スペースキーを押します。コード補完によって、ConsultantController 管理対象 Bean 内に格納されたメソッドの一覧が表示されます。
    エディタ内で呼び出されたコード補完
  10. Ctrl (Mac の場合は &#8984) を押し、マウスを prepareCreate の上に移動します。リンクが形成され、このリンクを使用して ConsultantController 管理対象 Bean 内の prepareCreate() メソッドに直接移動できます。
    エディタ内に表示されたリンク
  11. リンクをクリックし、次に示す prepareCreate() メソッドを表示します。
    public String prepareCreate() {
        current = new Consultant();
        selectedItemIndex = -1;
        return "Create";
    }
    このメソッドは、Create を返します。NavigationHandler はバックグラウンドで情報を収集し、要求に対する応答として送信されるビューをターゲットとするパスに Create 文字列を適用します (/consultant/Create.xhtml)。JSF 2.0 では、ファイル拡張子は暗黙のナビゲーションによって推定されます。

フィールド検査を使用したデータベース整合性の確認

  1. ブラウザの Consultants List ページから、「Create New Consultant」リンクをクリックします。前に副節で説明したように、これによって /consultant/Create.xhtml ページの描画がトリガーされます。
  2. 次の詳細をフォームに入力します。ここでは RecruiterId フィールドと StatusId フィールドの両方を空白のままにします。

    フィールド
    ConsultantId 2
    Email
    Password jack.smart
    HourlyRate 75
    BillableHourlyRate 110
    HireDate 07/22/2008
    Resume I'm a great consultant. Hire me - You won't be disappointed!
    RecruiterId ---
    StatusId ---
  3. 「保存」をクリックします。これを実行すると、StatusId フィールドに検査エラーのフラグが表示されます。
    サンプルデータを含む「Create New Consultant」ページ
    この状態になる理由は、コンサルティングエージェンシーデータベースのエンティティーの関係図を再度考察するとわかります。前出の関係表にあるように、CONSULTANT 表および CONSULTANT_STATUS 表は null 可能ではない 1 対多の関係を共有しています。そのため、CONSULTANT 表のすべてのエントリには、CONSULTANT_STATUS 表内のエントリに対する参照が含まれている必要があります。これは、2 つの表をリンクする consultant_fk_consultant_status 外部キーによって示されています。

    表に保持されている外部キーは、「サービス」ウィンドウ (Ctrl-5、Mac の場合は &#8984-5) で表の「外部キー」ノードを展開すると表示できます。

    「サービス」ウィンドウ: consultant 表の外部キー
  4. 検査エラーを解決するには、「StatusId」ドロップダウンリストから「entity.ConsultantStatus[statusId=A]」を選択します。

    注: RecruiterId フィールドは空白のままでかまいません。データベースのエンティティー関係図に示すとおり、CONSULTANT 表と RECRUITER 表との間には、null 可能な 1 対多の関係があります。これは、CONSULTANT 内のエントリは RECRUITER エントリと関連付ける必要がないということです。
  5. 「保存」をクリックします。consultant のエントリが正常に保存されたことを示すメッセージが表示されます。「Show All Consultant Items」をクリックすると、表にリストされた新規エントリが表示されます。

一般に、生成された Facelets ページには、次のことが発生するユーザー入力に対してエラーを表示します。

  • null 可能ではない表のセルに対する空のフィールド。
  • 主キーなどの変更できないデータの変更。
  • 型が正しくないデータの挿入。
  • ユーザーのビューがデータベースと同期していないときのデータの変更。

エンティティークラスの編集

前の副節で、ユーザーにとってわかりやすくない「entity.ConsultantStatus[statusId=A]」オプションを「StatusId」ドロップダウンリストに表示する方法を確認しました。ドロップダウンリストの各項目に表示されるテキストは、たとえばエンティティークラスの toString() メソッドが呼び出されることよって発生した、各 ConsultantStatus エンティティーに対する文字列表現であることがすでにおわかりでしょう。

この副節では、このチュートリアルの締めくくりとして、エディタのコード補完、ドキュメント、およびナビゲーションサポートを使用する方法を説明します。また、ユーザーにとってよりわかりやすいメッセージをドロップダウンリストに表示する方法も示します。

  1. エディタで /consultant/Create.xhtml ファイルを開きます。これは、先ほどブラウザで表示した「Create New Consultant」フォームです。次にボールドで示す、「StatusId」ドロップダウンリストのコードまでスクロールします。
        <h:outputLabel value="#{bundle.CreateConsultantLabel_resume}" for="resume" />
        <h:inputTextarea rows="4" cols="30" id="resume" value="#{consultantController.selected.resume}" title="#{bundle.CreateConsultantTitle_resume}" />
        <h:outputLabel value="#{bundle.CreateConsultantLabel_statusId}" for="statusId" />
        <h:selectOneMenu id="statusId" value="#{consultantController.selected.statusId}" title="#{bundle.CreateConsultantTitle_statusId}" required="true" requiredMessage="#{bundle.CreateConsultantRequiredMessage_statusId}">
            <f:selectItems value="#{consultantStatusController.itemsAvailableSelectOne}"/>
        </h:selectOneMenu>
        <h:outputLabel value="#{bundle.CreateConsultantLabel_recruiterId}" for="recruiterId" />
        <h:selectOneMenu id="recruiterId" value="#{consultantController.selected.recruiterId}" title="#{bundle.CreateConsultantTitle_recruiterId}" >
            <f:selectItems value="#{recruiterController.itemsAvailableSelectOne}"/>
        </h:selectOneMenu>
    </h:panelGrid>
  2. <f:selectItems> タグに適用される value を確認します。value 属性は、ドロップダウンリストの各項目に表示するテキストを決定します。

    itemsAvailableSelectOne 上で Ctrl- スペースを押します。エディタのコード補完に、ConsultantStatusControllergetItemsAvailableSelectOne() メソッドが SelectItem オブジェクトの配列を返すことが示されます。
    エディタ内で呼び出されたコード補完
  3. Ctrl (Mac の場合は &#8984) を押し、マウスを itemsAvailableSelectOne の上に移動します。リンクが形成され、このリンクを使用して ConsultantStatus エンティティーのソースコード内の getItemsAvailableSelectOne() メソッドに直接移動できます。リンクをクリックします。
  4. メソッド署名内の SelectItem[] 戻り値の上にカーソルを置き、Ctrl- スペースキーを押してドキュメントポップアップを呼び出します。
    Java クラス内で呼び出されたドキュメントポップアップ

    ドキュメントウィンドウの Web ブラウザ (Web ブラウザのアイコン) アイコンをクリックし、外部 Web ブラウザで Javadoc を開きます。

    表示されるように、SelectItem クラスは JSF フレームワークに属しています。このドキュメントにあるように、UISelectOne コンポーネントは、前出の手順 1 で調べたマークアップからの <h:selectOneMenu> タグによって表現されます。
  5. Ctrl (Mac の場合は &#8984) を押し、マウスを findAll() の上に移動します。ポップアップが表示され、メソッド署名が示されます。
    メソッド署名のポップアップ
    ここで、ejbFacade.findAll()ConsultantStatus オブジェクトの List を返すことが確認できます。
  6. JsfUtil.getSelectItems に移動します。マウスを getSelectItems の上に移動し、Ctrl キー (Mac の場合は &#8984) を押し、表示されるリンクをクリックします。

    注: JsfUtil は、「エンティティーからの JSF ページクラス」ウィザードの完了時に生成されたユーティリティークラスの 1 つであることを思い出してください。

    このメソッドは、エンティティーのリスト (ConsultantStatus オブジェクトの List など) をループし、各エンティティーに SelectItem を作成します。次にボールドで示すように、各 SelectItem はエンティティーオブジェクトとオブジェクトのラベルを使用して作成されます。
    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (selectOne) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Object x : entities) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }
    このラベルは、エンティティーの toString() メソッドを使用して作成され、応答で描画されるときのオブジェクトの表現です。SelectItem(java.lang.Object value, java.lang.String label) コンストラクタに対する Javadoc の定義を参照してください。

    これで、ドロップダウンリストに項目を表示するときにブラウザに描画されるのがエンティティーの toString() メソッドであることを確認したので、ConsultantStatus toString() メソッドを変更します。
  7. エディタで ConsultantStatus エンティティークラスを開きます。statusId および description を返すように、toString メソッドを変更します。これらは、CONSULTANT_STATUS 表の 2 つの列に対応するエンティティープロパティーです。
    public String toString() {
        return statusId + ", " + description;
    }
  8. プロジェクトを再実行します。ブラウザに開始ページが表示されたら、「Show All Consultant Items」リンクをクリックし、「Create New Consultant」をクリックします。

    StatusId」ドロップダウンリストを確認します。これで、データベースの CONSULTANT_STATUS 表に格納されている、あるレコードについてのステータス ID と説明が表示されるようになりました。
    「StatusId」ドロップダウンリストのブラウザ表示

関連項目

JSF 2.0 の詳細については、次のリソースを参照してください。