データベースからのJavaServer Faces 2.x CRUDアプリケーションの生成

このチュートリアルでは、NetBeans IDEを使用し、バックエンドのデータベースと対話するWebアプリケーションを作成します。このアプリケーションでは、データベースに格納されたデータを表示および変更できます。この機能はCRUD (作成、読取り、更新、削除)とも呼ばれます。開発するアプリケーションは、次のテクノロジに基づきます。

  • JavaServer Faces (JSF) 2.x。フロント・エンドのWebページ、検証処理およびリクエスト-レスポンス・サイクルの管理に使用します。
  • Java Persistence API (JPA) 2.0。EclipseLinkを使用してデータベースからエンティティ・クラスを生成し、トランザクションを管理します。EclipseLinkはJPAのリファレンス実装であり、GlassFishサーバーのデフォルトの持続性プロバイダです。
  • Enterprise JavaBeans (EJB) 3.1。エンティティ・クラスにアクセスするステートレスEJBを提供し、アプリケーションのビジネス・ロジックを格納します。

IDEには、アプリケーション用のコードをすべて生成する、2つのウィザードが用意されています。データベースからのエンティティ・クラス・ウィザードを使用すると、提供されたデータベースからエンティティ・クラスを生成できます。エンティティ・クラスを作成した後は、エンティティからのJSFページ・クラス・ウィザードを使用して、そのエンティティ・クラスのJSF管理対象BeanとEJB、およびエンティティ・クラス・データのビューを処理する一連のFaceletsページを作成します。このチュートリアルの最後のアプリケーションの操作の項には、このアプリケーションの理解を深め、IDEの習熟に役立つ様々な課題を用意しています(オプション)。

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます

内容

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

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 7.2、7.3、7.4、8.0、Java EEバンドル版
Java Development Kit (JDK) 7または8
GlassFish Server Open Source Edition 3.x、4.x
mysql-consult.zip (MySQL)
または
javadb-consult.zip (JavaDB)
n/a

注意:

  • NetBeans IDEのJava EEバンドル版には、このチュートリアルに必要な、Java EE準拠サーバーのGlassFishサーバーも含まれています。
  • このチュートリアルのソリューション・プロジェクトを入手するには、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」と入力します。「OK」をクリックします。「データベース」ノードの下に新しいノードが表示されます(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]、Macの場合は[⌘]-[Shift]-[N])を選択します。
  2. 「Java Web」カテゴリから「Webアプリケーション」を選択します。「次」をクリックします。
  3. プロジェクト名として「ConsultingAgency」と入力し、プロジェクトの場所を設定します。「次」をクリックします。
  4. サーバーを「GlassFish」に設定し、「Java EEバージョン」を「Java EE 6 Web」または「Java EE 7 Web」に設定します。「次」をクリックします。
  5. 「フレームワーク」パネルで「JavaServer Faces」オプションを選択します。「終了」をクリックします。

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

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

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

  1. 「プロジェクト」ウィンドウで「ConsultingAgency」プロジェクト・ノードを右クリックし、「新規」>「データベースからのエンティティ・クラス」を選択します。このオプションがリストにない場合は「その他」を選択します。次に、ファイル・ウィザードで「持続性」カテゴリを選択し、「データベースからのエンティティ・クラス」を選択します。
  2. 「データ・ソース」ドロップダウン・リストから「新しいデータ・ソース」を選択して「データ・ソースを作成」ダイアログを開きます。
  3. 「JNDI名」に「jdbc/consult」と入力し、「データベース接続」に「jdbc:mysql://localhost:3306/consult」接続を選択します。
    「データソースを作成」ダイアログ・ボックス
  4. 「OK」をクリックしてダイアログ・ボックスを閉じ、ウィザードに戻ります。consultデータベース内の表が「使用可能な表」リスト・ボックスに表示されます。
  5. 「すべてを追加」ボタンをクリックし、データベースに格納されているすべての表を選択します。「次」をクリックします。
    データベースからの新規エンティティ・ウィザード
  6. 「パッケージ」名に「jpa.entities」と入力します。
  7. 名前付き問合せを生成するためのチェックボックスと持続性ユニットを作成するためのチェックボックスが選択されていることを確認します。「終了」をクリックします。

「終了」をクリックすると、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ページを生成します。ウィザードで生成されるコードは、エンティティ・クラス内に格納された持続性注釈に基づいて生成されます。

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

  • AbstractFacade.javaを拡張するステートレス・セッションBean
  • JSFセッション・スコープ指定管理対象Bean
  • CRUD機能のための4つのFaceletsファイル(Create.xhtmlEdit.xhtmlList.xhtml、およびView.xhtml)を格納するディレクトリ

