Web アプリケーションでの Hibernate の使用
このチュートリアルでは、NetBeans IDE を使用してデータをデータベースから表示する Web アプリケーションを作成して配備します。この Web アプリケーションでは、プレーンオールド Java オブジェクト (POJO) を取得してリレーショナルデータベースに保存するための持続性レイヤーとして、Hibernate フレームワークを使用します。
Hibernate は、ORM (object relational mapping) のためのツールを提供するフレームワークです。このチュートリアルでは、IDE に Hibernate フレームワークのサポートを追加し、必要な Hibernate ファイルを作成する方法を示します。Java オブジェクトを作成し、Hibernate を使用するようにアプリケーションを構成したあと、JSF 管理対象 Bean とデータを表示する JSF 2.0 ページを作成します。
このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。
目次
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
注:
完了したプロジェクトの ZIP アーカイブはダウンロードできます。
データベースの作成
このチュートリアルでは、MySQL のサイトで無償提供されている MySQL サンプルデータベースの sakila を使用します。IDE のインストールには sakila データベースが含まれないため、チュートリアルを開始する前にデータベースを作成する必要があります。
sakila データベースを作成するには、プラグインマネージャーを使用して Sakila サンプルデータベースプラグインをダウンロードしてインストールできます。このプラグインをインストールすると、「MySQL データベースの作成」ダイアログのデータベースリストに sakila データベースが追加されます。
MySQL を操作する IDE の構成については、「MySQL データベースへの接続」チュートリアルを参照してください。
- プラグインマネージャーを開き、Sakila サンプルデータベースプラグインをインストールします。
- プラグインをインストールしたあと、「サービス」ウィンドウで「データベース」ノードを展開し、「MySQL サーバー」ノードを右クリックして「起動」を選択して、MySQL データベースを起動します。
- 「MySQL サーバー」ノードを右クリックし、「データベースを作成」を選択します。
- 「MySQL データベースの作成」ダイアログで「新規データベース名」ドロップダウンリストから「Sakila データベース」を選択します。「了解」をクリックします。
「了解」をクリックすると、「MySQL サーバー」ノードの下に「Sakila」ノードが表示されます。
- 「Sakila」ノードを右クリックし、「接続」を選択します。
「接続」をクリックすると、「Sakila」データベースのデータベース接続のノード (jdbc:mysql://localhost:3306/sakila [デフォルトのユーザー名]) が「データベース」ノードに一覧表示されます。接続が開いたら、接続ノードを展開してデータベースのデータを確認できます。
Web アプリケーションプロジェクトの作成
この課題では、Web アプリケーションプロジェクトを作成し、Hibernate ライブラリをそのプロジェクトに追加します。プロジェクトを作成するとき、「新規プロジェクト」ウィザードの「フレームワーク」パネルで「Hibernate」を選択してデータベースを指定します。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「Java Web」カテゴリから「Web アプリケーション」を選択し、「次へ」をクリックします。
- プロジェクト名として「DVDStore」と入力し、プロジェクトの場所を設定します。
- 専用フォルダを使用するオプションが選択されている場合は選択を解除します。「次へ」をクリックします。
このチュートリアルでは、ライブラリをほかのユーザーと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
- サーバーを GlassFish Server 3 に設定し、Java EE バージョンを Java EE 6 Web に設定します。「次へ」をクリックします。
- 「JavaServer Faces」チェックボックスを選択し、デフォルトの JSF 2.0 ライブラリを使用します。
- 「Hibernate 3.2.5」チェックボックスを選択します。
- 「データベース接続」ドロップダウンリストから「Sakila データベース」を選択します。「完了」をクリックします。
注: Sakila データベースがウィザードの「フレームワーク」パネルのオプションとして使用できない場合、この接続が「サービス」ウィンドウの「データベース」ノードに一覧表示されているかどうかを確認します。ここに接続がない場合、データベース接続を作成する必要があります。
「完了」をクリックすると、Web アプリケーションプロジェクトが作成され、hibernate.cfg.xml ファイルと index.xhtml がエディタに表示されます。
「プロジェクト」ウィンドウの「ライブラリ」ノードを展開すると、IDE によって Hibernate ライブラリがそのプロジェクトに追加されたことが確認できます。
Hibernate 構成ファイルの変更
Hibernate フレームワークを使用する新規プロジェクトを作成する場合、IDE では hibernate.cfg.xml 構成ファイルがアプリケーションのコンテキストクラスパスのルート (「ファイル」ウィンドウの src/java) に自動的に作成されます。ファイルは、「プロジェクト」ウィンドウの「ソースパッケージ」の下の <デフォルトパッケージ> にあります。構成ファイルには、データベース接続、リソースマッピング、およびそのほかの接続プロパティーに関する情報が格納されます。このファイルは、マルチビューエディタを使用して編集、または直接 XML エディタで XML を編集できます。
この課題では、hibernate.cfg.xml に指定されたデフォルトのプロパティーを編集し、SQL 文のデバッグログ記録を有効にし、Hibernate のセッションコンテキスト管理を有効にします。
- 「デザイン」タブで hibernate.cfg.xml を開きます。このファイルを開くには、「プロジェクト」ウィンドウで「ソースパッケージ」>「<デフォルトパッケージ>」を展開し、hibernate.cfg.xml をダブルクリックします。
- マルチビュー XML エディタで、「オプションのプロパティー」の下の「構成プロパティー」ノードを展開します。
- 「追加」をクリックして「Hibernate プロパティーを追加」ダイアログを開きます。
- このダイアログで、「hibernate.show_sql」プロパティーを選択し、値を「true」に設定します。これにより、SQL 文のデバッグログ記録が有効になります。
- 「Miscellaneous Properties」ノードを展開し、「追加」をクリックします。
- このダイアログで「hibernate.current_session_context_class」プロパティーを選択し、値を「thread」に設定すると、Hibernate の自動セッションコンテキスト管理が有効になります。
エディタの「XML」タブをクリックすると、ファイルが XML ビューに表示されます。ファイルの内容は次のようになります。
<hibernate-configuration>
<session-factory name="session1">
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">######</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
- 変更内容をファイルに保存します。
このファイルは、再度編集する必要がないため閉じてかまいません。
HibernateUtil.java ヘルパーファイルの作成
Hibernate を使用するには、起動を処理し、Hibernate の SessionFactory にアクセスしてセッションオブジェクトを取得するヘルパークラスを作成する必要があります。このクラスは、configure() を呼び出し、hibernate.cfg.xml 構成ファイルを読み込み、次に SessionFactory を構築してセッションオブジェクトを取得します。
この節では、「新規ファイル」ウィザードを使用してヘルパークラスである HibernateUtil.java を作成します。
- 「ソースパッケージ」ノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「カテゴリ」の一覧から「Hibernate」を選択し、「ファイルの種類」の一覧から「HibernateUtil.java」を選択します。「次へ」をクリックします。
- クラス名に「HibernateUtil」、パッケージに「dvdrental」と入力します。「完了」をクリックします。
「完了」をクリックすると、HibernateUtil.java がエディタに表示されます。このファイルは、編集する必要がないため閉じて構いません。
Hibernate のマッピングファイルおよび Java クラスの生成
このチュートリアルでは、POJO (プレーンオールド Java オブジェクト) を使って、これから使用するデータベース内の各表内のデータを表します。Java クラスが、表内の列のフィールドを指定し、データの取得と書き込みに簡単な取得メソッドおよび設定メソッドを使用します。POJO を表にマップするには、Hibernate マッピングファイルを使用するか、クラス内で注釈を使用します。
「データベースからの Hibernate のマッピングファイルと POJO」ウィザードを使用して、データベース表に基づいて複数の POJO とマッピングファイルを作成できます。ウィザードを使用し、目的の POJO とマッピングファイルのためのすべての表を選択すると、IDE でデータベース表に基づいてファイルが生成され、hibernate.cfg.xml にマッピングエントリが追加されます。ウィザードを使用する場合、たとえば POJO のみにするなど、IDE で生成するファイルを選択でき、また、たとえば EJB 3 注釈を使用するコードの生成するなど、コード生成オプションを選択できます。
注: IDE には、個別の POJO とマッピングファイルを最初から作成するウィザードもあります。
Hibernate リバースエンジニアリングファイルの作成
「データベースからの Hibernate のマッピングファイルと POJO」ウィザードを使用する場合、最初に hibernate.reveng.xml リバースエンジニアリングファイルを作成する必要があります。「データベースからの Hibernate のマッピングファイルと POJO」ウィザードには、hibernate.reveng.xml および hibernate.cfg.xml が必要です。
リバースエンジニアリングファイルを使用すると、データベースマッピング方法をより詳細に制御できます。Hibernate リバースエンジニアリングウィザードでは、XML エディタで編集できるデフォルト構成を持つリバースエンジニアリングファイルが作成されます。
Hibernate リバースエンジニアリングファイルを作成するには、次の手順に従います。
- 「プロジェクト」ウィンドウで「ソースパッケージ」ノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「Hibernate」カテゴリで「Hibernate リバースエンジニアリングウィザード」を選択します。「次へ」をクリックします。
- ファイル名に hibernate.reveng を指定し、フォルダに src/java を指定します。「次へ」をクリックします。
- 選択されていない場合、hibernate.cfg.xml を「構成ファイル」ドロップダウンリストから選択します。
- 「使用可能な表」から次の表を選択し、「追加」をクリックして「選択した表」に追加します。
- actor
- category
- film
- film_actor
- film_category
- language
「完了」をクリックします。
このウィザードでは、hibernate.reveng.xml リバースエンジニアリングファイルが生成され、ファイルはエディタに表示されます。リバースエンジニアリングファイルは、編集する必要がないため閉じてかまいません。
hibernate.reveng.xml ファイルの操作の詳細については、「第 5 章: リバースエンジニアリングの制御」(Hibernate Tools リファレンスガイド) を参照してください。
Hibernate マッピングファイルと POJO の作成
「データベースからの Hibernate のマッピングファイルと POJO」ウィザードを使用して、ファイルを生成できます。このウィザードでは、ウィザードで選択した表ごとに、POJO および対応するマッピングファイルを生成できます。マッピングファイルは XML ファイルで、表の列を POJO のフィールドにマップする方法に関するデータが含まれています。ウィザードを使用するには、hibernate.reveng.xml ファイルと hibernate.cfg.xml ファイルが必要です。
ウィザードを使用して POJO とマッピングファイルを作成するには、次の手順に従います。
- 「プロジェクト」ウィンドウで「ソースパッケージ」ノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「データベースからの Hibernate のマッピングファイルと POJO」を「Hibernate」カテゴリから選択します。「次へ」をクリックします。
- ドロップダウンリストで、hibernate.cfg.xml ファイルと hibernate.reveng.xml ファイルが選択されていることを確認します。
- 「一般的な設定」で「JDK 5 言語機能」を選択します。
- 「ドメインコード」および「Hibernate XML のマッピング」オプションが選択されていることを確認します。
- パッケージ名に「dvdrental」を選択します。「完了」をクリックします。
「完了」をクリックすると、POJO と Hibernate のマッピングファイルが生成され、hibernate.reveng.xml で指定した列にフィールドがマップされます。また、hibernate.cfg.xml にマッピングエントリが追加されます。dvdrental パッケージを展開すると、ウィザードによって生成されたファイルを確認できます。
特定の表を特定のクラスにマップする Hibernate マッピングファイルを作成する場合、Hibernate マッピングウィザードを使用できます。
hibernate.reveng.xml ファイルの操作の詳細については、「第 5 章: 基本的な O/R マッピング」(Hibernate Reference Documentation) を参照してください。
FilmHelper.java ヘルパークラスの作成
データベースに対する Hibernate クエリーの実行に使用するヘルパークラスを dvdrental パッケージ内に作成します。Hibernate クエリー言語 (HQL) エディタを使用して、データを取り出すクエリーを構築し、テストします。クエリーをテストしたら、クエリーを構築および実行するメソッドをヘルパークラス内に作成します。次に、ヘルパークラス内のメソッドを JSP 管理対象 Bean から呼び出します。
クラスの作成
この節では、「新規ファイル」ウィザードを使用して、ヘルパークラス FilmHelper.java を dvdrental パッケージ内に作成します。HibernateUtil.java 内の getSessionFactory を呼び出して Hibernate セッションを作成し、データベースからデータを取り出すクエリーを作成するヘルパーメソッドをいくつか作成します。ヘルパーメソッドは JSP ページから呼び出します。
- 「dvdrental」ソースパッケージノードを右クリックし、「新規」>「Java クラス」を選択して、「新規ファイル」ウィザードを開きます。
- クラス名に「FilmHelper」と入力します。
- パッケージが「dvdrental」であることを確認します。「完了」をクリックします。
- 次のコード (ボールド部分) を追加して、Hibernate セッションを作成します。
public class FilmHelper {
Session session = null;
public FilmHelper() {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
}
- インポートを修正して (org.hibernate.Session) 変更内容を保存します。
ここで FilmHelper.java を変更して、データベースに対してクエリーを実行するメソッドを追加します。
HQL クエリーを使用した映画タイトルの列挙と俳優の取得
この課題では、データベースをクエリーして Film 表から映画のタイトルのリストを取り出す、Hibernate クエリー言語 (HQL) クエリー作成します。次に、特定の映画に含まれる俳優を取得するため、Actor 表および Film_actor 表の両方にクエリーを実行するメソッドを追加します。
Film 表には 1,000 件のレコードがあるため、映画のリストを取得するメソッドは、filmId 主キーに基づいてレコードを取得できる必要があります。HQL クエリーの構成とテストには、HQL エディタを使用します。正しいクエリーを作成したあと、適切なクエリーを生成できるクラスにメソッドを追加します。
- 「プロジェクト」ウィンドウで「hibernate.cfg.xml」を右クリックし、「HQL クエリーを実行」を選択して、HQL クエリーエディタを開きます。
- ツールバーのドロップダウンリストから「hibernate.cfg」を選択します。
- 接続をテストするには、エディタで次のように入力し、ツールバーの「HQL クエリーを実行」ボタン (
) をクリックします。
from Film
「HQL クエリーを実行」をクリックすると、HQL クエリーエディタの下部ウィンドウにクエリーの結果が表示されます。
「SQL」ボタンをクリックすると、対応する SQL クエリーを見ることができます。
select film0_.film_id as col_0_0_ from sakila.film film0_
- 次のクエリーを入力して、filmid が 100 から 200 の間に含まれるレコードを Film 表から取り出します。
from Film as film where film.filmId between 100 and 200
結果ウィンドウにレコードのリストが表示されます。クエリーが適切な結果を返すことをテストできたので、このクエリーをヘルパークラスで使用できます。
- FilmHelper.java に次のメソッド getFilmTitles を追加して、filmid が、変数 startID と endID で指定する範囲内にある映画を取り出します。
public List getFilmTitles(int startID, int endID) {
List<Film> filmList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Film as film where film.filmId between '"+startID+"' and '"+endID+"'");
filmList = (List<Film>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return filmList;
}
- 特定の映画から俳優を取得する次のメソッド getActorsByID を追加します。メソッドは、入力変数として filmId を使用し、クエリーを構成します。
public List getActorsByID(int filmId){
List<Actor> actorList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')");
actorList = (List<Actor>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return actorList;
}
- インポートを修正して変更内容を保存します。
インポートを修正するときは、java.util.List と org.hibernate.Query を選択します。
ヘルパーメソッドの追加
ここでは、入力変数に基づいてクエリーを作成するヘルパーメソッドを追加します。クエリーは HQL クエリーエディタで確認できます。
- filmId に基づいてカテゴリのリストを取り出す次のメソッドを追加します。
public Category getCategoryByID(int filmId){
List<Category> categoryList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Category as category where category.categoryId in (select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId='" + filmId + "')");
categoryList = (List<Category>) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return categoryList.get(0);
}
- filmId に基づいて 1 つの映画を取り出す次のメソッドを追加します。
public Film getFilmByID(int filmId){
Film film = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Film as film where film.filmId=" + filmId);
film = (Film) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return film;
}
- langId に基づいて映画の言語を取り出す次のメソッドを追加します。
public String getLangByID(int langId){
Language language = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Language as lang where lang.languageId=" + langId);
language = (Language) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return language.getName();
}
JSF 管理対象 Bean の作成
この課題では、JSF 管理対象 Bean を作成します。管理対象 Bean のメソッドは、JSF ページにデータを表示したり、ヘルパークラスのメソッドにアクセスしてレコードを取り出したりするために使用されます。JSF 2.0 仕様によって、スコープを指定したり Bean に名前を指定したりするための JSF 管理対象 Bean としてクラスを識別するため、Bean クラスに注釈を使用できます。
管理対象 Bean を作成するには、次の手順に従います。
- dvdrental ソースパッケージノードを右クリックして「新規」>「その他」を選択します。
- JavaServer Faces カテゴリから JSF 管理対象 Bean を選択します。「次へ」をクリックします。
- 「クラス名」に「FilmController」と入力します。
Bean でメソッドを呼び出すときに、管理対象 Bean 名 filmController を、JSF ページ index.xhtml の inputText および commandButton の値として使用します。
- パッケージに「dvdrental」を選択します。
- 管理対象 Bean に使用する名前に、「filmController」と入力します。
- セッションにスコープを設定します。「完了」をクリックします。
「完了」をクリックすると、IDE は Bean クラスを作成し、そのクラスがエディタに表示されます。IDE によって、@ManagedBean 注釈、@SessionScoped 注釈、および Bean の名前が追加されます。
@ManagedBean(name="filmController")
@SessionScoped
public class FilmController {
/** FilmController の新しいインスタンスの作成 */
public FilmController() {
}
}
- このクラスに、次のフィールド (ボールド部分) を追加します。
@ManagedBean(name="filmController")
@SessionScoped
public class FilmController {
int startId;
int endId;
DataModel filmTitles;
FilmHelper helper;
private int recordCount = 1000;
private int pageSize = 10;
private Film current;
private int selectedItemIndex;
}
- 次のボールド部分のコードを追加して FilmController インスタンスを作成し、映画を取り出します。
/** FilmController の新しいインスタンスの作成 */
public FilmController() {
helper = new FilmHelper();
startId = 1;
endId = 10;
}
public FilmController(int startId, int endId) {
helper = new FilmHelper();
this.startId = startId;
this.endId = endId;
}
public Film getSelected() {
if (current == null) {
current = new Film();
selectedItemIndex = -1;
}
return current;
}
public DataModel getFilmTitles() {
if (filmTitles == null) {
filmTitles = new ListDataModel(helper.getFilmTitles(startId, endId));
}
return filmTitles;
}
void recreateModel() {
filmTitles = null;
}
- 表の表示とページへのナビゲートに使用される、次のメソッドを追加します。
public boolean isHasNextPage() {
if (endId + pageSize <= recordCount) {
return true;
}
return false;
}
public boolean isHasPreviousPage() {
if (startId-pageSize > 0) {
return true;
}
return false;
}
public String next() {
startId = endId+1;
endId = endId + pageSize;
recreateModel();
return "index";
}
public String previous() {
startId = startId - pageSize;
endId = endId - pageSize;
recreateModel();
return "index";
}
public int getPageSize() {
return pageSize;
}
public String prepareView(){
current = (Film) getFilmTitles().getRowData();
return "browse";
}
public String prepareList(){
recreateModel();
return "index";
}
「index」または「browse」を返すメソッドによって、JSF ナビゲーションハンドラは index.xhtml または browse.xhtml という名前のページを開くように求められます。JSF 2.0 仕様では、Facelets テクノロジを使用するアプリケーションで暗黙ナビゲーション規則を使用できます。このアプリケーションは、faces-config.xml にナビゲーション規則が構成されていません。代わりに、ナビゲーションハンドラが、アプリケーション内で適切なページを検索しようとします。
- 追加の映画の詳細を取り出すヘルパークラスにアクセスする、次のメソッドを追加します。
public String getLanguage() {
int langID = current.getLanguageByLanguageId().getLanguageId().intValue();
String language = helper.getLangByID(langID);
return language;
}
public String getActors() {
List actors = helper.getActorsByID(current.getFilmId());
StringBuffer totalCast = new StringBuffer();
for (int i = 0; i < actors.size(); i++) {
Actor actor = (Actor) actors.get(i);
totalCast.append(actor.getFirstName());
totalCast.append(" ");
totalCast.append(actor.getLastName());
totalCast.append(" ");
}
return totalCast.toString();
}
public String getCategory() {
Category category = helper.getCategoryByID(current.getFilmId());
return category.getName();
}
- インポートを修正して (Ctrl-Shift-I) 変更内容を保存します。
エディタでコード補完を使用すると、コードの入力に役立ちます。
Web ページの作成
この課題では、データを表示する Web ページを 2 つ作成します。IDE が生成した index.xhtml を変更して、データベース内の映画を表示する表を追加します。次に、表の「View」リンクをクリックしたときに映画の詳細を表示する、browse.xhtml を作成します。また、index.xhtml と browse.xhtml で使用する JSF テンプレートページも作成します。
JSF 2.0 および Facelets テンプレートの使用については、「JavaServer Faces 2.0 入門」を参照してください。
template.xhtml の作成
最初に、index.xhtml ページと browse.xhtml ページの構成に使用する、JSF Facelets テンプレート template.xhtml を作成します。
- 「プロジェクト」ウィンドウで「DVDStore」を右クリックし、「新規」>「その他」を選択します。
- 「JavaServer Faces」カテゴリで「Facelets テンプレート」を選択します。「次へ」をクリックします。
- 「ファイル名」に「template」と入力し、1 つ目の CSS レイアウトスタイルを選択します。
- 「完了」をクリックします。
「完了」をクリックすると、エディタで template.xhtml ファイルが開きます。テンプレートには次のデフォルトコードが含まれています。
<h:body>
<div id="top" class="top">
<ui:insert name="top">Top</ui:insert>
</div>
<div id="content" class="center_content">
<ui:insert name="content">Content</ui:insert>
</div>
</h:body>
- <ui:insert> 要素を変更して、デフォルトで生成される名前を「body」に変えます。
<div id="content" class="center_content">
<ui:insert name="body">Content</ui:insert>
</div>
- 変更を保存します。
index.xhtml および browse.xhtml の <ui:define name="body"> 要素内の内容は、テンプレートの <ui:insert name="body">Content</ui:insert> で指定された場所に挿入されます。
index.xhtml の変更
Web アプリケーションを作成すると、IDE が自動的にページの index.xhtml を生成します。この課題では、ページを変更して映画のタイトルのリストを表示するようにします。JSF ページは JSF 管理対象 Bean の FilmController のメソッドを呼び出し、映画のリストを取り出して、映画のタイトルと説明の表を表示します。
- 「プロジェクト」ウィンドウで「Web ページ」フォルダを展開し、index.xhtml をエディタで開きます。
新規プロジェクトウィザードで、次に示すデフォルトの index.xhtml を生成します。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
</h:body>
</html>
- ページを変更し、JSF <ui:composition> 要素および <ui:define> 要素を使用するようにして、<h:form> 要素を追加します。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition template="./template.xhtml">
<ui:define name="body">
<h:form>
</h:form>
</ui:define>
</ui:composition>
</html>
タグの入力を開始すると、IDE は xmlns:ui="http://java.sun.com/jsf/facelets" タグライブラリ宣言を追加します。
<ui:composition> 要素と <ui:define> 要素は、作成するページテンプレートと組み合わせて使用されます。<ui:composition> 要素は、このページによって使用されるテンプレートの場所を参照します。<ui:define> 要素は、含まれているコードが占有するテンプレート内での位置を参照します。
- JSF 管理対象 Bean で previous メソッドおよび next メソッドを呼び出す、次のナビゲーションリンクを追加します。
<ui:define name="body">
<h:form>
<h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/>
<h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/>
</h:form>
</ui:define>
- 取り出された項目を表示する表を生成する次の dataTable 要素 (ボールド部分) を追加します。
<h:form styleClass="jsfcrud_list_form">
<h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/>
<h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/>
<h:dataTable value="#{filmController.filmTitles}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
<h:column>
<f:facet name="header">
<h:outputText value="Title"/>
</f:facet>
<h:outputText value="#{item.title}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Description"/>
</f:facet>
<h:outputText value="#{item.description}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value=" "/>
</f:facet>
<h:commandLink action="#{filmController.prepareView}" value="View"/>
</h:column>
</h:dataTable>
<br/>
</h:form>
- 変更を保存します。
これで、索引ページにデータベース内の映画のタイトルリストが表示されます。表の各行に、管理対象 Bean の prepareView メソッドを呼び出す「View」リンクがあります。prepareView メソッドは「browse」を返し、browse.xhtml を開きます。
<f:facet> タグを入力すると、IDE は xmlns:f="http://java.sun.com/jsf/core タグライブラリ宣言を追加します。
browse.xhtml の作成
ここでは、選択した映画の詳細を表示する browse.xhtml ページを作成します。「Facelets テンプレートクライアント」ウィザードを使用すると、作成した JSF Facelets テンプレート template.xhtml に基づいて、ページを作成できます。
- 「プロジェクト」ウィンドウで「DVDStore」を右クリックし、「新規」>「その他」を選択します。
- 「JavaServer Faces」カテゴリで「Facelets テンプレートクライアント」を選択します。「次へ」をクリックします。

- 「ファイル名」に「browse」と入力します。
- 「参照」ボタンをクリックして「ファイルを参照」ダイアログを開き、ページのテンプレートを検索します。
- Web ページフォルダを展開し、template.xhtml を選択します。「ファイルを選択」をクリックします。

- 生成したルートタグに <ui:composition> を選択します。「完了」をクリックします。
「完了」をクリックすると、browse.xhtml ファイルがエディタで開き、次のコードが表示されます。
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml">
<ui:define name="top">
top
</ui:define>
<ui:define name="body">
body
</ui:define>
</ui:composition>
新しいファイルが template.xhtml ファイルを指定し、<ui:define> タグに name="body" プロパティーがあることが確認できます。
- <ui:define> タグの間に次のボールドのコードを追加してフォームを作成し、管理対象 Bean の FilmController でメソッドを呼び出して、データを取り出し、フォームを生成します。
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="top">
top
</ui:define>
<ui:define name="body">
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Title:"/>
<h:outputText value="#{filmController.selected.title}" title="Title"/>
<h:outputText value="Description"/>
<h:outputText value="#{filmController.selected.description}" title="Description"/>
<h:outputText value="Genre"/>
<h:outputText value="#{filmController.category}"/>
<h:outputText value="Cast"/>
<h:outputText value="#{filmController.actors}"/>
<h:outputText value="Film Length"/>
<h:outputText value="#{filmController.selected.length} min" title="Film Length"/>
<h:outputText value="Language"/>
<h:outputText value="#{filmController.language}" title="Film Length"/>
<h:outputText value="Release Year"/>
<h:outputText value="#{filmController.selected.releaseYear}" title="Release Year">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
<h:outputText value="Rental Duration"/>
<h:outputText value="#{filmController.selected.rentalDuration}" title="Rental DUration"/>
<h:outputText value="Rental Rate"/>
<h:outputText value="#{filmController.selected.rentalRate}" title="Rental Rate"/>
<h:outputText value="Replacement Cost"/>
<h:outputText value="#{filmController.selected.replacementCost}" title="Replacement Cost"/>
<h:outputText value="Rating"/>
<h:outputText value="#{filmController.selected.rating}" title="Rating"/>
<h:outputText value="Special Features"/>
<h:outputText value="#{filmController.selected.specialFeatures}" title="Special Features"/>
<h:outputText value="Last Update"/>
<h:outputText value="#{filmController.selected.lastUpdate}" title="Last Update">
<f:convertDateTime pattern="MM/dd/yyyy HH:mm:ss" />
</h:outputText>
</h:panelGrid>
<br/>
<br/>
<h:commandLink action="#{filmController.prepareList}" value="View All List"/>
<br/>
</h:form>
</ui:define>
</ui:composition>
</html>
browse.xhtml と index.xhtml が同じページテンプレートを使用していることが確認できます。
- 変更を保存します。
プロジェクトの実行
アプリケーションの基本はこれで完了です。ここでアプリケーションを実行し、すべてが正常に動作するかを確認します。
- メインツールバーの「主プロジェクトを実行」をクリックするか、「プロジェクト」ウィンドウで DVDStore アプリケーションノードを右クリックして「実行」を選択します。
変更したファイルがすべて保存され、アプリケーションが構築されて、サーバーに配備されます。IDE は、映画のリストを表示する URL http://localhost:8080/DVDStore/ で、ブラウザウィンドウを開きます。
- ブラウザで、「View」をクリックして browse.xhtml を読み込み、映画の詳細を表示します。
ソリューションプロジェクトのダウンロード
次の方法で、このチュートリアルにソリューションをプロジェクトとしてダウンロードできます。
- 完了したプロジェクトの ZIP アーカイブをダウンロードします。
- 次の手順を実行して、プロジェクトソースを NetBeans のサンプルからチェックアウトします。
- メインメニューから「チーム」>「Subversion」>「チェックアウト」を選択します。
- 「チェックアウト」ダイアログで次のリポジトリ URL を入力します。
https://svn.netbeans.org/svn/samples~samples-source-code
「次へ」をクリックします。
- 「参照」をクリックして「リポジトリフォルダを参照」ダイアログを開きます。
- ルートノードを展開し、samples/javaee/DVDStoreEE6 を選択します。「了解」をクリックします。
- ソースのローカルフォルダを指定します。ローカルフォルダは空である必要があります。
- 「完了」をクリックします。
「完了」をクリックすると、IDE はローカルフォルダを Subversion リポジトリとして初期化し、プロジェクトソースをチェックアウトします。
- チェックアウトが完了するときに表示されるダイアログで、「プロジェクトを開く」をクリックします。
注:
関連項目