連載
» 2000年12月19日 00時00分 公開

サーブレットとEJBの連携Java Servlet徹底解説(後編)(6/7 ページ)

[米持幸寿,日本アイ・ビー・エム]

ビジネスロジックの実装(2)

 エンティティBeanの作成が終わったので、次に、セッション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();
  }
} 
loginメソッド
public void modPass(String password) throws java.rmi.RemoteException {
  userinfoEntity.setPassword(password);
}
modPassメソッド
public void delUser() throws RemoteException {
  try {
    userinfoEntityHome.remove(userinfoEntity.getHandle());
    userinfoEntity = null;
  } catch (javax.ejb.RemoveException e) {
    e.printStackTrace();
  }
}
DelUserメソッド

 セッションBeanが出来上がったら、エンティティBeanと同様に配置コードを生成する。そして、呼び出される順番を考慮しつつ、テスト・クライアントを起動してセッションBeanもテストしておこう。VAJでEJBのテストを行うのであれば、VAJのデバッガを使って、ソースコード上でEnterpriseBeanのデバッグができる。

アクセス用Beanの作成

 最後に、テスト用に作った「UserinfoBean」をEJB用に作りなおす。プログラミング内容としては、次のような部分である。

フィールドの追加

  • UserinfoSessionHome
  • UserinfoSession
  • InitialContext

メソッドの修正

  • コンストラクタ
     ホーム・インターフェイスの取得
  • login
     UserinfoSessionのlogin( )を呼び出す
  • delUser
     UserinfoSessionのdelUser( )を呼び出す
  • modPass
     UserinfoSessionのmodPass( )を呼び出す

 以上を反映した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();
  }
}
}
UserinfoBean

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。