エンティティ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.