ウィザードでは、次のファイルも生成します。

  • エンティティ・インスタンスの作成、取得、変更および除去のためのビジネス・ロジックを含むAbstractFacade.javaクラス
  • 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.xでは、ファイル拡張子は暗黙のナビゲーションによって推定されます。)
    コンサルタント・ページ
    このデータベースには、現在サンプル・データが含まれていません。「Create New Consultant」リンクをクリックし、表示されるWebフォームを使用することでデータを手動で追加できます。これにより、/consultant/Create.xhtmlページの表示がトリガーされます。また、SQLスクリプトをIDEで実行し、サンプル・データを含む表を生成することもできます。次の項では、両方の選択肢を示します。

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

注意:アプリケーションのデプロイに失敗した場合は、下の「トラブルシューティング」セクションを参照してください。(MySQLデータベースを使用した単純なWebアプリケーションの作成の「トラブルシューティング」セクションも参照してください。)

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」と入力します。
    「ファイルに移動」ダイアログ

    「OK」をクリックするか、[Enter]を押します。

  3. このテンプレートは、他のファイルからタイトルと本体に内容を挿入するための<ui:insert>タグを適用します。<ui:insert>タグの上にカーソルを置いて、[Ctrl]-[Space]を押し、ドキュメント・ポップアップ・ウィンドウを呼び出します。
    エディタに表示されたドキュメントのポップアップ

    JSFタグおよびその属性上で[Ctrl]-[Space]を押すと、ドキュメント・ポップアップを呼出しできます。表示されるドキュメントは、公式のJSFタグ・ライブラリ・ドキュメントで提供されている説明から取得したものです。

  4. List.xhtmlファイルに戻ります([Ctrl]-[Tab]を押します)。<ui:define>タグは、テンプレートのタイトルと本体に適用する内容を定義するために使用されます。このパターンは、各エンティティ・クラスに対して生成される4つのFaceletsファイル(Create.xhtmlEdit.xhtmlList.xhtml、およびView.xhtml)すべてに使用されます。
  5. Bundle.propertiesファイルに含まれる、ローカライズされたメッセージに使用される任意のEL式にカーソルを置きます。[Ctrl]-[Space]を押してローカライズされたメッセージを表示します。
    プロパティ・バンドルからのメッセージのコード補完ポップアップ

    前出のイメージに、「List」を解決するEL式が表示されています。これは、テンプレートのタイトルに適用され、ブラウザにレンダリングされるページから確認できます。

  6. ファイルの最下部にスクロールし、92行目にある「Create New Consultant」リンクのコードに移動します。この内容は次のとおりです。
    <h:commandLink action="#{consultantController.prepareCreate}" value="#{bundle.ListConsultantCreateLink}"/>
  7. commandLinkaction属性の上で[Ctrl]-[Space]を押し、ドキュメント・ポップアップを呼び出します。

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

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

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

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

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

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

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

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

    注意: 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()メソッドであることを確認したので、ConsultantStatustoString()メソッドを変更します。

  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」ドロップダウン・リストのブラウザ表示

トラブルシューティング

構成によっては、サーバーへのアプリケーションのデプロイが失敗し、「出力」ウィンドウに次のメッセージが表示されることがあります。

GlassFish Server 4 is running.
In-place deployment at /MyDocuments/ConsultingAgency/build/web
GlassFish Server 4, deploy, null, false
/MyDocuments/ConsultingAgency/nbproject/build-impl.xml:1045: The module has not been deployed.
See the server log for details.

失敗する最も一般的な原因は、サーバーでJDBCリソースを生成する際の問題です。その場合、「出力」ウィンドウのサーバー・ログ・タブに次のようなメッセージが表示されます。

Severe:   Exception while preparing the app : Invalid resource : jdbc/consult__pm
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : jdbc/consult__pm

サーバー・ログ・タブが開かれていない場合は、「サービス」ウィンドウの「GlassFish Server」ノードを右クリックし、「ドメイン・サーバー・ログの表示」を選択して開くことができます。

このアプリケーションには、2つのJDBCリソースが必要です。

  • JDBCリソースまたはデータ・ソース。アプリケーションでは、JNDIルックアップを使用してJDBCリソースを検索します。持続性ユニットを調べると(persistence.xml)、このアプリケーションのJTAデータ・ソースのJNDI名がjdbc/consultであることがわかります。

    JDBCリソースは、アプリケーションで現在使用されている接続プールを識別します。

  • JDBC接続プール。接続プールは、場所、ユーザー名、パスワードなど、データベースの接続詳細を指定します。このアプリケーションで使用される接続プールはconsultPoolです。

