Articles
日本オラクル株式会社
システム製品統括本部 Fusion Middleware技術部 SOA/Javaグループ
エンジニア 橋本 亨
2001年に社会人になってから、Javaアプリケーション開発、.NETアプリケーション開発を通じて様々なフレームワークやIDEを経験しました。
単調な開発プロジェクトから脱却したい貴方。Oracle JDeveloper上でエキサイティングなADFアプリケーションを開発してみませんか?
今回は単純なサンプル・アプリケーションをもとに、JDeveloperを使ったJSF/EJB3.0 アプリケーションの開発プロセスについて解説します。次回はさらに、今回作成するアプリケーションと同様のものを、ADFコンポーネント(ADF Faces、データ・バインディング、データ・コントロール)を使ってJDeveloperで宣言的に作成する手順をご紹介し、JSFアプリケーション開発において煩雑となるView層とModel層の連携部分がADFによって簡素化されることを説明します。
実際のサンプル・アプリケーション開発に入る前にOracle JDeveloper(以下、JDeveloper)の開発環境をざっと見ておきましょう。本連載では「Oracle JDeveloper 10.1.3.1 Studio Edition」の使用を前提としています。
以下の図は、JDeveloperで開発する際の画面全体を示しています。JDeveloperは複数のパネルから構成され、それぞれ提供する機能が異なります。以降で、各パネルの名称と機能について説明します。
[構造]ウィンドウは、Javaソース、XML、JSPページの構造を表示します。次の図はJSPの構造を表示している状態です。このウィンドウで、各種プロパティ設定、UIコンポーネントの追加/作成/削除、アクション・バインディング設定や属性バインディング設定を行います。
[コンポーネント・パレット]ウィンドウは、[エディタ]ウィンドウにUIコンポーネントをドラッグ&ドロップする際に利用します。JSF標準UIコンポーネントに加え、ADFのリッチUIコンポーネントを使うことができます。
[プロパティ・インスペクタ]ウィンドウは、UIコンポーネントのタグ属性を編集する際に利用します。
[接続ナビゲータ]ウィンドウは、データベースやアプリケーション・サーバーなどの接続設定を行う際に利用します。
それではJDeveloperを使用して、JSF/EJB3.0によるサンプル・アプリケーションを作成していきましょう。ここでは、Oracleデータベース付属のSCOTTスキーマに対してデータ操作を行うアプリケーションを作成します。これは、画面の[検索]ボタンをクリックするとEMP表のデータを一覧表示する機能をもつアプリケーションです。以下の図は、完成後のアプリケーションの実行画面です。
サンプル・アプリケーションは以下のような手順で作成していきます。
まず、JDeveloperとOracleデータベースとの接続を作成します。データベース接続はJDeveloperの[接続ナビゲータ]で[データベース]を右クリックし、コンテキストメニューから[データベース接続の作成]を選択して作成します。作成手順の詳細は省略しますが、[データベース接続の作成]ウィザードの各ステップでは次のように設定してください。
◆[データベース接続の作成]ウィザードの設定
| ステップ1/4: タイプ | |
|---|---|
| 接続名 | scott(すべて小文字) |
| 接続タイプ | Oracle(JDBC) |
| ステップ2/4: 認証 | |
| ユーザ名/パスワード | SCOTTスキーマへの接続に必要なユーザー名とパスワード |
| パスワードを配布 | チェックを入れる |
| ステップ3/4: 接続 | |
| データベースのホスト名などの接続情報 | 使用する環境に合わせて設定 |
データベース接続の作成が完了したら、次にアプリケーション作成用のプロジェクトを作成します。
まず、JDeveloperの[アプリケーション ナビゲータ]ウィンドウにおいて[アプリケーション]を右クリックし、[新規アプリケーション]を選択します。[アプリケーションの作成]ダイアログで下記のように入力して、[OK]ボタンをクリックします。
◆[アプリケーションの作成]ダイアログの設定
| アプリケーション名 | jsfsample |
| ディレクトリ | デフォルトのまま |
| アプリケーション・パッケージの接頭辞 | com.oracle.jsfsample |
| アプリケーション・テンプレート | Webアプリケーション[JSF、EJB] |
これでJSF用のWebモジュールを格納する[ViewController]プロジェクトと、EJB用の[Model]プロジェクトが作成されます。
次に、EMP表に対するエンティティをEJB3.0ベースで作成し、データ操作を行うメソッドを実装したクラス(本稿ではセッション・ファサードと呼ぶ)を作成していきます。 まず、[アプリケーション ナビゲータ]ウィンドウの[jsfsample]を展開し、[Model]を右クリックして[新規]を選択します。[新規ギャラリ]ダイアログの左部分のカテゴリで[EJB]を選択したあと、右側の項目で[表ベースのエンティティ(JPA/EJB3.0)]を選択して[OK]ボタンをクリックします。
[ステップ2/4: 表の選択]ダイアログでは、SCOTTスキーマを選択してから[問合せ]ボタンをクリックします。
ここではEMP表のみ選択(画面右部の選択済にEMP表が指定されている状態)して、[次へ]ボタンをクリックします。
ステップ3/4、4/4はエンティティ・クラスの詳細設定を行う画面となっています。ここではデフォルトのまま[次へ]ボタンをクリックします。
[エンティティの作成]ウィザードが終了したら、[アプリケーション ナビゲータ]ウィンドウ上で、自動生成されたクラス[Emp.java]をダブルクリックしてソースコードを確認します。
EMP表用のエンティティ・クラスを確認したら、次はこのエンティティに対するデータ操作クラス(セッション・ファサード・クラス)を作成します。 [アプリケーション ナビゲータ]ウィンドウの[Model]部分の[アプリケーション・ソース]を右クリックし、[新規]を選択します。[新規ギャラリ]ダイアログで、図15に示すように[カテゴリ]から[Business Tier]→[EJB]、[項目]からは[セッションBean(EJB 1.1/2.x/3.0)]を選択して[OK]ボタンをクリックします。これで[セッションBean作成]ウィザードが起動されます。
[セッションBean作成]ウィザードのステップ1/4は、EJB名やEJBのオプションを設定する画面です。ここではデフォルト設定のまま、[次へ]ボタンをクリックします。
ステップ2/4では、セッション・ファサードに自動生成するメソッドを選択します。ここではすべてのメソッドがチェックされているのを確認して、[次へ]ボタンをクリックします。
ステップ3/4ではBeanクラスの名前を指定します。ここでは、デフォルトのまま[次へ]ボタンをクリックします。
ステップ4/4でEJBのインタフェース名を指定します。ここでも、デフォルトのまま[次へ]ボタンをクリックして終了します。これでセッション・ファサードのソースが自動生成されます。
自動生成されたリモートやローカルのインタフェースは[アプリケーション ナビゲータ]ウィンドウに表示されていませんが、[構造]ウィンドウから参照することができます(セッションBeanを[アプリケーション ナビゲータ]ウィンドウで選択してから[構造]ウィンドウを表示)。
また、EJBでメソッドを追加する際にはインタフェースの修正が必要です。この修正は[構造]ウィンドウ内で、追加するメソッドのプロパティを編集することで自動的に行われます。
次のステップでは、自動生成されたセッション・ファサードの単体テストを行います。[アプリケーション ナビゲータ]ウィンドウで[SessionEJBBean]を右クリックし、[新規のサンプルJavaクライアント]を選択します。 [サンプルJavaクライアントの作成]ダイアログでは、デフォルトのままにして[OK]ボタンをクリックします。
[アプリケーション ナビゲータ]ウィンドウ上で自動生成された[SessionEJBClient.java]をダブルクリックし、[エディタ]ウィンドウで下記のようにmainメソッドを編集します。import部分にはjava.util.Listを追加しておきます。
ここではJDeveloperの[ログ]ウィンドウに、ENAME列の値のみを出力するようにしています。
public static void main(String [] args) {
try {public static void main(String [] args) {
try {
final Context context = getInitialContext();
SessionEJB sessionEJB = (SessionEJB)context.lookup("SessionEJB");
List<Emp> emplist = sessionEJB.queryEmpFindAll();
for(Emp emp: emplist) {
System.out.println("ename: " + emp.getEname());
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
編集したあと、アプリケーションのテストおよびデバッグ用途のためにJDeveloperに組み込まれたJ2EEコンテナである埋込みOC4J上で実行します。
まず初めに、[アプリケーション ナビゲータ]ウィンドウで[SessionEJBBean]を右クリックして[実行]を選択します。これでOC4Jが起動されて、EJBがOC4J上にデプロイされます。
サンプルクライアントの実行前に必ずこの手順を実行する必要があるので、注意してください。
コンソールのメッセージでデプロイが完了したことを確認してから、[SessionEJBClient.java]を右クリックして[実行]をクリックします。JDeveloper画面下部の[ログ]ウィンドウにメッセージが出力されます。
ename: SMITH
ename: ALLEN
(中略)
ename: MILLER
プロセスが終了コード0で終了しました。
EJB3.0エンティティの利用時に実行されたSQL文を取得するには、ModelプロジェクトのMETA-INFディレクトリ内のpersistence.xmlを次のように編集します。 これで、JDeveloperの[ログ]ウィンドウにデバッグ情報が出力されるようになります。
<?xml version="1.0" encoding="Shift_JIS" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="Model">
<properties>
<property name="toplink.logging.level" value="FINEST"/>
</properties>
</persistence-unit> </persistence>
次のステップでは、EMP表のデータを表示するJSPの画面を作成していきます。 JSPやサーブレットなどのWebモジュールは、[アプリケーション ナビゲータ]ウィンドウの[ViewController]より下の階層に作成します。
ここではアプリケーションの構成をModelとViewControllerの2つのプロジェクトに分けていますが、これは必須ではありません。EJBを使わずにPOJO(Plain Old Java Object:通常のJavaクラス)だけでアプリケーションを作成することがわかっている場合には、ViewControllerにすべてのアプリケーション階層を含めるようにしたほうが開発が容易になることもあります。
まず、先ほど作成したモデル用のプロジェクトとWeb層プロジェクトとの依存関係を設定します。
[アプリケーション ナビゲータ]ウィンドウで、[ViewController]を右クリックして[プロジェクト・プロパティ]を選択します。[プロジェクト・プロパティ]ウィンドウで、[依存性]を選択して「Model.jpr」にチェックを入れて[OK]ボタンをクリックします。これでViewController上のプロジェクトから、Modelプロジェクトのクラスが参照できるようになります。
次に[アプリケーション ナビゲータ]ウィンドウで、[ViewController]を展開して[faces-config.xml]をダブルクリックして開きます。 [エディタ]ウィンドウにfaces-config.xmlのダイアグラムが開かれている状態で、[コンポーネント・パレット]ウィンドウから[JSF Page]をドラッグ&ドロップします。ドラッグ&ドロップ直後にJSFのファイル名が編集できるようになるので、ファイル名を「/jsf/emplist.jsp」に設定してください(あとからファイル名を編集することも可能です)。
次に[JSPの作成]ウィザードを使って、実際のJSPファイルを作成していきます。 [faces-config.xml]上の[/jsf/emplist.jsp]をダブルクリックします。[JSF JSPの作成]ウィザードのステップ1/4では、そのまま[次へ]ボタンをクリックします。
ステップ2/4では、[新規マネージドBeanでのUIコンポーネントの自動公開]にチェックを入れます。その他の項目はデフォルトのままでかまいません。
ステップ3/4では、[選択済のライブラリ]にJSF Core 1.0とJSF HTML 1.0があることを確認して、[次へ]ボタンをクリックします。その後のステップはすべてデフォルト設定にします。これで、JSPの雛型が自動生成されます。
次のステップから、画面のUIコンポーネントとイベント処理を画面に追加していきます。 初めに、画面上に検索用ボタンを配置します。[エディタ]ウィンドウでemplist.jspを開き、画面右部の[コンポーネント・パレット]ウィンドウで、[JSF HTML]を選択してから[Command Button]をドラッグ&ドロップします。
次に、コマンドボタンの表示文字列とManaged Beanで利用するIDを変更します。 エディタ上でコマンドボタンを選択し、画面右側の[プロパティ・インスペクタ]ウィンドウで[Value]と[Id項目]にそれぞれ、「EMP表を表示」と「showemplist」を入力します。このようにIdを変更した場合には、JDeveloperが自動的にManaged Beanのプロパティを変更します。
次に、コマンドボタンにバインドするアクションを設定します。[エディタ]ウィンドウで、[EMP表を表示]をダブルクリックします。ここでは、デフォルトのまま[OK]ボタンをクリックします。
Managed Beanにshowemplist_actionメソッドが追加されるので、[エディタ]ウィンドウで次のようにBeanを編集します。
この変更により、画面のコマンドボタンをクリックするだけでEmpエンティティのリストを取得できるようになります。
/* 以下のインポートを追加 */
import com.oracle.jsfsample.model.SessionEJB;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Emplist {
private HtmlForm form1;
private HtmlCommandButton showemplist;
private List emplist;
public String showemplist_action() {
try {
Context context = new InitialContext();
SessionEJB sessionEJB = (SessionEJB)context.lookup("SessionEJB");
setEmplist(sessionEJB.queryEmpFindAll());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public void setEmplist(List emplist) {
this.emplist = emplist;
}
public List getEmplist() {
return emplist;
}
}
※ デフォルトで作成されているコードは省略しています
次に、取得したEmpエンティティのリストを表形式で画面にバインドする設定を行います。
emplist.jspを[エディタ]ウィンドウで開き、[JSF HTML]の[コンポーネント・パレット]ウィンドウから、[Data Table]をページにドラッグ&ドロップします。
バインディングの設定画面が表示されたら、[データ表をすぐにバインド]にチェックを入れて[次へ]ボタンをクリックします。
データ表のバインド画面では、次のように設定を行います。
◆[データ表のバインド]ダイアログの設定
| 値 | #{backing_jsf_emplist.emplist} |
| クラス | com.oracle.jsfsample.model.Emp |
| Var | row |
[値]の項目は、入力フィールドの右にある[バインド]ボタンをクリックして表示される[Expression Builder](式ビルダー)ダイアログを使用して設定することもできます。[Expression Builder]の左側に表示されるツリーから、[JSFマネージドBean]→[backing_jsf_emplist]→[emplist]と選択し、[>]ボタンをクリックすることでEL(Expression Language)式を入力できます。終了したら[OK]ボタンをクリックします。
[ヘッダーおよび行データ]ダイアログでは、必要に応じてテーブルのヘッダーや表示列に関して設定を行うことができます。ここでは、デフォルトのまま[次へ]ボタンをクリックします。
以上で画面の設定が完了しました。 次に、画面とサーバー側の処理が連動できているかどうかを確認します。
JSPのテスト実行は、[エディタ]ウィンドウで右クリックして[実行]を選択するか、
[アプリケーションナビゲータ]ウィンドウで実行したいJSPを右クリックして[実行]を選択します。
dataTableタグのスタイルやrenderedプロパティなどに関する設定は、JDeveloperの[構造]ウィンドウで[dataTable]を選択した状態で、[プロパティ・インスペクタ]ウィンドウから設定することができます。[構造]ウィンドウはデフォルトで表示されていますが、いったん閉じてしまった場合はJDeveloperのメニューから[表示]?[構造]を選択して表示することができます。
今回はView層とController層にはJSFを、Model層にはEJBを使用してMVCパターンに沿ったサンプル・アプリケーションを作成しました。ここまでの手順からもわかるように、JSFを使用したアプリケーション開発ではおもに、次に示すような開発作業を行う必要があります。
しかし、実際のアプリケーション開発においては、JSFが標準で提供しているUIコンポーネント以上の機能をもつ画面が必要となるケースや、EJB以外のビジネス・サービス(単純なJavaクラスやWebサービスなど)を使用するケースも十分に考えられます。通常そのような場合には、開発プロジェクトにおいて独自にJSFの拡張コンポーネントを作成したり、多種のビジネス・サービス呼出しのために個別の呼出しロジックを実装したりする必要があります。 Oracle ADFではそのようなケースに対応するため、JSFの拡張機能を使用して実装された高機能UIコンポーネント(ADF Faces)、およびさまざまなビジネス・サービスに対して同一の呼出し手法を提供し、さらに画面UIとビジネス・サービス呼出しを連携させるためのADF DataControl/Bindingを提供します。 次回は、Oracle ADFを用いたサンプル・アプリケーション開発の手順を通じてこれらの機能の一端を見ていただきます。