さて、EJB3.0が出てから結構たつけど、ほとんどやったことがない!
ということで、NetBeans6.1 + GlassFish V2という開発環境と実行環境も手元にあることだしやってみよう。
EJB3Eduという名前でエンタープライズアプリケーションを新規作成する。
そうすると、EJB3Edu-ejbというプロジェクトと、EJB3Edu-warというプロジェクトも一緒に作られる。
ejbのほうにセッションビーンとかを置くみたい。warの方には、もちろんWeb周りを作っていくことになる。
JavaのWebアプリ開発は、素のJSP/Servletとかではやる気がでないのでVisual Web JSFを使うことにする。
プロジェクトのプロパティからフレームワークを選択してVisual Web JavaServer Facesを追加する。
ここら辺、Webフレームワークとして統合されたおかげで、かなり柔軟になった。
最後に、Webのプロジェクトを自分色にしやすくするために、生成されたjspやApplicationBean SessionBean等を削除する。ソースパッケージにはBundle.propertiesが寂しく残るだけになればOK。
Statelessなセッションビーンを作ってみるか
EJBのプロジェクトのソースパッケージにcom.wankuma.kazuki.ejbというパッケージを作っておく。
そして、新規作成からセッション Beanを作成する。
EJB名をCalc。パッケージをcom.wankuma,kazuki.ejbにしてステートレスのローカルを選んでおく。
そうすると、セッションビーンの雛形が作られる
// CalcLocal.java
package com.wankuma.kazuki.ejb;
import javax.ejb.Local;
@Local
public interface CalcLocal {
}
// CalcBean.java
package com.wankuma.kazuki.ejb;
import javax.ejb.Stateless;
@Stateless
public class CalcBean implements CalcLocal {
// Add business logic below. (Right-click in editor and choose
// "EJB Methods > Add Business Method" or "Web Service > Add Operation")
}
コメントを見ると、右クリックからEJBメソッドのビジネスメソッドを追加あたりを選べみたいなことが書いてあるので素直に従う。
そうすると、下のようにメソッドを追加するダイアログが出てくるので適当に入力する。
ここでは、足し算をするだけのものを作ろうとしてるので、下のように入力。
public int calc(int lhs, int rhs)みたいな感じの出来る。
次にEJB3からはテストしやすいぜ!ってのがウリみたいなので、JUnitのテストを書いてから、実装してみようと思う。
JUnitの生成もIDEからさくっとできる。対象のJavaファイルの右クリックメニューからツールのJUnitテストを作成。
自動で吐き出されるコードをベースに足し算のテストを書いてみる。
package com.wankuma.kazuki.ejb;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Kazuki
*/
public class CalcBeanTest {
private CalcBean bean;
@Before
public void setUp() {
bean = new CalcBean();
}
@After
public void tearDown() {
bean = null;
}
@Test
public void testAdd() {
assertEquals(2, bean.add(1, 1));
}
}
実行すると当然失敗!下にように怒られる。
失敗を確認したので、実装!まぁ、JUnitでテスト書くまでもないようなロジックだけどなんとなくね。
@Stateless
public class CalcBean implements CalcLocal {
public int add(final int lhs, final int rhs) {
return lhs + rhs;
}
}無事テストも成功。
画面も作るよ!
作った!!!
ぽとぺたで画面が作れるのはやっぱりいい。
テキストフィールドにはIntegerコンバータをしかけて数値としてデータが取れるようにしている。
次に、Javaのコード側にセッションビーンのインターフェイスをフィールドとして定義する。
そして、getter/setterを定義してsetterにEJBアノテーションを追加する。
private CalcLocal calc;
public CalcLocal getCalc() {
return calc;
}
@EJB
public void setCalc(CalcLocal calc) {
this.calc = calc;
}
これで実行時に自動的にインスタンスが設定されるはずだ。
次に、テキストボックスからの入力を受け取るプロパティや、計算結果のためのプロパティを定義する。
private int lhs; // 左辺値
private int rhs; // 右辺値
private int answer; // 答え
// getter/setterは省略
そして、このプロパティを画面のコンポーネントとバインドする。バインドもGUIからさくっと指定できる。
JSP上で↓のような感じになるようにバインドを指定する。
<webuijsf:textField converter="#{CalcPage.integerConverter1}" id="textFieldLhs" required="true" text="#{CalcPage.lhs}"/>
<webuijsf:staticText id="staticText2" style="" text="+"/>
<webuijsf:textField converter="#{CalcPage.integerConverter1}" id="textFieldRhs" required="true" text="#{CalcPage.rhs}"/>
<webuijsf:staticText id="staticText3" text="="/>
<webuijsf:staticText id="staticTextAnswer" text="#{CalcPage.answer}"/>
後は、ボタンにさっき作ったaddメソッドを呼ぶコードを書けばOK。
public String button1_action() {
answer = calc.add(lhs, rhs);
return null;
}
これで完成~。
動作確認!
実行すると下のような画面になる。数字を入力してボタンを押すとちゃんと計算もできる。
感想
思ったより簡単に足し算が出来た。
これは結構いいかもしれん。