{scrollbar}

EJB 3.0 ステートレス・セッション Bean のサンプル

このサンプルは以下に記述します EJB 3.0 からの新機能のデモンストレーションです。

  1. セッション Bean 用に EJB コンポーネントのインターフェースが必要なくなりました。必要とされるセッション Bean 用のビジネス・インターフェースは、EJBObject、EJBLocalObject、java.rmi.Remote インターフェースではなく、プレーン Java のインターフェースとなりました。
  2. セッション Bean 用ホーム・インターフェースの必要なくなりました。
  3. 環境依存部分のカプセル化や JNDI へは、アノテーションによる依存性注入方式で簡易検索方式を通じて接続します。
  4. Java メタ・データのアノテーションの導入は、デプロイメント・ディスクリプターの代わりとして使われることになります。

計算機

Calculator.java: EJBObject、EJBLocalObject、java.rmi.Remote のような EJB コンポーネントのインターフェースの代わりとして、ステートレス・セッション Bean は単純な Java インターフェースを実装します。このクラスに @Stateless というアノテーションを記述することによって、別に記述していたデプロイメント・ディスクリプターが不要になりました。このクラスは、CalculatorLocal と CalculatorRemote という名前のローカルとリモート両方のビジネスインターフェースを実装しました。

package org.apache.geronimo.samples.slsb.calculator;

import javax.ejb.Stateless;

@Stateless
public class Calculator implements CalculatorRemote, CalculatorLocal {

	public int sum(int add1, int add2) {
		return add1+add2;
	}

	public int multiply(int mul1, int mul2) {
		return mul1*mul2;
	}

}

CalculatorLocal.java: これはローカルのビジネス・インターフェースですので、@Local アノテーションをこのクラスに任意に記述することができます。@Local や @Remote のアノテーションがないビジネス・インターフェースは、ローカル扱いになります。

package org.apache.geronimo.samples.slsb.calculator;

public interface CalculatorLocal {

	public int sum(int add1, int add2);

	public int multiply(int mul1, int mul2);
}

CalculatorRemote.java: これはリモートのインターフェースですので、@Remote アノテーションが必要です。

package org.apache.geronimo.samples.slsb.calculator;

import javax.ejb.Remote;

@Remote
public interface CalculatorRemote {

	public int sum(int add1, int add2);

	public int multiply(int mul1, int mul2);

}

CalculatorServlet.java: これは JSP ページのフォームを処理するためのサーブレットです。ステートレス・セッション Bean の Calculator を利用して、計算結果を返します。CalculatorLocal に記述のある @EJB アノテーションに注目してください。EJB コンテナはすべてのリクエストに対して別々の Bean のインスタンスをもちます。メモ: @EJB アノテーションは、ステートフル・セッションの場合は型階層に記述しますが、ステートレス・セッション Bean はどの階層でも宣言できます。

package org.apache.geronimo.samples.calculator;

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.geronimo.samples.slsb.calculator.CalculatorLocal;

public class CalculatorServlet extends HttpServlet {

    @EJB
    private CalculatorLocal calc = null;

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

        try {
            String firstNumber = req.getParameter("firstNumber");
            String secondNumber = req.getParameter("secondNumber");
            String operation = req.getParameter("operation");

            int firstInt = (firstNumber == null) ? 0 : Integer.valueOf(firstNumber).intValue();
            int secondInt = (secondNumber == null) ? 0 : Integer.valueOf(secondNumber).intValue();

            if ( "multiply".equals(operation) ) {
                req.setAttribute("result", calc.multiply(firstInt, secondInt));
            }
            else if ( "add".equals(operation) ) {
                req.setAttribute("result", calc.sum(firstInt, secondInt));
            }

            System.out.println("Result is " + req.getAttribute("result"));

            getServletContext().getRequestDispatcher("/sample-docu.jsp").forward(req, resp);

        }
        catch ( Exception e ) {
            e.printStackTrace();
            throw new ServletException(e);
        }
    }
}

デプロイメント・プラン

次のような構造でデプロイします。

|- calculator-stateless-ear-2.0-SNAPSHOT.ear
   |- META-INF
      |- application.xml
      |- geronimo-application.xml
   |- calculator-stateless-ejb-2.0-SNAPSHOT.jar
   |- calculator-stateless-war-2.0-SNAPSHOT.war

application.xml: JAR ファイルが参照され、このアプリケーションの機能を与えられます。WAR ファイルは Web ベースのインターフェースを通してこのアプリケーションが使えるようにするために参照されます。コンテキスト・ルートが /calculator-stateless となり、このアプリケーションの URL は http://<hostname>:<port>/calculator-stateless となります。

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
             version="5">
    <description>Geronimo Sample EAR for Stateless Session</description>
    <display-name>Geronimo Sample EAR for Stateless Session</display-name>
    <module>
        <web>
            <web-uri>calculator-stateless-war-2.0-SNAPSHOT.war</web-uri>
            <context-root>/calculator-stateless</context-root>
        </web>
    </module>
    <module>
        <ejb>calculator-stateless-ejb-2.0-SNAPSHOT.jar</ejb>
    </module>
</application>

geronimo-application.xml: このプロジェクト(モジュールには他に依存するモジュールとは違うユニークな名前をつけます)の情報が <environment> タグの中に記述されています。今回の場合は、他のモジュールに依存していませんので、リストには記述がありません。しかしながら、全体を通してユニークな名前をつけておく方がよいです。そうすれば、後々他のアプリケーションから参照できるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.2">

    <environment xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2">
        <moduleId>
            <groupId>${pom.groupId}</groupId>
            <artifactId>${pom.artifactId}</artifactId>
            <version>${version}</version>
            <type>ear</type>
        </moduleId>
    </environment>

    <module>
        <web>calculator-stateless-war-${version}.war</web>
        <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2">
            <context-root>/calculator-stateless</context-root>
        </web-app>
    </module>

</application>

導入方法

  1. SVN からサンプルのソースコードをチェックアウトしてください。

    svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/calculator-stateless-pojo

  2. mvn install site コマンドを実行し、ソースコードをビルドしてください。現在のディレクトリーに calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルが作られます。
  3. $geronimo_home/bin ディレクトリーに移動し、Geronimo サーバを始動してください。
  4. この リンクをクリックし、コンソールを利用して calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルをデプロイしてください。コンソールのユーザー名/パスワードは system/manager です。または、以下のコマンドを利用してデプロイしてください。

    deploy --user system --password manager deploy <path to the ear file>

  5. この URL http://localhost:8080/calculator-stateless をクリックしてください。表示されたドキュメントを読んでください。

    サンプル・アプリケーションを開くと、右隅にある "source" タブをクリックすることでソース・コードを見ることができます。"javadoc" をクリックすると JavaDoc が読めます。