エンティティBeanの作成が終わったので、次に、セッションBeanを作成する。
セッションBeanも、エンティティBeanと同様に追加する。Bean型を「セッションBean」とするだけだ。
セッションBeanでは例外クラスを使うので、最初の*.javaファイルをテキストベースで作成した場合には、この時点で同じプロジェクトにインポートしよう。
セッションBeanでは、フィールドの追加とメソッドの追加を繰り返すことになる。まず、フィールドとして、InitialContextとUserinfoEntityへのホームインターフェイス、UserinfoEntityインターフェイスを追加しておこう。インスタンス変数で、privateとする。
InitialContext initialContext = null; UserinfoEntityHome userinfoEntityHome = null; UserinfoEntity userinfoEntity = null;
これらの作業は、すべてFボタンを押すことでウィザードから追加できる。VAJを使えば、このような機械的な作業はすべてウィザードからでき、Javaのソースコードを入力する機会は極力減らすことができる。
Homeインターフェイス・フィールドの初期化は、EJBの作法としてejbCreateで行う。ejbCreateを次のように記述する。
public void ejbCreate()
throws javax.ejb.CreateException, java.rmi.RemoteException {
try {
initialContext = new InitialContext();
userinfoEntityHome =
(UserinfoEntityHome) javax.rmi.PortableRemoteObject.narrow(
initialContext.lookup("atmarkit/ejb/UserinfoEntityBean"),
UserinfoEntityHome.class);
} catch (NamingException e) {
e.printStackTrace();
}
}
次に、それぞれのメソッドを追加していく。先ほど追加したUserinfoSessionBeanを選択しておいて、「M」キーを押すなどしてメソッド「login」「modPass」「delUser」を追加し、コードを次のように修正する。追加するに際して、例外を設定するのを忘れないようにする。特にRemoteExceptionは、必ずすべてのメソッドに必要である。さらに、追加したメソッドは、メソッドのアイコンを右クリックして、[追加先]→[EJBリモートインターフェイス]を実行してリモート・インターフェイスにも追加しておこう。
public void login(String userid, String password)
throws
atmarkit2.UserAddedException,
java.rmi.RemoteException,
atmarkit2.InvPassException {
try {
userinfoEntity = userinfoEntityHome.create(userid);
userinfoEntity.setPassword(password);
throw new atmarkit2.UserAddedException();
} catch (DuplicateKeyException e) {
try {
userinfoEntity =
userinfoEntityHome.findByPrimaryKey(
new UserinfoEntityKey(userid));
if(!userinfoEntity.getPassword().equals(password))
throw new atmarkit2.InvPassException();
} catch (FinderException e1) {
e.printStackTrace();
}
} catch (CreateException e) {
e.printStackTrace();
}
}
public void modPass(String password) throws java.rmi.RemoteException {
userinfoEntity.setPassword(password);
}
public void delUser() throws RemoteException {
try {
userinfoEntityHome.remove(userinfoEntity.getHandle());
userinfoEntity = null;
} catch (javax.ejb.RemoveException e) {
e.printStackTrace();
}
}
セッションBeanが出来上がったら、エンティティBeanと同様に配置コードを生成する。そして、呼び出される順番を考慮しつつ、テスト・クライアントを起動してセッションBeanもテストしておこう。VAJでEJBのテストを行うのであれば、VAJのデバッガを使って、ソースコード上でEnterpriseBeanのデバッグができる。
最後に、テスト用に作った「UserinfoBean」をEJB用に作りなおす。プログラミング内容としては、次のような部分である。
フィールドの追加
メソッドの修正
以上を反映したUserinfoBeanを以下に示す。
package atmarkit2;
import javax.naming.NamingException;
import atmarkit2.ejb.*;
import javax.naming.InitialContext;
public class UserinfoBean {
String factory = "com.ibm.ejs.ns.jndi.CNInitialContextFactory";
String jndiName = "atmarkit2/ejb/UserinfoSession";
String providarURL = "iiop://localhost:900/";
public atmarkit2.ejb.UserinfoSession userinfoSession = null;
public atmarkit2.ejb.UserinfoSessionHome userinfoSessionHome = null;
private String userid = "";
private String password = "";
private String msg = "";
/**
* コンストラクタ<BR>
* セッション・ビーンへのHomeインターフェイスを取得します。
*/
public UserinfoBean(String userid, String password) {
this.userid = userid;
this.password = password;
java.util.Hashtable h = new java.util.Hashtable();
h.put(javax.naming.Context.PROVIDER_URL, providarURL);
h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, factory);
try {
InitialContext initialContext = new InitialContext(h);
userinfoSessionHome =
(UserinfoSessionHome)
javax.rmi.PortableRemoteObject.narrow(
initialContext.lookup(jndiName),
UserinfoSessionHome.class);
userinfoSession = userinfoSessionHome.create();
} catch (NamingException e) {
e.printStackTrace();
} catch(javax.ejb.CreateException e) {
e.printStackTrace();
} catch(java.rmi.RemoteException e) {
e.printStackTrace();
}
}
/**
* ユーザーIDを返します。
*/
public String getUserid() {
return userid;
}
/**
* パスワードを返します。
*/
public String getPassword() {
return password;
}
/**
* メッセージを返します。
*/
public String getMsg() {
return msg;
}
/**
* メッセージをセットします。
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* ログイン処理を行います。<BR>
* 既存ユーザーに対してパスワードが違うとInvPassExceptionをthrowします。<BR>
* 存在しないユーザーの場合はユーザーIDを追加し、UserAddedExceptionをthrowします。<BR>
* 既存ユーザーでパスワードが正しければ、参照を解決した状態で終わります。
*/
public void login(String userid, String password)
throws InvPassException, UserAddedException {
this.userid = userid;
this.password = password;
try {
userinfoSession.login(userid, password);
msg = "ログインされました";
} catch(java.rmi.RemoteException e) {
msg = e.getMessage();
}
}
/**
* パスワードを変更します。
*/
public void modPass(String password) {
this.password = password;
try {
userinfoSession.modPass(password);
msg = "パスワードが変更されました";
} catch(java.rmi.RemoteException e) {
msg = e.getMessage();
}
}
/**
* 現在接続されているユーザーを削除します。
*/
public void delUser() {
try {
userinfoSession.delUser();
msg = "ユーザーが削除されました";
} catch(java.rmi.RemoteException e) {
msg = e.getMessage();
}
}
}
Copyright © ITmedia, Inc. All Rights Reserved.