Visual Web JSF アプリケーションでの Hibernate の使用
このチュートリアルでは、NetBeans IDE を使用してデータをデータベースから表示する Web アプリケーションを作成して配備します。この Web アプリケーションでは、Java オブジェクトをリレーショナルデータベースで持続させるための持続性レイヤーとして、Hibernate フレームワークを使用します。
Hibernate は、ORM (object relational mapping) のためのツールを提供するフレームワークです。このチュートリアルでは、Hibernate フレームワークのサポートを IDE に追加し、Hibernate を使用して POJO (プレーンオールド Java オブジェクト) を持続させるために必要な Hibernate ファイルを作成する方法をデモします。Hibernate の使用方法の詳細については、hibernate.org にある Hibernate のドキュメントを参照してください。
Java オブジェクトを作成し、Hibernate を使用するようにアプリケーションを構成したあとは、データを表示するための Web ページに Visual Web JSF コンポーネントを追加します。Visual Web JSF コンポーネントの使用方法に習熟するには、『Visual Web JSF アプリケーションの開発について』を読むことをお勧めします。
目次
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
| NetBeans IDE |
Web および Java EE の version 6.1 |
| Java Development Kit (JDK) |
Version 6 または
version 5 |
JavaServer Faces コンポーネント /
Java EE プラットフォーム |
1.2 と Java EE 5* または
1.1 と J2EE 1.4
|
| GlassFish アプリケーションサーバー |
V2 |
| Hibernate プラグイン |
NetBeans アップデートセンターで入手可能 |
| Travel データベース |
必須 |
IDE への Hibernate サポートの追加
Hibernate サポートを IDE に統合するには、NetBeans Beta アップデートセンターから入手できる Hibernate プラグインをインストールする必要があります。Beta アップデートセンターには、Hibernate の 2 つのプラグインがあります。
- メインメニューから「ツール」>「プラグイン」を選択します。
- 「使用可能なプラグイン」タブで次のプラグインを選択し、「インストール」をクリックします。
- Hibernate Support
- Hibernate 3.2.5 Library
- ウィザードの手順を実行し、プラグインをインストールします。
Hibernate プラグインをインストールすることで、Hibernate ファイルを作成して Hibernate ライブラリをプロジェクトに追加するためのサポートを追加できます。
Web アプリケーションプロジェクトの作成
この課題では、Visual Web JSF プロジェクトを作成し、Hibernate ライブラリをそのプロジェクトに追加します。プロジェクトの作成時、Visual Web JSF と Hibernate を「新規プロジェクト」ウィザードの「フレームワーク」パネルから選択します。また、データベースも指定します。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「Web」カテゴリから「Web アプリケーション」を選択し、「次へ」をクリックします。
- プロジェクト名として「HibernateTravelApp」を入力し、プロジェクトの場所を設定します。
- 専用フォルダを使用するオプションが選択されている場合は選択を解除します。
このチュートリアルでは、ライブラリをほかのユーザーと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
「次へ」をクリックします。
- サーバーを GlassFish に設定し、Java EE バージョンを Java EE 5 に設定します。「次へ」をクリックします。
- 「Visual Web JavaServer Faces」チェックボックスを選択します。
- 「Hibernate 3.2.5」チェックボックスを選択します。
- デフォルトのセッション名 (session1) を使用し、「Database Connection」と「Connection URL」に Travel データベースが選択されていることを確認します。「完了」をクリックします。
注: IDE にはサンプルの Travel データベースと、そのデータベースに対してあらかじめ構成された接続が付属しています。Travel データベースがウィザードの「フレームワーク」パネルのオプションとして使用できない場合、この接続が「サービス」ウィンドウの「データベース」ノードに一覧表示されているかどうかを確認します。ここに接続がない場合、データベース接続を作成する必要があります。
「完了」をクリックすると、IDE で Web アプリケーションプロジェクトが作成され、hibernate.cfg.xml ファイルと Page1 がエディタに表示されます。
「プロジェクト」ウィンドウの「ライブラリ」ノードを展開すると、IDE によって Hibernate ライブラリがそのプロジェクトに追加されたことが確認できます。
Hibernate 構成ファイルの変更
Hibernate フレームワークを使用する新規プロジェクトを作成する場合、IDE では hibernate.cfg.xml 構成ファイルがアプリケーションのコンテキストクラスパスのルート (「ファイル」ウィンドウの WEB-INF/クラス) に自動的に作成されます。このファイルは、「プロジェクト」ウィンドウの「構成ファイル」ノードの下に置かれます。構成ファイルには、データベース接続、リソースマッピング、およびそのほかの接続プロパティーに関する情報が格納されます。このファイルは、マルチビューエディタを使用して編集、または直接 XML エディタで XML を編集できます。
この課題では、hibernate.cfg.xml に指定されたデフォルトのプロパティーを編集し、SQL 文のデバッグログ記録を有効にし、Hibernate のセッションコンテキスト管理を有効にします。
- hibernate.cfg.xml がすでに開かれていない場合、「デザイン」タブで開きます。このファイルを開くには、「プロジェクト」ウィンドウでプロジェクトの「構成ファイル」ノードを展開し、hibernate.cfg.xml をダブルクリックします。
- 「Optional Properties」の下の「Configuration Properties」ノードを展開します。
- 「追加」をクリックして「Hibernate Property を追加」ダイアログを開きます。
- このダイアログで、「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.DerbyDialect</property>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/travel</property>
<property name="hibernate.connection.username">travel</property>
<property name="hibernate.connection.password">travel</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
- 変更内容をファイルに保存します。
Java オブジェクトの作成
このチュートリアルでは、Person と Trip という 2 つの POJO (プレーンオールド Java オブジェクト) を使用します。これらは Travel データベースの PERSON および TRIP の各表内のデータを表します。各クラスは、表内の列のフィールドを指定し、データを取得および書き込みするために単純な取得メソッドおよび設定メソッドを使用します。これらのクラスの作成後は、クラスを表にマッピングする必要があります。
Person Java クラスの作成
- 「プロジェクト」ウィンドウの「ソースパッケージ」ノードを右クリックし、「新規」>「Java クラス」を選択して「新規 Java クラス」ウィザードを開きます。
- このウィザードで、クラス名に「Person」と入力し、パッケージに「travel」と入力します。「完了」をクリックします。
- 次のボールドで示される変更をクラスに加え、シリアライザブルインタフェースを実装して表の列のフィールドを追加します。
public class Person implements Serializable {
private int personId;
private String name;
private String jobTitle;
private boolean frequentFlyer;
private java.util.Set trips;
}
- フィールドの取得メソッドおよび設定メソッドを生成します。この操作は、ソースエディタ内を右クリックし、「コードを挿入」(Alt-Insert) を選択し、「取得メソッド」および「設定メソッド」を選択することで行います。
- 「取得メソッドおよび設定メソッドの生成」ダイアログですべてのフィールドを選択し、「生成」をクリックします。
「取得メソッドおよび設定メソッドの生成」ダイアログで、キーボードの上矢印を使用して選択済みの項目を Person 項目に移動し、スペースキーを押して Person 内のすべてのフィールドを選択します。
- インポートを修正して変更内容を保存します。
Trip Java クラスの作成
- 「プロジェクト」ウィンドウの「ソースパッケージ」ノードを右クリックし、「新規」>「Java クラス」を選択して「新規 Java クラス」ウィザードを開きます。
- このウィザードで、クラス名に「Trip」と入力し、パッケージに「travel」と入力します。「完了」をクリックします。
- 次のボールドで示される変更をクラスに加え、Serializable インタフェースを実装して表の列のフィールドを追加します。
public class Trip implements Serializable {
private int tripId;
private int personId;
private Date depDate;
private String depCity;
private String destCity;
private int tripTypeId;
}
- フィールドの取得メソッドおよび設定メソッドを生成します。この操作は、ソースエディタ内を右クリックし、「コードを挿入」(Alt-Insert) を選択し、「取得メソッド」および「設定メソッド」を選択することで行います。
- 「取得メソッドおよび設定メソッドの生成」ダイアログですべてのフィールドを選択し、「生成」をクリックします。
- インポートを修正して変更内容を保存します。
Person.java および Trip.java ファイルは、このあとで再度編集する必要がないため閉じます。
データベース表へのクラスのマッピング
これで、表を表すクラスができました。次は、Hibernate マッピングファイルを使用し、各持続クラスをそれぞれの表にマップする必要があります。マッピングファイルは XML ファイルであり、これにはクラスのフィールドを表列と主キーへマッピングする方法を定義する ORM メタデータが格納されています。次に、各クラスの Hibernate マッピングファイルを作成します。
この節では、「新規ファイル」ウィザードを使用して簡単な .hbm.xml Hibernate マッピングファイルをクラスのそれぞれに対して作成します。作成後は、XML エディタでこのファイルを編集し、各クラス内のフィールドを対応する表の列にマップし、追加のプロパティーを設定する必要があります。IDE のコード補完機能を使用すると、マッピングファイルを編集するのに役立ちます。
PERSON 表への Person.java のマッピング
まず、Hibernate マッピングファイルである Person.hbm.xml を作成し、Person.java 内のフィールドを PERSON 表の列にマップします。
- JavaDB データベースサーバーが開始されていない場合は開始します。
- 「プロジェクト」ウィンドウで、「ソースパッケージ」ノードの「travel」ノードを右クリックし、ポップアップメニューの「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「カテゴリ」の一覧から「Hibernate」を選択し、「ファイルの種類」の一覧から「Hibernate Mapping File」を選択します。「次へ」をクリックします。
- ファイル名に「Person.hbm」と入力し、フォルダを「src/java/travel」に設定します。「次へ」をクリックします。
- 「Class to Map」に「travel.Person」を入力します。
注: または、参照ボタンをクリックし、「型を検索」ダイアログに「Person」と入力することもできます。
- 「Database Table」ドロップダウンリストから「PERSON」を選択します。
注: 「Database Table」ドロップダウンリストが空の場合、データベースが実行されていない可能性があります。表を指定せずに、ファイルの作成を続行することはできますが、表を XML に指定することを覚えておく必要があります。
- 「完了」をクリックします。
「完了」をクリックすると、IDE で Person.hbm.xml ファイルが Person.java と同じソースパッケージ内に作成され、このファイルがエディタで開きます。デフォルトでは、XML ファイルは次のようになります。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Person" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="PERSON"/>
</hibernate-mapping>
注: PERSON 表をファイルの作成時にドロップダウンリストから選択できなかった場合、class 要素に table="PERSON" を忘れずに追加してください。
- XML エディタで次のボールドの変更を加え、ID、プロパティー、および 1 対多関係をマップします。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
<id column="PERSONID" name="personId">
<generator class="increment"/>
</id>
<property column="NAME" name="name"/>
<property column="JOBTITLE" name="jobTitle"/>
<property column="FREQUENTFLYER" name="frequentFlyer"/>
<set cascade="all-delete-orphan" inverse="true" lazy="true" name="trips" table="TRIP">
<key column="PERSONID"/>
<one-to-many class="travel.Trip"/>
</set>
</class>
</hibernate-mapping>
XML エディタでコード補完を使用し、プロパティーと値の追加に役立てることができます。コード補完がこのスクリーンショットのように動作しない場合、次の「注」を参照してください。
注: デフォルトでは、class 要素には終了タグがあります。開始と終了の class 要素の間に、プロパティー要素を追加する必要があるため、次のボールドの変更を加えます。変更後、コード補完を class 要素の間で使用できます。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
</class>
</hibernate-mapping>
- XML を検査し、検査エラーがあれば修正してファイルを保存します。
TRIP 表への Trip.java のマッピング
次に、Hibernate マッピングファイルである Trip.hbm.xml を作成し、Trip.java 内のフィールドを TRIP 表の列にマップします。
- 「プロジェクト」ウィンドウで、「ソースパッケージ」ノードの「travel」ノードを右クリックし、ポップアップメニューの「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「カテゴリ」の一覧から「Hibernate」を選択し、「ファイルの種類」の一覧から「Hibernate Mapping File」を選択します。「次へ」をクリックします。
- ファイル名に「Trip.hbm」と入力し、フォルダを「src/java/travel」に設定します。「次へ」をクリックします。
- 「Class to Map」に「travel.Trip」を入力します。
注: または、参照ボタンをクリックし、「型を検索」ダイアログに「Trip」と入力することもできます。
- 「Database Table」ドロップダウンリストから「TRIP」を選択します。
注: 「Database Table」ドロップダウンリストが空の場合、ここを空欄のままにします。あとで XML エディタに表名を入力できます。
- 「完了」をクリックします。
「完了」をクリックすると、IDE で Trip.hbm.xml が Trip.java クラスと同じフォルダ内に作成され、このファイルがエディタで開きます。
- XML エディタで、次のボールドの変更を加えます。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Trip" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="TRIP">
<id column="TRIPID" name="tripId">
<generator class="increment"/>
</id>
<property column="PERSONID" name="personId"/>
<property column="DEPDATE" name="depDate" type="date"/>
<property column="DEPCITY" name="depCity"/>
<property column="DESTCITY" name="destCity"/>
<property column="TRIPTYPEID" name="tripTypeId"/>
</class>
</hibernate-mapping>
XML エディタでコード補完を使用し、プロパティーと値の追加に役立てることができます。
- XML を検査し、検査エラーがあれば修正してファイルを保存します。
Hibernate ヘルパークラスの作成
Hibernate を使用するには、Person オブジェクトおよび Trip オブジェクトを読み込んで格納できるように、起動を処理し、Hibernate の SessionFactory にアクセスして Session オブジェクトを取得する、ヘルパークラスを作成する必要があります。ヘルパークラスはまず Configuration() を呼び出し、hibernate.properties ファイルを読み込みます。次に、このクラスは configure() を呼び出し、hibernate.cfg.xml 構成ファイルを読み込みます。最後に、このヘルパークラスでセッションオブジェクトを取得するための SessionFactory が構築されます。
この節では、「新規ファイル」ウィザードを使用してヘルパークラスである HibernateUtil.java を作成します。
- 「travel」ソースパッケージノードを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「カテゴリ」の一覧から「Hibernate」を選択し、「ファイルの種類」の一覧から「HibernateUtil.java」を選択します。「次へ」をクリックします。
- クラス名に「HibernateUtil」と入力します。「完了」をクリックします。
「完了」をクリックすると、このクラスがソースエディタに表示されます。このファイルは、編集する必要がないため閉じて構いません。
これで、アプリケーションのためのすべてのクラスが用意できました。「プロジェクト」ウィンドウの「ソースパッケージ」ノードを展開する場合、表示されるプロジェクトは次のスクリーンショットのようになります。
Visual Web JSF ページの作成
クラスを作成したため、次はデータを表示して変更するための Web ページを作成できるようになりました。ここで、JSP フレームワークを使用する JSF ページとオブジェクトにバインドする Visual Web JSF コンポーネントを作成します。
ページへの Visual Web JSF コンポーネントの追加
- 「プロジェクト」ウィンドウの「Web ページ」フォルダを展開し、「Page1.jsp」をビジュアルデザイナで開きます。
- パレットの「Woodstock 基本」コンポーネントセットから「ドロップダウンリスト」コンポーネントをドラッグし、Page1 の左上隅にドロップします。
- 「ドロップダウンリスト」コンポーネントを右クリックし、ポップアップメニューから「変更時に自動送信」を選択します。
この操作によって、ユーザーがドロップダウンリストから新しい値を選択すると、常にブラウザでページが送信されます。
- 「ドロップダウンリスト」コンポーネントを再度右クリックし、「バインド属性を追加」を選択します。
注: このチュートリアルのあとの手順で、プロパティーのバインドを指定します。NetBeans IDE 6.1 には、要求時バインド機能があります。コンポーネントに Java コーディングが必要な場合、Visual Web JSF アプリケーションのコンポーネントに手動でバインド属性を追加する必要があります。バインド属性を追加するには、各コンポーネントを右クリックし、「バインド属性を追加」を選択します。詳細は、「On-demand Binding Attribute Wiki」を参照してください。
- 「表」コンポーネントをドラッグし、「ドロップダウンリスト」コンポーネントの下にドロップします。
- 「メッセージグループ」コンポーネントをドラッグし、「表」コンポーネントの下にドロップします。
「メッセージグループ」コンポーネントは、実行時の問題の診断に役立ちます。デフォルトで、「メッセージグループ」コンポーネントでは実行時エラー、検査エラー、および変換エラーに関するメッセージが表示されます。
- 変更を保存します。
これで、Web ページに必要なコンポーネントが揃いました。このあとは、コンポーネントをデータソースにバインドする必要があります。
データソースへの SessionBean1 からのアクセス
ここで、データソースにアクセスするように SessionBean1 を編集する必要があります。この課題では、「プロパティーを追加」ダイアログを使用して SessionBean1 内にフィールドを指定し、それらのフィールドの取得メソッドと設定メソッドを生成します。セッション Bean でセッションコンテキストが開き、データが Java オブジェクトを介して取得されます。
- 「hibernatetravelapp」ソースパッケージを「プロジェクト」ウィンドウで展開し、「SessionBean1.java」をダブルクリックしてこのファイルをエディタで開きます。
- カーソルをソースコード内の空のスペース (たとえば、コンストラクタの直後など) に置き、「コードを挿入」>「プロパティーを追加」(Ctrl-I) を右クリックして選択し、「プロパティーを追加」ダイアログを開きます。
- 「プロパティーを追加」ダイアログで、「名前」に「personOptions」と入力し、「型」に「Option[]」と入力し、「private」を選択します。
- 「取得メソッドおよび設定メソッドの生成」が選択解除されている場合、選択します。「了解」をクリックします。
- 上記の手順を繰り返して次のプロパティーを追加します。
| selectedPersonId |
Integer |
| trips4Person |
Trip[] |

