Java EE 5 プラットフォームと J2EE 1.4 プラットフォームの比較
このドキュメントでは、Java[tm] Platform Enterprise Edition 5 (「Java EE 5」) の開発プロセスと Java 2 Platform Enterprise Edition 1.4 (「J2EE 1.4」) の開発プロセスを比較し、Java EE 5 テクノロジによって Java アプリケーションの開発がどれだけ簡素化されたかを具体的に示します。 新しい開発モデルがどれだけ簡単になったかを比較するため、NetBeans IDE 5.5 を使用して、NetBeans IDE 5.0 クイックスタートガイド (J2EE アプリケーション) で作成したのと同じアプリケーションを作成します。
このドキュメントでは、データベースにアクセスする Web アプリケーションを作成します。 この Web アプリケーションでは、IDE を使用してデータベースからエンティティークラスを生成します。 そのあとに、情報を表示するためのサーブレットを作成します。
予想される所要時間: 15 分
前提条件
このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。
- Java プログラミング
- NetBeans IDE
このチュートリアルに必要なソフトウェア
このチュートリアルでは、コンピュータに次のソフトウェアをインストールしておく必要があります。
チュートリアルの課題
Application Server を使用するための IDE の設定
このチュートリアル用に、Sun Java System Application Server Platform Edition 9 のインスタンスを IDE に登録する必要があります。 この課題で、Sun Java System Application Server を IDE に登録します。
- メインメニューで「ツール」>「サーバーマネージャー」を選択します。
- 「サーバーを追加」をクリックします。 「Sun Java System Application Server」を選択し、インスタンスに名前を付けます。 「次へ」をクリックします。
- アプリケーションサーバーのインストールディレクトリ (例: C:\Sun\Appserver) を指定します。
- 「ローカルのデフォルトドメインを登録」ラジオボタンが選択された状態のままで、ドメインを選択します。
- 必要であれば、「次へ」をクリックして管理者のユーザー名とパスワードを入力します。 IDE のユーザーディレクトリにユーザー名とパスワードを保存しない場合は、各フィールドを空白のままにしておきます。 この情報が必要になるたび、IDE から入力を求められます。
注: admin のデフォルトパスワードは adminadmin です。
- 「完了」をクリックします。 サーバーが登録され、「実行時」ウィンドウの「サーバー」ノードの下に表示されます。
まとめ
この課題では、Sun Java System Application Server を IDE に登録しました。
Web アプリケーションプロジェクトの設定
NetBeans IDE 5.0 クイックスタートでは、EJB モジュールおよび Web モジュールを持つ完全なエンタープライズアプリケーションを作成しました。 これを行なったのは、J2EE 1.4 プラットフォームの開発では、エンティティー Bean およびセッション Bean を EJB モジュールに置く必要があったからです。 Web モジュールからエンティティー Bean にアクセスするには、ルックアップコードを追加する必要がありました。
Java EE 5 プラットフォームでのこの開発例では、EJB モジュールやセッション Bean が必要ないため、完全なエンタープライズアプリケーションは必要ありません。 代わりに、簡単な Web アプリケーションを作成し、その Web アプリケーション内に直接エンティティークラスを置くことができます。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。 「Web」カテゴリから「Web アプリケーション」を選択します。
- このプロジェクトを「CustomerBook」と名付け、サーバーを「Sun Java System Application Server」に、「Java EE バージョン」を「Java EE 5」にそれぞれ設定して、「完了」をクリックします。
まとめ
この課題では、エンティティークラスを含める Java EE 5 Web アプリケーションを作成しました。
Web アプリケーションのコーディング
Java EE 5 プラットフォームでの Web アプリケーションのコーディングは、J2EE 1.4 プラットフォームよりもすばやく、容易です。 それでも、データベースへの接続の確立のような基本的な設定をいくつか行う必要があります。しかし、いったん接続プールとデータソースが作成されると、開発ははるかに容易になります。Java EE 5 プラットフォームの開発では、作業の多くをコンテナが行うためです。
コンテナが持続性を管理しているため、CMP マッピングの設定や検索メソッドの指定のために配備記述子を編集する必要はありません。 事実、この例では、配備記述子は一切必要ありません。 Java EE 5 プラットフォームでは、持続性は EJB コンポーネントに限定されません。 Java EE 5 に導入されている Java Persistence API は、Web アプリケーションなど、EJB 以外のコンポーネントでも使用できます。
また、Java EE 5 テクノロジでは、J2EE 1.4 開発で求められた多数のボイラープレートコードも必要ありません。 EJB 開発は効率化されているため、必要なインタフェースが減って、検索は単純になり、注釈によってコンポーネント定義とリソースインジェクションが単純で明確になっています。
持続性の管理
NetBeans IDE 5.0 クイックスタートでは、持続性とオブジェクトリレーショナルマッピングを管理するために、CMP エンティティー Bean を作成し、ejb-jar.xml で配備記述子を定義しました。 Java EE 5 プラットフォーム開発では、持続性の管理のために、配備記述子を使用してコンテナに情報提供する必要はありません。 必要な作業は、持続性ユニットの作成と、使用するデータソースとエンティティーマネージャーの指定だけです。エンティティーと持続性の管理作業は、コンテナに任せます。 コンテナは、実行時にエンティティー Bean を検出します。
持続性ユニットは、persistence.xml で定義することによって作成します。 プロジェクトまたはモジュールに persistence.xml が存在しない場合、作成する必要があります。 持続性ユニットは、「新規持続性ユニット」ウィザードを使用してプロジェクトに追加できます。このウィザードは、persistence.xml の作成および持続性ユニットのプロパティーの定義に役立ちます。 注: 「新規エンティティークラス」ウィザードで持続性ユニットを作成することもできます。 エンティティークラス作成時に持続性ユニットが存在しない場合は、ウィザードからその作成を求められます。
- 「新規ファイル」(Ctrl-N) を選択し、「新規ファイル」ウィザードを開きます。
- 「持続性」カテゴリから「持続性ユニット」を選択し、「次へ」をクリックします。
- ウィザードが提案する持続性ユニットのデフォルト名のままにしておきます。
- 「持続性プロバイダ」ドロップダウンリストに含まれる TopLink (デフォルト) を使用します。
デフォルトのプロバイダは TopLink Essential.jar です。 TopLink Essential.jar には Java Persistence 用のライブラリが含まれています。 エンティティーマネージャーは TopLink Essential.jar に置かれています。
- 「データソース」ドロップダウンリストに含まれるデフォルトの jdbc/sample データソースを使用します。
デフォルトのデータソース jdbc/sample は、Sun Java System Application Server にバンドルされている Java DB データベースへの接続に使用されます。
- 「完了」をクリックします。
「完了」をクリックすると、プロジェクトのための persistence.xml が作成され、ソースエディタに表示されます。 ソースエディタのツールバーにある「XML」をクリックすると、persistence.xml の XML 表示を確認できます。 このファイルには、アプリケーションのエンティティーおよび持続性を管理するために Java EE 5 コンテナが必要とする情報がすべて含まれています。
エンティティークラスの作成
J2EE 1.4 プラットフォームで開発を行うときは、アプリケーションが単純な Web アプリケーションであっても、作成したエンティティー Bean を EJB モジュールに配置していました。 各エンティティー Bean は複数のインタフェースを必要とし、ejb-jar.xml で配備記述子を設定して、エンティティー Bean、インタフェース、各エンティティー Bean の持続性および検索クエリーを定義する必要がありました。
Java EE 5 では、エンティティー Bean を作成して EJB モジュールに配置する代わりに、簡単なエンティティークラスを使用でき、そのエンティティークラスは Java EE 5 アプリケーションのどこにでも配置できます。 また、Java EE 5 アプリケーションのクラス作成も、注釈を使用してコンポーネントの定義やリソースの注入ができるため、J2EE 1.4 プラットフォームよりも容易です。
ここでは、「データベース」ウィザードの「エンティティークラス」を使用して、リレーショナルデータベースに基づいたエンティティークラスを作成します。
- メインメニューから「ツール」>「Java DB データベース」>「Java DB サーバーを起動」を選択して、Java DB データベースを起動します。
- 「新規ファイル」(Ctrl-N) を選択し、「新規ファイル」ウィザードを開きます。 「持続性」カテゴリの「データベース」から「エンティティークラス」を選択し、「次へ」をクリックします。
- 「データベース」ウィザードの「エンティティークラス」で、「データソース」ドロップダウンリストからデータベースのための jdbc/sample データソースを選択し、必要に応じてパスワードを指定します (パスワードは「app」と指定)。 データソースを選択すると、「利用可能な表」区画に利用可能な表の一覧が表示されます。
- 「利用可能な表」から CUSTOMER 表を選択し、「追加」をクリックします。
「追加」をクリックすると、選択した表に関連する表もすべて追加されます。 この例では、DISCOUNT_CODE 表も追加されます。 DISCOUNT_CODE 表は、CUSTOMER 表によって参照されており、そのエンティティークラスは Customer エンティティークラスを生成する目的で生成される必要があるので、灰色表示になっています。 灰色表示になっている表と選択した表との関係は、「選択された表」区画にある表の名前の上にマウスを置くと確認できます。
- 「次へ」をクリックします。
このウィザードによって、選択した表とそれに関連する表が表示されます。 また、選択した表に基づいて作成されるエンティティークラスもウィザードによって表示されます。 生成するクラスの名前を変更する場合、「クラス名」フィールドに名前を入力できます。
- 生成されたクラスのパッケージとして ejb を指定し、「完了」をクリックします。

