目次


3 層からなるリッチな Web アプリを手早く作成する: 第 2 回 アプリケーション層を作成する

Rational Application Developer を使用して、複数の層からなる Java EE アプリケーションを迅速に作成し、IBM Bluemix にデプロイする

Comments

この全 3 回からなるチュートリアル・シリーズでは、IBM Rational Application Developer、JPA (Java Persistence API)、EJB (Enterprise JavaBean)、REST Web サービス、そしてリッチな Web 2.0 フロンドエンドを実現する Dojo Toolkit を使用して、多層 Web アプリケーションを一から作成する方法を紹介します。シリーズの終わりで完全に機能するようになる Web アプリケーションでは、表にデータが表示されて、ユーザーが任意のセルをダブルクリックすると、そのデータを編集することができます。

第 1 回では IBM Bluemix 上でデータベースを作成し、そのデータベースに Rational Application Developer から接続してサンプル・データを入力しました。この第 2 回では、ビジネス・ロジックを管理するための EJB (Enterprise Java Bean) とデータベースを操作するための JPA (Java Persistence API) エンティティーからなるアプリケーション層を作成します。次の第 3 回では、REST Web サービスを作成し、そのアプリケーションにリッチな Web 2.0 インターフェースを提供してから、そのアプリケーションを Bluemix にデプロイします。

JPA 層を作成する

最初のステップは、データベースを操作するための JPA を作成することです。

Liberty ランタイムを作成する

  1. Rational Application Developer で「Java EE」パースペクティブを開き、有効にするためのプロンプトが出されたすべての機能を有効にします。
  2. 「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択します。「Server (サーバー)」までスクロールダウンして、これを展開し、「Runtime Environments (ランタイム環境)」をクリックします。
  3. 「Add (追加)」をクリックして「WebSphere Application Server V8.5 Liberty Profile」を選択し、「Create a new local server (新規ローカル・サーバーの作成)」チェック・ボックスを選択します。 「WebSphere Application Server V8.5 Liberty Profile」が選択された状態の新規サーバー・ランタイム環境ウィザードのスクリーンショット
    「WebSphere Application Server V8.5 Liberty Profile」が選択された状態の新規サーバー・ランタイム環境ウィザードのスクリーンショット
  4. 「Next (次へ)」をクリックします。
  5. Liberty のインストール場所を指定するか、ダウンロードするためのリンクをクリックします。その後、「Finish (終了)」をクリックします。
  6. 「Preferences (設定)」ダイアログで「OK」をクリックします。

EJB プロジェクトを作成する

  1. 「File (ファイル)」 > 「New (新規)」 > 「EJB Project (EJB プロジェクト)」の順に選択します。
  2. 「Project name (プロジェクト名)」を「CustomerEJB」に変更します。「Target runtime (ターゲット・ランタイム)」フィールドに「WebSphere Application Server V8.5 Liberty Profile」ランタイムが選択されていることを確認してから、「EAR project name (EAR プロジェクト名)」を「CustomerEAR」に変更します。Liberty 上で実行する CustomerEJB プロジェクトを作成するためのウィザードのスクリーンショット
    Liberty 上で実行する CustomerEJB プロジェクトを作成するためのウィザードのスクリーンショット
  3. 「Configuration (構成)」セクションで「Modify (変更)」をクリックし、「JPA」「Context and dependency injection (CDI)」のチェック・ボックスにチェック・マークを付けてプロジェクト・ファセットとして追加します。CDI、EJB、Java、JPA が選択された状態の「Project Facet (プロジェクト・ファセット)」のスクリーンショット
    CDI、EJB、Java、JPA が選択された状態の「Project Facet (プロジェクト・ファセット)」のスクリーンショット
  4. 「OK」をクリックします。
  5. 「Next (次へ)」をクリックします。次に表示される「New EJB Project (新規 EJB プロジェクト)」でも「Next (次へ)」をクリックします。
  6. 「JPA Facet (JPA ファセット)」構成ページで、「Connection (接続)」のドロップダウン・リストから「SQLDB」を選択します。「JPA Facet (JPA ファセット)」構成ダイアログでデータベース接続を設定する画面のスクリーンショット
    「JPA Facet (JPA ファセット)」構成ダイアログでデータベース接続を設定する画面のスクリーンショット
  7. 「Next (次へ)」をクリックします。
  8. 「Create an EJB Client Jar (EJB クライアント JAR の作成)」チェック・ボックスからチェック・マークを外します。
  9. 「Finish (終了)」をクリックします。Java EE パースペクティブへ切り替えることを促されたら、受け入れて切り替えます (エラー通知は無視してください。これは、EJB をまだ作成していないために出されるエラーです。EJB を作成する作業は、以降のステップで行います)。