- 次のボールドのコードを getApplicationBean1 メソッドの下の SessionBean1 に追加することで、buildPersonOptions および updateTrips4Person メソッドをクラスに追加します。
protected ApplicationBean1 getApplicationBean1() {
return (ApplicationBean1) getBean("ApplicationBean1");
}
private void buildPersonOptions() {
List<Person> personList = null;
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Person");
personList = (List<Person>) q.list();
} catch(Exception e) {
e.printStackTrace();
}
personOptions = new Option[personList.size()];
int i=0;
for(Person person : personList) {
Option opt = new Option(person.getPersonId(), person.getName());
personOptions[i++] = opt;
}
}
private void updateTrips4Person() {
if(selectedPersonId == null ) {
trips4Person = new Trip[1];
trips4Person[0] = new Trip();
return;
}
Set personTrips = null;
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Person person = (Person)session.load(Person.class, selectedPersonId);
personTrips = (PersistentSet)person.getTrips();
} catch(Exception e) {
e.printStackTrace();
}
trips4Person = (Trip[]) personTrips.toArray(new Trip[0]);
}
buildPersonOptions メソッドによって Person データソース上のクエリーが呼び出され、結果が personOptions 配列に格納されます。updateTrips4Person メソッドで選択された人物の旅行の値が更新されます。
- インポートを修正します。
注: インポートに対して完全修飾名を選択する場合、「org.hibernate」ライブラリおよび「com.sun.webui.jsf.model.Option」と「java.util.Set」を選択するようにしてください。
- 次のボールドのコードを init() メソッドの最後に追加することで、buildPersonOptions メソッドを呼び出します。
@Override
public void init() {
super.init();
try {
_init();
} catch (Exception e) {
log("SessionBean1 Initialization Failure", e);
throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
}
// Fill in the personOptions[]
buildPersonOptions();
}
- 次のボールドのコードを setSelectedPersonId メソッドの最後に追加することで、updateTrips4Person メソッドを呼び出します。
public void setSelectedPersonId(Integer selectedPersonId) {
this.selectedPersonId = selectedPersonId;
updateTrips4Person();
}
- 変更を保存します。
- 「プロジェクト」ウィンドウでプロジェクトのノードを右クリックし、「構築」を選択します。
データへのコンポーネントのバインド
この節では、前の節で SessionBean1 に定義したプロパティーに、Web ページのドロップダウンリストコンポーネントおよび表コンポーネントをバインドします。
- ビジュアルデザイナで Page1.jsp を開きます。
- 「ドロップダウンリスト」コンポーネントを右クリックし、「プロパティーのバインド」を選択して「プロパティーのバインド」ダイアログを開きます。
- バインド可能なプロパティーの一覧から「items」を選択し、バインド先の一覧から「personOptions」(SessionBean1 ノードの下) を選択します。「適用」をクリックします。
- 同じダイアログで、バインド可能なプロパティーの一覧から「selected」を選択し、バインドターゲット先の一覧から「selectedPersonId」(SessionBean1 ノードの下) を選択します。「適用」をクリックします。
- 「閉じる」をクリックしてダイアログを閉じます。
- ビジュアルデザイナで、表コンポーネント上をクリックし、「表レイアウト」を選択します。
- このダイアログで、「trips4Person (SessionBean1)」を「データの入手先」ドロップダウンリストから選択します。
注: 「trips4Person (SessionBean1)」がドロップダウンリストに表示されない場合、前の節の最後でプロジェクトの構築を忘れた可能性が高いです。
- 「personId」を「選択」の一覧から選択し、左矢印ボタンをクリックしてフィールドを「選択」の一覧から「使用可能」の一覧に移動します。
- 上矢印および下矢印ボタンを使用し、そのほかのフィールドを次に示す順番で配置し直し、「了解」をクリックします。
- 「編集」ツールバーで、「Java」をクリックし、「Page1.java」を Java エディタで開きます。
- prerender メソッドに次のボールドのコードを追加します。
public void prerender() {
try {
if (dropDown1.getSelected() == null ) {
Option firstPerson = getSessionBean1().getPersonOptions()[0];
getSessionBean1().setSelectedPersonId((Integer)firstPerson.getValue());
}
} catch (Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
}
prerender メソッドのコードは、Web ブラウザにページが表示される前に呼び出されます。prerender メソッドにコードを追加することで、ユーザーがページを最初に訪問したとき、ドロップダウンリストの最初の人物の情報がページに表示されます。
ブラウザで最初にページが要求されるとき、アプリケーションによって Page1 のインスタンスが作成され、prerender メソッドが呼び出されます。サーバーによって応答 (HTML ページ) が送信され、Page1 のインスタンスが破棄されます。アプリケーションでは、ページの送信時にのみ値変更イベントが生成されるので (この例では新しい名前が選択されたとき)、値変更イベントハンドラは呼び出されません。
- ソース内を右クリックし、「インポートを修正」をポップアップメニューから選択し、「インポートを修正」ダイアログを開きます。「完全修飾名」ドロップダウンリストで、次に示すように「com.sun.webui.jsf.model.Option」を選択します。
- 変更を保存します。
プロジェクトの実行
メインツールバーで「主プロジェクトを実行」をクリックします。
変更したファイルがすべて保存され、アプリケーションが再構築され、サーバーに配備されます。
- ドロップダウンリストから人物を選択し、表の内容が選択した人物のデータで更新される様子を確認します。
関連項目