EJB 3.1 を使用したエンタープライズアプリケーションの作成
このチュートリアルでは、Java EE 6 エンタープライズアプリケーションの開発方法の基本事項を説明し、Java EE 6 仕様の一部として導入された一部の EJB 3.1 テクノロジの機能のデモを示します。このチュートリアルでは、ユーザーがデータベースに対してメッセージの投稿や取得を行えるエンタープライズアプリケーションを作成します。
このアプリケーションには、EJB モジュールと Web モジュールが含まれます。EJB モジュールには、エンティティークラス、エンティティークラス用のセッションファサード、およびメッセージ駆動型 Bean が含まれます。Web モジュールには、メッセージを表示および投稿するためのサーブレットと、セッション内のユーザー数をカウントするシングルトンセッション Bean が含まれます。
このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。
チュートリアルの課題
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
前提条件
このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。
- Java プログラミング
- NetBeans IDE
完了したプロジェクトの ZIP アーカイブはダウンロードできます。
NewsApp エンタープライズアプリケーションについて
このチュートリアルでは、NewsApp という名前の、単純な多層構造の Java EE 6 エンタープライズアプリケーションを作成します。NewsApp アプリケーションでは、Java EE 6 仕様で導入された機能の一部が使用されます。
NewsApp アプリケーションの構造は、一般的に次の層に対応しています。
- Web 層。Web 層にはアプリケーションのプレゼンテーションロジックが含まれており、Java EE サーバーで実行されます。NewsApp アプリケーションでは、Web 層は Web モジュールで表現され、EJB モジュールのビジネスロジックにアクセスするサーブレットが含まれます。
- ビジネス層。ビジネス層のアプリケーションも Java EE サーバーで実行され、アプリケーションのビジネスロジックが含まれます。NewsApp アプリケーションでは、ビジネス層は EJB モジュールで表現されます。EJB モジュールには、Web 層クライアントからの要求を処理し、トランザクションおよびオブジェクトがデータベースに維持される方法を管理するコードが含まれます。
- EIS 層。EIS 層は、アプリケーションの持続的記憶領域層です。NewsApp アプリケーションでは、この層は、メッセージが保存されているデータベースで表現されます。
IDE でエンタープライズアプリケーションを構築する際、EJB および Web アプリケーションモジュールが EAR アーカイブにパッケージされ、サーバーに配備されます。アプリケーションは通常クライアント層からアクセスされます。クライアント層とはクライアントが実行される環境であり、多くの場合ユーザーのローカルシステムにある Web ブラウザです。
注: このチュートリアルの例では、単一のマシンを使用して、Java EE サーバーおよびデータベースをホストし、Web ページを表示します。大規模なエンタープライズアプリケーションでは、異なる層が複数のマシンにわたって分散されることがよくあります。Web 層およびビジネス層のアプリケーションは通常、別々のマシンでホストされる Java EE サーバーに配備されます。
Java EE エンタープライズアプリケーションの構造に関する詳細については、「Java EE 6 のチュートリアル、パート I」の「多層構造の分散アプリケーション」を参照してください。
エンタープライズアプリケーションプロジェクトの作成
この課題の目標は、NewsApp エンタープライズアプリケーションプロジェクトを作成することです。新規プロジェクトウィザードを使用して、EJB モジュールと Web モジュールを含むエンタープライズアプリケーションを作成します。
- メインメニューから「ファイル」>「新規プロジェクト」(Ctrl-Shift-N、Mac の場合は ⌘-Shift-N) を選択します。
- 「Java EE」カテゴリから「エンタープライズアプリケーション」を選択し、「次へ」をクリックします。
- プロジェクト名を NewsApp にし、プロジェクトの場所を設定します。
- 専用フォルダを使用するオプションが選択されている場合は選択を解除します。
このチュートリアルでは、ライブラリをほかのユーザーまたはプロジェクトと共有する必要がないので、プロジェクトライブラリを専用のフォルダにコピーする理由はほとんどありません。
「次へ」をクリックします。
- サーバーを GlassFish Server 3 に設定し、Java EE バージョンを Java EE 6 に設定します。
- 「EJB モジュールを作成」および「Web アプリケーションモジュールを作成」を選択します。「完了」をクリックします。
「完了」をクリックすると、NewsApp、NewsApp-ejb、NewsApp-war の 3 つのプロジェクトが作成されます。「プロジェクト」ウィンドウの「NewsApp」ノードを展開すると、エンタープライズアプリケーションプロジェクトにソースが含まれていないことがわかります。すべてのソースは、ウィザードで作成された 2 つのモジュールに格納され、「Java EE モジュール」ノードに一覧表示されます。
エンタープライズアプリケーションプロジェクトは、アプリケーションに関する構成の詳細のみを含み、配備用の EAR を作成するプロジェクトを構築します。場合によっては、エンタープライズアプリケーションプロジェクトに追加情報を含む配備記述子ファイルが含まれることがありますが、GlassFish Server 3 に配備される Java EE エンタープライズアプリケーションを作成するときは、配備記述子ファイルは必要ありません。
EJB モジュールのコーディング
この課題では、EJB モジュールに、エンティティークラス、メッセージ駆動型 Bean、およびセッションファサードを作成します。また、データソースやエンティティーの管理方法に関する情報をコンテナに提供する持続性ユニット、およびメッセージ駆動型 Bean で使用される Java Message Service (JMS) リソースも作成します。
エンティティークラスの作成
この課題では、NewsEntity エンティティークラスを作成します。エンティティークラスは、通常はデータベース内の表を表す簡単な Java クラスです。このエンティティークラスを作成すると、クラスをエンティティークラスとして定義するための @Entity という注釈が IDE によって追加されます。このクラスを作成したあとで、表に必要なデータを表すフィールドを、クラス内に作成します。
各エンティティークラスは主キーを持つ必要があります。エンティティークラスを作成すると、IDE によって、どのフィールドを主キーとして使用するかを宣言するための @Id という注釈が追加されます。また、主 ID のキー生成方法を指定するための @GeneratedValue という注釈も IDE によって追加されます。
NewsEntity クラスを作成するには、次の手順を実行します。
- 「プロジェクト」ウィンドウで EJB モジュールを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「持続性」カテゴリから「エンティティークラス」を選択し、「次へ」をクリックします。
- クラス名に「NewsEntity」と入力します。
- 「パッケージ」に「ejb」と入力します。
- 「新規エンティティークラス」ウィザードの「主キー型」は「Long」のままにします。
- 「持続性ユニットを作成」を選択します。「次へ」をクリックします。
- 持続性ユニットの名前はデフォルトのままにしておきます。
- 「持続性プロバイダ」には「EclipseLink (JPA2.0)」(デフォルト) を選択します。
- 「データソース」にはデータソースを選択します (たとえば JavaDB を使用する場合は jdbc/sample を選択します)。
- 持続性ユニットが「Java Transaction API を使用」になっていること、アプリケーション配備時にエンティティークラスに基づいた表が作成されるように「表生成の方針」が「作成」に設定されていることを確認します。
- 「完了」をクリックします。
「完了」をクリックすると、persistence.xml およびエンティティークラス NewsEntity.java が作成されます。NewsEntity.java がソースエディタで表示されます。
ソースエディタで、次の手順を実行します。
- このクラスに次のフィールド宣言を追加します。
private String title;
private String body;
- ソースエディタ内を右クリックして「コードを挿入」(Alt-Insert、Mac の場合は Ctrl-I) を選択し、「取得メソッドおよび設定メソッド」を選択して「取得メソッドおよび設定メソッドの生成」ダイアログボックスを開きます。
- ダイアログで、body フィールドと title フィールドを選択します。「生成」をクリックします。
「生成」をクリックすると、フィールド用の取得メソッドと設定メソッドが追加されます。
- 変更内容を NewsEntity.java に保存します。
NewsEntity.java を閉じます。
エンティティークラスに関する詳細については、「Java EE 6 のチュートリアル、パート I 」の「Java Persistence API 入門」を参照してください。
メッセージ駆動型 Bean の作成
この課題では、ウィザードを使用して、EJB モジュールに NewMessage メッセージ駆動型 Bean を作成します。ウィザードは、必要な JMS リソースを作成するのにも役立ちます。メッセージ駆動型 Bean は、Web モジュール内のサーブレットによってキューに送信されたメッセージを受信および処理します。
メッセージ駆動型 Bean を作成するには、次の手順に従います。
- 「プロジェクト」ウィンドウで EJB モジュールを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「エンタープライズ JavaBeans」カテゴリから「メッセージ駆動型 Bean」ファイルタイプを選択します。「次へ」をクリックします。
注: NetBeans IDE 6.9 では、「メッセージ駆動型 Bean」ファイルタイプは「Java EE」カテゴリに含まれています。
- EJB 名に「NewMessage」と入力します。
- 「パッケージ」ドロップダウンリストから「 ejb 」を選択します。
- 「プロジェクトの送信先」フィールドの横の「追加」ボタンをクリックして「メッセージ送信先を追加」ダイアログを開きます。
- 「メッセージ送信先を追加」ダイアログで「jms/NewMessage」と入力し、送信先タイプに「キュー」を選択します。「了解」をクリックします。
- プロジェクトの送信先が正しいことを確認します。「完了」をクリックします。
「完了」をクリックすると、NewMessage.java という Bean クラスがソースエディタに表示されます。@MessageDriven 注釈と構成プロパティーがクラスに追加されたことがわかります。
@MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class NewMessage implements MessageListener {
@MessageDriven 注釈は、コンポーネントがメッセージ駆動型 Bean であり、この Bean が使用する JMS リソースを指定していることをコンテナに示します。IDE によってクラスが生成されるとき、リソースのマップされた名前 (jms/NewMessage) は、クラスの名前 (NewMessage.java) から取得されます。この JMS リソースは送信先の JNDI 名にマッピングされていて、そこから Bean がメッセージを受信します。新規メッセージ駆動型 Bean ウィザードでは、sun-resources.xml に JMS リソースの情報も追加します。JMS リソースを指定するために、配備記述子を構成する必要はありません。IDE で「実行」アクションを使用してアプリケーションを GlassFish に配備する場合は、配備時に JMS リソースがサーバー上に作成されます。
EJB 仕様では、注釈を使用して、クラスに直接リソースを導入できます。ここで、注釈を使用して、クラスに MessageDrivenContext リソースを導入し、持続性エンティティーのインスタンス管理のために EntityManager API によって使用されることになる PersistenceContext リソースを注入します。クラスへの注釈の追加は、ソースエディタで行います。
- 次の注釈済みフィールド (ボールド部分) をクラスに追加することで、MessageDrivenContext リソースをクラスに注入します。
public class NewMessage implements MessageListener {
@Resource
private MessageDrivenContext mdc;
- コード内を右クリックして「コードを挿入」(Alt-Insert、Mac の場合は Ctrl-I) を選択し、ポップアップメニューから「エンティティーマネージャーを使用」を選択することで、クラスにエンティティーマネージャーを導入します。
注: NetBeans IDE 6.9 では、「持続性」>「エンティティーマネージャーを使用」を選択します。
次の @PersistenceContext 注釈がソースコードに追加されます。
@PersistenceContext(unitName = "NewsApp-ejbPU")
private EntityManager em;
また、次の persist メソッドも生成されます。
public void persist(Object object) {
em.persist(object);
}
- persist メソッドを修正して名前を save に変更します。メソッドは次のようになります。
public void save(Object object) {
em.persist(object);
}
- 次のコード (ボールド部分) をメソッドの本体に追加することで、onMessage メソッドを変更します。
public void onMessage(Message message) {
ObjectMessage msg = null;
try {
if (message instanceof ObjectMessage) {
msg = (ObjectMessage) message;
NewsEntity e = (NewsEntity) msg.getObject();
save(e);
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}
- エディタを右クリックして「インポートを修正」(Alt-Shift-I、Mac の場合は ⌘-Shift-I) を選択し、必要なインポート文を生成します。変更を保存します。
注: インポート文を生成するときは、javax.jms ライブラリと javax.annotation.Resource ライブラリをインポートしていることを確認することをお勧めします。
メッセージ駆動型 Bean の詳細については、「Java EE 6 チュートリアル、パート 1」の「メッセージ駆動型 Bean とは」章を参照してください。
セッションファサードの作成
この課題では、NewsEntity エンティティークラスのセッションファサードを作成します。EJB 3.0 仕様では、必須コードの量を少なくし、注釈を使用してクラスをセッション Bean として宣言できるようにすることで、セッション Bean の作成を簡素化します。さらに、EJB 3.1 仕様では、ビジネスインタフェースを任意にすることで、セッション Bean の要件を簡素化します。セッション Bean には、ローカルクライアントから、ローカルインタフェースまたはインタフェースなしのビューを使ってアクセスできます。このチュートリアルでは、Bean 用のインタフェースは作成しません。Web アプリケーションは、インタフェースなしのビューから Bean にアクセスします。
セッションファサードを作成するには、次の手順に従います。
- EJB モジュールを右クリックし、「新規」>「その他」を選択します。
- 「持続性」カテゴリから「エンティティークラスのセッション Bean」を選択します。「次へ」をクリックします。
- 利用可能なエンティティークラスのリストから ejb.NewsEntity を選択し、「追加」をクリックして、そのクラスを「選択されているエンティティークラス」区画に移動します。「次へ」をクリックします。
- 「パッケージ」が ejb に設定されていることを確認します。「完了」をクリックします。
「完了」をクリックすると、IDE によってセッションファサードクラス NewsEntityFacade.java および AbstractFacade.java が生成され、エディタでこれらのファイルが開きます。生成されたコードでわかるように、ステートレスセッション Bean コンポーネントとして NewsEntityFacade.java を宣言するため、注釈 @Stateless が使用されます。さらに、PersistenceContext 注釈が追加され、リソースが直接セッション Bean コンポーネントに注入されます。NewsEntityFacade.java は、AbstractFacade.java を拡張したもので、ビジネスロジックを含み、トランザクションを管理します。
注: リモートクライアントから Bean にアクセスする場合は、引き続きリモートインタフェースが必要です。
セッション Bean の詳細については、「Java EE 6 のチュートリアル、パート I」の「セッション Bean とは」を参照してください。
Web モジュールのコーディング
このセクションでは、Web モジュールに 2 つのサーブレットを作成します。ListNews サーブレットは、EJB モジュールのエンティティーファサードを介して、データベースからメッセージを取得します。PostMessage サーブレットは、JMS メッセージを送信するために使用されます。
このセクションでは、Web モジュールに、現在セッションにいるユーザーの数をカウントするシングルトンセッション Bean も作成します。EJB 3.1 仕様により、Web アプリケーションにエンタープライズ Bean を作成できます。EJB 3.1 以前は、すべてのエンタープライズ Bean を EJB モジュールに置く必要がありました。
シングルトンセッション Bean の作成
EJB 3.1 仕様では、シングルトンセッション Bean を簡単に作成できる @Singleton 注釈が導入されています。また、EJB 3.1 では、Bean が初期化される場合など、シングルトンセッション Bean のプロパティーを構成するためのその他の注釈も定義されています。
シングルトンセッション Bean は、インスタンス化されたあと、アプリケーションのライフサイクルの間は存在します。名前が示すとおり、アプリケーションでは、シングルトンセッション Bean のインスタンスは 1 つしかありません。ステートレスセッション Bean と同様、シングルトンセッション Bean は複数のクライアントを持つことができます。
シングルトンセッション Bean を作成するには、次の手順に従います。
- Web モジュールを右クリックし、「新規」>「その他」を選択して新規ファイルウィザードを開きます。
- 「エンタープライズ JavaBeans」カテゴリで「セッション Bean」を選択します。
注: NetBeans IDE 6.9 では、「セッション Bean」は「Java EE」カテゴリに含まれています。
- 「EJB 名」に「SessionManagerBean」と入力します。
- 「パッケージ名」に「ejb」と入力します。
- 「シングルトン」を選択します。「完了」をクリックします。
「完了」をクリックするとシングルトンセッション Bean クラスが作成され、そのクラスがエディタに表示されます。シングルトンセッション Bean を宣言するための注釈 @Singleton がクラスに追加されたことがわかります。このウィザードでは、クラスに @LocalBean という注釈も追加されます。
@Singleton
@LocalBean
public class SessionManagerBean {
}
- @WebListener を使用してクラスに注釈を付け、HttpSessionListener を実装します。
@Singleton
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener{
}
@WebListener 注釈は Servlet 3.0 API の一部で、これによりコードで直接リスナーを実装できます。
HttpSessionListener を実装すると、マージンに警告が表示されます。
- 左マージンにある警告バッジをクリックして、「すべての抽象メソッドを実装」を選択します。
sessionCreated メソッドと sessionDestroyed メソッドが追加されます。
- 静的フィールド counter を追加し、初期値を 0 に設定します。
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener{
private static int counter = 0;
- 生成された sessionCreated メソッドと sessionDestroyed メソッドの本体を、新しいセッションが開始されるときにフィールドの値を増やし、セッションが終了するときに値を減らすように変更します。値は、フィールド counter に保存されます。
public void sessionCreated(HttpSessionEvent se) {
counter++;
}
public void sessionDestroyed(HttpSessionEvent se) {
counter--;
}
- counter の現在の値を返す次のメソッドを追加します。
public int getActiveSessionsCount() {
return counter;
}
このメソッドをサーブレットから呼び出し、現在のユーザー数または開かれているセッション数を表示します。
- 変更を保存します。
セッション Bean のコードは、次のようになっているはずです。
@Singleton
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener {
private static int counter = 0;
public void sessionCreated(HttpSessionEvent se) {
counter++;
}
public void sessionDestroyed(HttpSessionEvent se) {
counter--;
}
public int getActiveSessionsCount() {
return counter;
}
}
シングルトンセッション Bean の詳細については、「Java EE 6 のチュートリアル、パート I」の「セッション Bean とは」を参照してください。
ListNews サーブレットの作成
この課題では、保存されているメッセージを表示するための簡単なサーブレットを作成します。注釈を使用して、サーブレットからエンタープライズ Bean の NewsEntityFacade を呼び出します。
- Web モジュールプロジェクトを右クリックし、「新規」>「サーブレット」を選択します。
- 「クラス名」には「 ListNews 」と入力します。
- パッケージ名に「web」と入力します。「完了」をクリックします。
「完了」をクリックすると、 ListNews.java というクラスがソースエディタに表示されます。ソースエディタで、次の手順を実行します。
- ソースエディタ内を右クリックして「コードを挿入」(Alt-Insert、Mac の場合は Ctrl-I) を選択し、「エンタープライズ Bean を呼び出し」を選択します。
- 「エンタープライズ Bean を呼び出し」ダイアログで、「NewsApp-ejb」ノードを展開し、「NewsEntityFacade」を選択します。「閉じる」をクリックします。
エンタープライズ Bean を注入する @EJB 注釈が追加されます。
- もう一度「エンタープライズ Bean を呼び出し」ダイアログを使用して、「NewsApp-war」ノードの下に SessionManagerBean を注入します。
2 つのエンタープライズ Bean を注入する次の注釈がコードに表示されます。
@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
@EJB
private SessionManagerBean sessionManagerBean;
@EJB
private NewsEntityFacade newsEntityFacade;
また、クラスサーブレットの宣言とサーブレット名の指定用に、@WebServlet 注釈が使用されています。@WebServlet 注釈は、Java EE 6 仕様で導入された Servlet 3.0 API の一部です。web.xml 配備記述子で指定する代わりに、注釈を使用してサーブレットを特定できます。NewsApp アプリケーションには web.xml は含まれません。
- processRequest メソッドに、現在のセッションを返すか新規に作成する、次のコード (ボールド部分) を追加します。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession(true);
response.setContentType("text/html;charset=UTF-8");
- processRequest メソッドにメッセージを出力する次のコード (ボールド部分) を追加して、リンクを PostMessage サーブレットに追加します。(必要な場合はメソッド内のコードをコメント解除します。)
out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(" <b>"+elem.getTitle()+" </b><br />");
out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");
out.println("</body>");
- ユーザー数または開かれているセッションの数を取得および出力する、次のコード (ボールド部分) を追加します。
out.println("<a href='PostMessage'>Add new message</a>");
out.println("<br><br>");
out.println(sessionManagerBean.getActiveSessionsCount() + " user(s) reading the news.");
out.println("</body>");
- Ctrl-Shift-I キーを押し、このクラスに必要なインポート文を生成します。インポート文を生成するときは、java.util ライブラリをインポートする必要があります。
- 変更内容をファイルに保存します。
PostMessage サーブレットの作成
この課題では、メッセージの投稿に使用される PostMessage サーブレットを作成します。注釈を使用して、作成した JMS リソースを直接このサーブレットに注入します。このとき、変数名と、この JMS リソースがマッピングされる名前を指定します。次に、JMS メッセージを送信するためのコードと、メッセージを追加するための HTML 形式のコードを追加します。
- Web モジュールプロジェクトを右クリックし、「新規」>「サーブレット」を選択します。
- 「クラス名」には「 PostMessage 」と入力します。
- パッケージ名に「 web 」と入力し、「完了」をクリックします。
「完了」をクリックすると、PostMessage.java というクラスがソースエディタに表示されます。ソースエディタで、次の手順を実行します。
- 次のフィールド宣言 (ボールド部分) を追加することにより、注釈を使用して ConnectionFactory および Queue リソースを注入します。
@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
@Resource(mappedName="jms/NewMessageFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName="jms/NewMessage")
private Queue queue;
- 今度は、次に示すボールドのコードを processRequest メソッドに追加し、JMS メッセージを送信するためのコードの追加を行います。
response.setContentType("text/html;charset=UTF-8");
// JMS メッセージを送信する次のコードを追加
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) && (body!=null)) {
try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
ObjectMessage message = session.createObjectMessage();
// ここで JMS メッセージに送信される NewsEntity を作成
NewsEntity e = new NewsEntity();
e.setTitle(title);
e.setBody(body);
message.setObject(e);
messageProducer.send(message);
messageProducer.close();
connection.close();
response.sendRedirect("ListNews");
} catch (JMSException ex) {
ex.printStackTrace();
}
}
PrintWriter out = response.getWriter();
- processRequest メソッドに次の行 (ボールド部分) を追加して、メッセージを追加するための Web フォームを追加します。(必要な場合は HTML を出力するコードをコメント解除します。)
out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");
// 次のコードで Web ページにフォームを追加
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");
out.println("</body>");
- Ctrl-Shift-I キーを押し、このクラスに必要なインポート文を生成します。
注: Connection、ConnectionFactory、Session、および Queue 用にインポートするライブラリを選択するときは、必ず javax.jms ライブラリをインポートしてください。
- 変更内容をファイルに保存します。
プロジェクトの実行
これでプロジェクトを実行できるようになりました。プロジェクトを実行すると ListNews サーブレットのページがブラウザで開かれるようにします。エンタープライズアプリケーションの「プロパティー」ダイアログで URL を指定することによって、この操作を行います。この URL はアプリケーションのコンテキストパスを基準にしたものです。この相対 URL を入力したあと、「プロジェクト」ウィンドウからアプリケーションの構築、配備、および実行を行うことができます。
相対 URL を設定し、アプリケーションを実行するには、次の手順を実行します。
- 「プロジェクト」ウィンドウで、NewsApp エンタープライズアプリケーションノードを右クリックし、ポップアップメニューの「プロパティー」を選択します。
- 「カテゴリ」区画で、「実行」を選択します。
- 「相対 URL」テキストフィールドに「/ListNews」と入力します。
- 「了解」をクリックします。
- 「プロジェクト」ウィンドウで、NewsApp エンタープライズアプリケーションノードを右クリックして「実行」を選択します。
プロジェクトを実行すると、 ListNews サーブレットがブラウザで開き、データベース内のメッセージの一覧が表示されます。初めてプロジェクトを実行したときは、データベースは空ですが、「メッセージを追加」をクリックしてメッセージを追加できます。
PostMessage サーブレットを使ってメッセージを追加すると、持続ストレージに書き込むためのメッセージ駆動型 Bean にそのメッセージが送信され、ListNews サーブレットが呼び出されてデータベース内のメッセージが表示されます。このメッセージサービスは非同期のため、 ListNews によって取得されるデータベース内のメッセージ一覧には、新しいメッセージがまだ含まれていないことがよくあります。
ソリューションプロジェクトのダウンロード
次の方法で、このチュートリアルにソリューションをプロジェクトとしてダウンロードできます。
- 完了したプロジェクトの ZIP アーカイブをダウンロードします。
- 次の手順を実行して、プロジェクトソースを NetBeans のサンプルからチェックアウトします。
- メインメニューから「チーム」>「Subversion」>「チェックアウト」を選択します。
- 「チェックアウト」ダイアログで次のリポジトリ URL を入力します。
https://svn.netbeans.org/svn/samples~samples-source-code
「次へ」をクリックします。
- 「参照」をクリックして「リポジトリフォルダを参照」ダイアログボックスを開きます。
- ルートノードを展開し、samples/javaee/NewsAppEE6 を選択します。「了解」をクリックします。
- ソースのローカルフォルダを指定します。ローカルフォルダは空である必要があります。
- 「完了」をクリックします。
「完了」をクリックすると、IDE はローカルフォルダを Subversion リポジトリとして初期化し、プロジェクトソースをチェックアウトします。
- チェックアウトが完了するときに表示されるダイアログで、「プロジェクトを開く」をクリックします。
注:
トラブルシューティング
プロジェクト作成時に発生する可能性がある問題の一部を次に示します。
JMS リソースの問題
ウィザードを使用して JMS リソースを作成するとき、出力ウィンドウに次のサーバーエラーメッセージが表示される場合があります。
[com.sun.enterprise.connectors.ConnectorRuntimeException:
JMS resource not created : jms/Queue]
このメッセージは、JMS リソースが作成されなかったか、アプリケーションサーバーに登録されなかったことを示している可能性があります。アプリケーションサーバーの管理コンソールを使用すると、JMS リソースを確認、作成、および編集できます。
管理コンソールを開くには、次の手順を実行します。
- IDE の「サービス」ウィンドウにある「サーバー」ノードを展開して、アプリケーションサーバーが実行中であることを確認します。アプリケーションサーバーのノードの横に小さな緑の矢印が表示されていれば、サーバーは実行中です。
- アプリケーションサーバーのノードを右クリックし、「管理コンソールを表示」を選択して、ブラウザでログインウィンドウを開きます。
- サーバーにログインします。デフォルトのユーザー名とパスワードは、それぞれ admin と adminadmin です。
- ブラウザの管理コンソールで、左側フレームにある「リソース」ノードと「JMS リソース」ノードを展開します。
- 左側フレームの「接続ファクトリ」および「接続先リソース」リンクをクリックして、リソースがサーバーに登録されているかどうかを確認し、必要に応じてリソースを変更します。リソースが存在しない場合は、管理コンソールで作成できます。
Sun Java System Application Server に登録されている JMS 接続ファクトリリソースの正しい JNDI 名に、PostMessage サーブレットの JMS 接続ファクトリリソースがマッピングされていることを確認する必要があります。
Sun Java System Application Server には、次のリソースが登録されている必要があります。
- JNDI 名が jms/NewMessage で、型が javax.jms.Queue の接続先リソース
- JNDI 名が jms/NewMessageFactory で、型が javax.jms.QueueConnectionFactory の接続ファクトリリソース
関連項目
NetBeans IDE を使用した Java EE アプリケーションの開発方法についての詳細は、次のリソースを参照してください。
EJB 3.1 エンタープライズ Bean の使用方法については、Java EE 6 チュートリアルを参照してください。
nbj2ee メーリングリストに登録する ことによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。