JPA エンティティーを作成する

次に、データベースにアクセスするための JPA コードと、データを照会および挿入するための JPA マネージャー Bean を作成します。

  1. Customer EJB プロジェクトを右クリックし、「JPA Tools (JPA ツール)」 > 「Configure JPA Entities… (JPA エンティティーの構成…)」の順に選択します。 「Configure JPA Entities… (JPA エンティティーの構成…)」ウィザードの最初のページのスクリーンショット
    「Configure JPA Entities… (JPA エンティティーの構成…)」ウィザードの最初のページのスクリーンショット
  2. 「Create New JPA Entities... (新規 JPA エンティティーの作成…)」ボタンをクリックします。
  3. 「Select Tables (表の選択)」ダイアログ・ボックスで、「SQLDB」接続を選択してから、カスタマー・スキーマ (第 1 回で設定した Bluemix SQL データベース・ユーザー名) を選択し、CUSTOMER テーブルを選択します。「Generate Custom Entities (カスタマー・エンティティーの生成)」ウィザードのスクリーンショット
    「Generate Custom Entities (カスタマー・エンティティーの生成)」ウィザードのスクリーンショット
  4. 「Next (次へ)」をクリックします。
  5. 「Table Associations (表の関連)」ページで、「Next (次へ)」をクリックします。
  6. 「Customize Defaults (デフォルトのカスタマイズ)」で、「Key generator (キー生成プログラム)」「none (なし)」に設定します。
  7. 「Next (次へ)」をクリックし、「Finish (終了)」をクリックします。
  8. 「Configure JPA Entities (JPA エンティティーの構成)」ダイアログ・ボックスで、「Available JPA Entities (使用可能な JPA エンティティー)」フィールドに CUSTOMER が表示されるまで待ちます。表示されたら、これを選択して「Next (次へ)」をクリックします。
  9. 「Tasks (タスク)」ページで、デフォルト・クエリーを追加します。「Customer (カスタマー)」エンティティーを選択し、タスク・リストから「Named Queries (名前付き照会)」を選択して、「Default (デフォルト)」ボタンをクリックします。この選択によって、一連のデフォルト・クエリーと、後で CUSTOMER データに対してクエリーを実行する際に使用する操作が追加されます。生成されるクエリーが表示された画面のスクリーンショット
    生成されるクエリーが表示された画面のスクリーンショット
  10. 「Finish (終了)」をクリックします。
  11. データベース接続を選択するよう促されたら、「SQLDB」を選択して「Finish (終了)」をクリックします。

ウィザードによって、データベース・テーブルに対してデータの読み取り/書き込みを行う Java クラスが作成されるので、コードを作成する必要も、JPA の構文とアノテーションを理解する必要もありません。クラスに変更を加える必要がある場合は、コードに変更を加えるか、このウィザードを再実行するかのいずれかを行います。また、一連のサンプル・コードをコピーできるため、クエリーを追加するのが遥かに簡単になります。

次の作業は、JPA マネージャー・クラスの追加です。JPA マネージャー・クラスは、クエリーを実行して、エンティティーを作成、更新、削除するための一連のヘルパー・メソッドを提供します。JPA エンティティーはテーブル内の行を表すもの、JPA マネージャー・クラスはテーブルを表すもの (したがって、テーブル・レベルの操作を提供するもの) と考えてください。

  1. プロジェクトを右クリックし、「JPA Tools (JPA ツール)」 > 「Add JPA Manager Beans (JPA マネージャー Bean の追加)」の順に選択します。先ほど作成した「Customer (カスタマー)」JPA エントリーを選択します。 「Customer (カスタマー)」が選択された状態の「JPA Manager Bean (JPA マネージャー Bean 生成)」ウィザードのスクリーンショット
    「Customer (カスタマー)」が選択された状態の「JPA Manager Bean (JPA マネージャー Bean 生成)」ウィザードのスクリーンショット
  2. 「Next (次へ)」をクリックし、「Finish (終了)」をクリックします。

ejbModule フォルダーを展開して、そこに新しく 2 つのフォルダーが含まれていること、そのそれぞれに生成されたクラス Customer (JPA エンティティー・クラス) と CustomerManager (JPACustomer コードとやりとりする一連のラッパー・メソッドを提供するクラス) が格納されていることを確認します。ここで少し時間を取って、両方のクラスのコードを調べてみます。

セッション EJB を作成する

これまでのステップでデータ・アクセス (JPA) 層を作成したので、次のステップでは、EJB セッション Bean を作成します。EJB セッション Bean を作成することにより、ビジネス・メソッドを提供して JPA コードとやりとりできるようにします.

