気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今回は、まず台帳登録の機能を作成してみます。その前に物品管理システムの
画面構成を整理してみます。以下が画面遷移図です。



まずは台帳を登録し、登録した台帳に対して物品を登録していく流れです。
なので、まず台帳を登録する画面から作っていきたいと思います。
画面イメージはこんな感じです。



クラス設計
まずは、簡単にクラス設計を行ってみます。



台帳登録を処理する「RequestHandler」の実装クラスは、「RegistLedger」クラスです。
しかし、データストアへの登録処理自体はさらにDAOの役割をする「LedgerDao」クラスで
行います。

Web版の他にWindowsアプリ版を計画していて、その際には、出力がHTMLでは無く、
XMLになります。

「RequestHandler」の実装クラスのメソッドには、JSPのファイル名を直接記述するので、
Windowsアプリ版を開発する際に、これらを使いまわすことは無いと考えています。

一方、データストアに対する操作は、Web版とWindowsアプリ版で共通の処理になるので、
データストアを操作する部分を外だししておくことで、後で使いまわすことが出来ると
考えました。

データストアへの登録処理
台帳を登録する際に、台帳を作成したログインユーザを台帳を使用可能なユーザとして登録します。
「台帳」は「Ledger」クラス、「台帳のユーザ」は「LedgerUser」クラスで管理します。

それでは、まず「RegistLedger」のコードを紹介します。

「RegistLedger.java」
public class RegistLedger implements RequestHandler {

   @Override
   public void execute(HttpServletRequest req, HttpServletResponse resp)
      throws Exception {
      
      //台帳名をパラメータから取得する
      String ledgerName = req.getParameter("ledger_name");
      
      //ログインユーザを取得する
      UserService service = UserServiceFactory.getUserService();
      User user = service.getCurrentUser();
      
      //台帳クラスの属性を設定する
      Ledger ledger = new Ledger();
      ledger.setLedgerName(ledgerName);
      ledger.setCreatedOn(Calendar.getInstance().getTime());
      ledger.setCreatedBy(user);
      
      //台帳ユーザクラスの属性を設定する
      LedgerUser ledgerUser = new LedgerUser();
      ledgerUser.setLedger(ledger);
      ledgerUser.setUser(user);
      
      //台帳に台帳ユーザを設定する
      ledger.getLedgerUser().add(ledgerUser);
      
      //データストアへの登録処理
      LedgerDao dao = new LedgerDao();
      dao.RegistLedger(ledger);
      
      //Forwards to JSP.
      RequestDispatcher dispatcher =  req.getRequestDispatcher("/ctl/LedgerList");
      dispatcher.forward(req, resp);
   }
}

「Ledger」クラスと「LedgerUser」クラスのインスタンスを生成し、それをDAOクラスに渡しています。
「Ledger」クラスが「LedgerUser」クラスを所有する関係になっているので、「Ledger」のインスタンスを登録すれば、
自動的に「LedgerUser」のインスタンスも登録されることになります。

上記のコードでは、ユーザが入力した台帳のサイズチェックを行っていません。
これは、GAEのデータストアのString型はバイト数ではなく文字数によって、最大サイズが決められているため、
クライアント側のJavaScriptでもチェック可能なためです。

GAEのドキュメントのこの記述はちょっと、混乱させられてしまいますね。。
「A value longer than 500 bytes throws a JDOFatalUserException.」

そして、以下が、「LedgerDao」のコードです。

「LedgerDao.java」
public class LedgerDao {

   public void RegistLedger(Ledger ledger)
   {
      //Initialize PersistenceManager.
      PersistenceManager pm = PMFHelper.get().getPersistenceManager();
      
      javax.jdo.Transaction tx = pm.currentTransaction();
      
      try
      {
         tx.begin();
         
         pm.makePersistent(ledger);
         
         tx.commit();
      }
      finally
      {
         if (tx.isActive())
         {
            try
            {
               tx.rollback();
            }
            catch(Exception ex){}
         }
         
         pm.close();
      }
   }
}

PersistenceManagerのmakePersistent()の呼び出しは1回ですが、内部的には、
「Ledger」のインスタンスと「LedgerUser」クラスのインスタンスの登録が行われるため、
トランザクションを使用する必要があります。

これで台帳の登録は完了です。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/56-ff508d19

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。