「完了」をクリックすると、IDE によって CUSTOMER 表とそれに関連する表に対して、エンティティークラスが生成されます。 「プロジェクト」ウィンドウで ejb ソースパッケージを展開すると、Web アプリケーションプロジェクトの ejb パッケージ内に、Java クラス Customer.java および DiscountCode.java が作成されたのが確認できます。
IDE によってデータベース表のそれぞれに 1 つずつ、つまり 2 つのクラスだけが作成されたことがわかります。 NetBeans IDE 5.0 クイックスタートガイド (J2EE アプリケーション) では、「データベースからの CMP エンティティー Bean」を使用すると、それぞれの表につき 4 つのクラスが作成されました。
ソースエディタで Customer.java を見ると、このクラスをエンティティークラスとして宣言するために @Entity という注釈が使用されています。 ほかの注釈は、エンティティークラスとそのプロパティーがマップされるデータベース表および列などの、追加情報を提供します。
また、エンティティー Bean に一般的に見られるボイラープレートコードの多くが消えています。 Java EE 5 のエンティティークラスでは、ejbRemove、setMessage、setSessionContext、ejbActivate、および ejbPassivate のようなメソッドは必要ないためです。
サーブレットのコーディング
次に、Web アプリケーションにサーブレットを追加する必要があります。 Java EE 5 では、サーブレットに対するリソース作成およびルックアップコードを追加する代わりに、リソースインジェクションを使用してこの作業をコンテナに移すことができます。 注釈を使用するとサーブレットに直接リソースを注入でき、必要なリソースの作成と検索はコンテナによって管理されます。 ここでは、持続性ユニットで指定されたエンティティーマネージャーを使用します。
- 「プロジェクト」ウィンドウでプロジェクトのノードを右クリックし、「新規」>「サーブレット」を選択します。
- 「新規サーブレット」ウィザードで、サーブレットに CustomerDetails という名前を付け、web という名前のパッケージに追加します。 「完了」をクリックします。 「完了」をクリックすると、ソースエディタに CustomerDetails.java が表示されます。
- ソースエディタで CustomerDetails.java を右クリックし、「持続性」>「エンティティーマネージャーを使用」を選択して、このクラスに「持続性コンテキスト」を注入します。 IDE によって、サーブレットが使用する持続性ユニットを指定する次の注釈が追加されます。 注釈は、クラス宣言の上に追加されます。
@PersistenceContext(name = "persistence/LogicalName", unitName = "CustomerBookPU")
また、IDE によって、トランザクションの境界を管理するためのリソースを注入する次の注釈も追加されます。
@Resource
private UserTransaction utx;
IDE によって次のデフォルトコードがサーブレットに追加されます。
public void persist(Object object) {
try {
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");
utx.begin();
// TODO:
// em.persist(object); utx.commit();
} catch(Exception e){
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
throw new RuntimeException(e);
}
}
このコードは、@PersistenceContext によって定義された持続性ユニットと、エンティティーマネージャーのインスタンスを検索します。
- CustomerDetails.java で、前述の生成済みルックアップコードがエンティティーオブジェクトを参照するように変更します。 完了後、変更したコードは次のようになります (太字で表示されたコードが変更された行)。
public Customer findByID(Integer customerNr) {
Customer customer = null;
try {
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName");
utx.begin();
customer = em.find(Customer.class, customerNr);
utx.commit();
} catch(Exception e){
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e);
throw new RuntimeException(e);
}
return customer;
}
- processRequest メソッド内のコードのコメントを解除し、次の太字で表示されたコードを追加します。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet CustomerDetails</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Search Customer Information</h1>");
String customerNr = request.getParameter("customer_nr");
if((customerNr != null) && !(customerNr.equals("")))
Customer customer = findByID(new Integer(customerNr));
if(customer != null){
out.println("Customer's info for nr. " + customerNr + ": " +customer.getEmail();
} else {
out.println("Customer not found.");
}
}
out.println("<form>");
out.println("Customer number: <input type='text' name='customer_nr' />");
out.println("<input type=submit value=Select />");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
- Alt-Shift-F キーを押して、足りないインポート文を生成します。
プロジェクトの実行
- 「プロジェクト」ウィンドウで CustomerBook プロジェクトノードを右クリックし、「プロパティー」を選択します。 「プロジェクトプロパティー」ダイアログの「実行」パネルで、「相対 URL」フィールドに「/CustomerDetails」と入力し、「了解」をクリックします。
- プロジェクトノードを右クリックし、「プロジェクトを実行」を選択します。 IDE によってアプリケーションサーバーが起動され、プロジェクトの構築が行われ、ブラウザに CustomerDetails ページが表示されます。
- 顧客番号のフィールドに ID 番号 (たとえば「1」) を入力し、「送信」をクリックします。 その ID 番号を持つ顧客の名前がサーブレットに表示されます。
まとめ
この課題では、Java EE 5 テクノロジを使用して CustomerBook アプリケーションを構築しました。 そのあとで、プロジェクトの配備と Web アプリケーションのテストを行いました。
次の手順
NetBeans IDE 5.5 を使用して Java EE アプリケーションを開発する方法については、次のリソースを参照してください。
nbj2ee メーリングリストに登録することによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。