このサンプルのアプリケーション・ロジックは単純なものになっていますが、一般に、EJB 層にはビジネス・ルールやあらゆる複雑な計算が実装されます。この層はまた、複数の UI でロジックを繰り返す必要がないように、すべてのロジックをまとめて保持する中心となる場所でもあります (例えば、アプリケーションで Web UI とモバイル UI の両方を使用する場合、この 2 つに共通のロジックをすべて EJB 層に実装します)。さらに、EJB はアプリケーション・データにアクセスする際のファサードも提供します。したがって、EJB に対する標準的なリクエストを行うと、EJB は多数の JPA クラスとやりとりすることになります。

セッション Bean を作成して構成する

  1. 「Enterprise Explorer (エンタープライズ・エクスプローラー)」で「CustomerEJB」プロジェクトを選択し、右クリックして「New (新規)」 > 「Session Bean (3.x) (セッション Bean (3.x))」の順に選択します。「Java package (Java パッケージ)」を「ejbs」に設定し、「Class name (クラス名)」を「CustomerEJB」に設定し、「Local (ローカル)」チェック・ボックスを選択します (名前はデフォルトのままにします)。 入力後の「Create EJB 3.x Session Bean (EJB 3.x セッション Bean の作成)」ウィザードのスクリーンショット
    入力後の「Create EJB 3.x Session Bean (EJB 3.x セッション Bean の作成)」ウィザードのスクリーンショット
  2. 「Finish (終了)」をクリックします。これにより、セッション Bean のコードが Java エディターに開きます。
  3. セッション Bean に CustomerManager クラスの変数を追加し、@Inject アノテーションを使用して、依存関係注入が必要な変数としてマークします。それには、カーソルをコンストラクターの直前に置いて以下のコードを追加します。
    @Inject
    private CustomerManager mgr;
    @Inject アノテーションにより、コンテナーが mgr 属性を注入するようになるため、CustomerManager インスタンスの作成方法について懸念する必要がなくなります。同様に、CustomerManager クラスの依存関係 (具体的には PersistenceUnit ― データベースを操作する際の力仕事の大部分を行うアプリケーション・サーバーによって管理されるクラス) も注入されます。
  4. コンパイル・エラーが発生したら、Ctrl-Shift-O を押して必要なインポートを追加します。
  5. コンストラクターの直後に以下のコードを続けて、2 つのメソッドをクラスに追加します。
    public List<Customer> getCustomers()
        {
        	return mgr.getCustomer();
        }
        
        public void updateCustomer(String id, String name,
        						   String address, String country)    
        {
        	try {
    			Customer cust = new Customer();
    
    			cust.setAddress(address);
    			cust.setCountry(country);
    			cust.setName(name);
    			cust.setCustno(Integer.parseInt(id));
    			
    			mgr.updateCustomer(cust);
    		} catch (NumberFormatException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        }
    getCustomers() はカスタマーのリストを取得するメソッド、updateCustomer() はカスタマーの更新をサポートするメソッドです。
  6. Ctrl-Shift-O をもう一度押します。
  7. コードを保存します。コンパイル・エラーが出された場合は、Ctrl-Shift-O を押してインポートを追加します。List をインポートするよう促されたら、java.util.List を選択し、ファイルを再び保存します。最終的なコードは以下のようになっているはずです。
    package ejbs;
    
    import java.util.List;
    
    import javax.ejb.Local;
    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.inject.Inject;
    
    import ejbs.view.CustomerEJBLocal;
    import entities.Customer;
    import entities.controller.CustomerManager;
    
    /**
     * Session Bean implementation class CustomerEJB
     */
    @Stateless
    @Local(CustomerEJBLocal.class)
    @LocalBean
    public class CustomerEJB implements CustomerEJBLocal {
    
        @Inject
        private CustomerManager mgr;
        /**
         * Default constructor. 
         */
        public CustomerEJB() {
            // TODO Auto-generated constructor stub
        }
        
        public List<Customer> getCustomers()
        {
            return mgr.getCustomer();
        }
        
        public void updateCustomer(String id, String name, String address, String country)    
        {
            try {
                Customer cust = new Customer();
                cust.setAddress(address);
                cust.setCountry(country);
                cust.setName(name);
                cust.setCustno(Integer.parseInt(id));
    			
                mgr.updateCustomer(cust);
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
        }
    }

メソッドをプロモートする

EJB には、アプリケーションの他のクラスから呼び出せるメソッドを定義するインターフェースがあります。第 3 回で作成する Web サービスから getCustomers() メソッドおよび updateCustomer() メソッドを呼び出せるようにするために、この 2 つのメソッドをインターフェースにプロモートする必要があります。

  1. エディターで開いている CustomerEJB.java を右クリックして、「Java EE Tools (Java EE ツール)」 > 「Promote methods (メソッドのプロモート)」の順に選択します。
  2. ダイアログ・ボックスで、getCustomers() メソッドと updateCustomer() メソッドのそれぞれに対応するチェック・ボックスを選択します。 両方のメソッドが選択された状態の「Promote Methods (メソッドのプロモート)」ダイアログ・ボックスのスクリーンショット
    両方のメソッドが選択された状態の「Promote Methods (メソッドのプロモート)」ダイアログ・ボックスのスクリーンショット
  3. 「OK」をクリックします。

Liberty サーバーを構成する

Web 層を作成してアプリケーションをテストするには、その前に、DB2 とやりとりするように Liberty サーバーをセットアップし、データベースへの JNDI (Java Naming and Directory Interface) 接続をセットアップする必要があります。

  1. プロジェクトをサーバーに追加するために、「Servers (サーバー)」ビューで WebSphere Liberty サーバーを右クリックし、「Add and Remove... (追加および削除…)」を選択します。これによって表示されるダイアログ・ボックスで、CustomerEAR ファイルをサーバーに追加し、「Finish (終了)」をクリックします。
  2. サーバー上にデータ・ソースを作成します。「Servers (サーバー)」ビューで、ローカルホストの WebSphere Application Server V8.5 Liberty Profile を展開し、「Server Configuration (サーバー構成)」をダブルクリックします。 「Server Configuration (サーバー構成)」エディターのスクリーンショット
    「Server Configuration (サーバー構成)」エディターのスクリーンショット
  3. 「Server Configuration (サーバー構成)」エディターの左側で、「Server Configuration (サーバー構成)」を選択してから「Add (追加)」をクリックし、「JDBC Driver (JDBC ドライバー)」を選択します。「ID」には「DB2」を指定します。 JDBC ドライバーが選択された状態の Liberty 構成画面のスクリーンショット
    JDBC ドライバーが選択された状態の Liberty 構成画面のスクリーンショット
  4. 「Shared library reference (共有ライブラリー参照)」の隣にある「Add (追加)」ボタンをクリックします。「Name (名前)」フィールドに「DB2library」と入力します。
  5. サーバーに対し、DB2 JDBC ライブラリーの場所を指示します。それには、左側で「Shared Library (共有ライブラリー)」を選択してから「Add (追加)」をクリックし、「Fileset (ファイルセット)」を選択します。「Base directory (ベース・ディレクトリー)」プロパティーに、JDBC ドライバー・ファイル (db2jcc4.jar) が格納されているフォルダーの場所を入力します (例えば、c:\ibm\sqllib\java)。 共有ライブラリー配下の「Fileset (ファイルセット)」を構成する画面のスクリーンショット
    共有ライブラリー配下の「Fileset (ファイルセット)」を構成する画面のスクリーンショット
  6. データ・ソースを追加するために、左側で「Server Configuration (サーバー構成)」を選択してから「Add (追加)」をクリックし、「Data Source (データ・ソース)」を選択します。
  7. 「ID」に「SQLDB」と設定し、「JNDI name (JNDI 名)」に「jdbc/SQLDB」と設定します。「JDBC driver reference (JDBC ドライバー参照)」フィールドには、リストから「DB2」を選択します。 】「Data Source (データ・ソース)」プロパティー・ダイアログ・ボックスのスクリーンショット
    】「Data Source (データ・ソース)」プロパティー・ダイアログ・ボックスのスクリーンショット
  8. データ・ソースに認証情報を追加します。左側で「Data Source (データ・ソース)」を選択してから「Add (追加)」をクリックし、「DB2 JCC Properties (DB2 JCC プロパティー)」を選択します。「Database name (データベース名)」として「SQLDB」と指定し、データベースにアクセスするためのホスト名、ユーザー名、パスワードを指定します。 データベース認証プロパティーの構成画面のクリーンショット
    データベース認証プロパティーの構成画面のクリーンショット
  9. server.xml ファイルを保存します。

次回の予告

これで、サーバーが構成された状態になり、EJB および JPA コードの作成が完了しました。次は第 3 回に進んで、REST Web サービスを作成し、その REST サービスを介してデータを表示、変更するための Dojo Web UI を作成します。ローカルでアプリケーションが実行されるようになったら、そのアプリケーションを IBM Bluemix にデプロイします。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Rational, Cloud computing, Java technology
ArticleID=1005517
ArticleTitle=3 層からなるリッチな Web アプリを手早く作成する: 第 2 回 アプリケーション層を作成する
publish-date=05142015