JDBCリソースと接続プールはglassfish-resources.xmlファイルで指定されます。glassfish-resources.xmlを開くには、「プロジェクト」ウィンドウで「サーバー・リソース」ノードを展開し、ファイルをダブルクリックします。ファイルには、次のような情報が記載されています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="consultPool" non-transactional-connections="false" ping="false" pool-resize-quantity="2" pooling="true" res-type="javax.sql.DataSource" statement-cache-size="0" statement-leak-reclaim="false" statement-leak-timeout-in-seconds="0" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="serverName" value="localhost"/>
    <property name="portNumber" value="3306"/>
    <property name="databaseName" value="consult"/>
    <property name="User" value="root"/>
    <property name="Password" value="nb"/>
    <property name="URL" value="jdbc:mysql://localhost:3306/consult?zeroDateTimeBehavior=convertToNull"/>
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  /<jdbc-connection-pool>
  <jdbc-resource enabled="true" jndi-name="jdbc/consult" object-type="user" pool-name="consultPool"/>
/<resources>

glassfish-resources.xmlでは、JDBCリソースjdbc/consultconsultPoolを接続プールの名前として識別していることがわかります。consultPoolのプロパティも確認できます。このアプリケーションでは、1つのデータ・ソースと1つの接続プールのみがglassfish-resources.xmlで定義されます。場合によっては、開発またはテストのみに使用する一時データ・ソースを識別するために、追加リソースを指定することもできます。

アプリケーションの実行時に、JDBCリソースおよび接続プールがサーバーで自動的に生成されなかった場合、次の手順を実行して、GlassFish管理コンソールでリソースを手動で作成できます。

  1. まだ開いていない場合、エディタでglassfish-resources.xmlを開きます。

    JDBCリソースと接続プールを作成する際は、glassfish-resources.xmlで指定されているプロパティ値を使用します。

  2. 「サービス」ウィンドウで「GlassFish Server」ノードを右クリックし、ポップアップ・メニューで「ドメイン管理コンソールを開く」を選択して、ブラウザでGlassFishコンソールを開きます。
  3. GlassFishコンソールの共通タスク・ナビゲーション・パネルで、「JDBC」ノードおよび「JDBCリソース」および「JDBC接続プール」ノードを展開します。
    GlassFish管理コンソールのブラウザ表示

    現在サーバーに登録されているDBCリソースを確認できます。jdbc/consultconsultPoolが共通タスク・ナビゲーション・パネルの「JDBC」ノードの下に表示されていない場合は、これらを作成する必要があります。一部のJDBCリソースは、サーバーのインストール時にデフォルトで作成されており、これらはサブノードとして表示されます。

  4. 「JDBC接続プール」ノードをクリックし、新規のJDBC接続プール・ペインで「新規」をクリックします。
    新規のJDBC接続プール・ペインのブラウザ表示
  5. プール名としてconsultPoolを入力し、リソース・タイプとしてjavax.sql.ConnectionPoolDataSourceを選択し、データベース・ドライバ・ベンダーとしてMySqlを選択します。「次」をクリックします。
  6. 手順2で、URLusernameおよびpasswordプロパティの値を検索して指定します。「終了」をクリックします。
    新規のJDBC接続プール・ペインの2番目のパネルのブラウザ表示

    glassfish-resources.xmlで、プロパティの値を検索できます。

    「終了」をクリックするとサーバー上に新規の接続プールが作成され、「JDBC接続プール」ノードの下にその接続プールのノードが表示されます。

  7. 共通タスク・ナビゲーション・パネルで「JDBCリソース」をクリックして、「新規」をクリックします。
  8. JNDI名にjdbc/consultと入力し、「プール名」ドロップダウン・リストでconsultPoolを選択します。「OK」をクリックします。
    新規のJDBCリソース・ペインのブラウザ表示

    「OK」をクリックするとサーバー上に新規のJDBCリソースが作成され、「JDBCリソース」ノードの下にそのリソースのノードが表示されます。

    IDEの「サービス」ウィンドウで、「GlassFish Server」の下の「リソース」を展開して、そのIDEで新規リソースが追加されたことを確認できます。変更内容を表示するために、ビューのリフレッシュが必要になることがあります(「リソース」を右クリックして「リフレッシュ」を選択)。

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

MySQLおよびIDEの使用時に問題を解決するためのヒントについては、次のドキュメントを参照してください。


関連項目

JSF 2.xの詳細は、次のリソースを参照してください。

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo