EJB 3.0 ステートレス・セッション Bean のサンプル
このサンプルは以下に記述します EJB 3.0 からの新機能のデモンストレーションです。
- セッション Bean 用に EJB コンポーネントのインターフェースが必要なくなりました。必要とされるセッション Bean 用のビジネス・インターフェースは、EJBObject、EJBLocalObject、java.rmi.Remote インターフェースではなく、プレーン Java のインターフェースとなりました。
- セッション Bean 用ホーム・インターフェースの必要なくなりました。
- 環境依存部分のカプセル化や JNDI へは、アノテーションによる依存性注入方式で簡易検索方式を通じて接続します。
- Java メタ・データのアノテーションの導入は、デプロイメント・ディスクリプターの代わりとして使われることになります。
計算機
Calculator.java: EJBObject、EJBLocalObject、java.rmi.Remote のような EJB コンポーネントのインターフェースの代わりとして、ステートレス・セッション Bean は単純な Java インターフェースを実装します。このクラスに @Stateless というアノテーションを記述することによって、別に記述していたデプロイメント・ディスクリプターが不要になりました。このクラスは、CalculatorLocal と CalculatorRemote という名前のローカルとリモート両方のビジネスインターフェースを実装しました。
Code Block |
---|
| java |
---|
| java |
---|
borderStyle | solid |
---|
title | Calculator.java |
---|
|
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 のアノテーションがないビジネス・インターフェースは、ローカル扱いになります。
Code Block |
---|
| java |
---|
| java |
---|
borderStyle | solid |
---|
title | CalculatorLocal.java |
---|
|
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 アノテーションが必要です。
Code Block |
---|
| java |
---|
| java |
---|
borderStyle | solid |
---|
title | CalculatorRemote.java |
---|
|
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 はどの階層でも宣言できます。
Code Block |
---|
| java |
---|
| java |
---|
borderStyle | solid |
---|
title | CalculatorServlet.java |
---|
|
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);
}
}
}
|
デプロイメント・プラン
次のような構造でデプロイします。
No Format |
---|
|
|- 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 となります。
Code Block |
---|
| xml |
---|
| xml |
---|
borderStyle | solid |
---|
title | application.xml |
---|
|
<?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> タグの中に記述されています。今回の場合は、他のモジュールに依存していませんので、リストには記述がありません。しかしながら、全体を通してユニークな名前をつけておく方がよいです。そうすれば、後々他のアプリケーションから参照できるようになります。
Code Block |
---|
| xml |
---|
| xml |
---|
borderStyle | solid |
---|
title | geronimo-application.xml |
---|
|
<?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>
|
導入方法
- SVN からサンプルのソースコードをチェックアウトしてください。
svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/calculator-stateless-pojo
- mvn install site コマンドを実行し、ソースコードをビルドしてください。現在のディレクトリーに calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルが作られます。
- $geronimo_home/bin ディレクトリーに移動し、Geronimo サーバを始動してください。
- この リンクをクリックし、コンソールを利用して calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルをデプロイしてください。コンソールのユーザー名/パスワードは system/manager です。または、以下のコマンドを利用してデプロイしてください。
deploy --user system --password manager deploy <path to the ear file>
- この URL http://localhost:8080/calculator-stateless をクリックしてください。表示されたドキュメントを読んでください。
Info |
---|
サンプル・アプリケーションを開くと、右隅にある "source" タブをクリックすることでソース・コードを見ることができます。"javadoc" をクリックすると JavaDoc が読めます。 |