気楽なソフト工房

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



mykonos2008

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

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
少し空いてしまいましたが、本日はGAE開発日記の11回目です。台帳一覧からクリックされた台帳の詳細を表示する部分のコードを紹介します。
以下が台帳一覧画面と台帳詳細画面のイメージです。





まず台帳一覧側のJSPのコードを見てください。

[ledgerlist.jsp]
・・・・(省略)

<table width="500px">
<tr>
    <td style="background-color: #ccccff;">
       &nbsp;
    </td>
    <td width="65%" style="background-color: #ccccff;">
       台帳名
    </td>
    <td style="background-color: #ccccff;">
       作成者</td>
    </tr>

<%
   List<Ledger> ledgerList = (List<Ledger>)request.getAttribute("ledger_list");

   for(Ledger ledger : ledgerList)
   {
%>
   <tr>
       <td>
          <input name="chk_id" value="<%=  ledger.getKey().getId() %>" type="checkbox"/>
       </td>
       <td>
          <a href="#" onClick="showDetail('<%= ledger.getKey().getId() %>')">
              <%= ledger.getLedgerName() %>
          </a>
       </td>
       <td>
              <%= ledger.getCreatedBy() %>
       </td>
   </tr>
<%
   }
%>
</table>

・・・・(省略)

<input type="hidden" name="ledger_id"/>


台帳名のリンクがクリックされたら、showDetail()というJavaScriptの関数が呼ばれるようにしています。
Scriptの内容はこんな感じです。

[ledgerlist.jsp]
function showDetail(ledgerId)
{
    document.fm.action = "/ctl/LedgerDetail";
    document.fm.ledger_id.value = ledgerId;
    document.fm.submit();
}

formの要素としてname属性にledger_idという値を持つhiddenタグをあらかじめ作成しておき、
スクリプトでそのタグの値にクリックされた台帳レコードのIDを設定してフォームをサブミットしています。

次にリクエストを処理するハンドラクラスのコードを見てください。

[LedgerDetail.java]

    public void execute(HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        
        //詳細を表示する台帳のIDを取得する
        String id = req.getParameter("ledger_id");
        
        //台帳を取得する
        LedgerDao dao = new LedgerDao();
        Ledger ledger = dao.getLedger(id);
        
        //リクエストに台帳を設定する
        req.setAttribute("ledger", ledger);
        
        //Forwards to JSP.
        RequestDispatcher dispatcher =  req.getRequestDispatcher("/pages/ledgerdetail.jsp");
        dispatcher.forward(req, resp);

    }

リクエストから台帳のコードを取得し、Daoクラスに渡して台帳クラスのインスタンスを取得しています。
そして、取得した台帳クラスのインスタンスをRequestオブジェクトに設定し、JSPにリクエストのフォワードしています。

次はDaoクラスのコードです。

[LedgerDao.java]
    public Ledger getLedger(String id)
    {
        //Initialize Persistent Manager.
        PersistenceManager pm = PMFHelper.get().getPersistenceManager();
        
        Ledger ledger = null;
        
        try
        {
            //String型のIDをlong型に変換し、Ledgerクラスのインスタンスを
            //データストアから取得する
            long longId = Long.parseLong(id);
            ledger = pm.getObjectById(Ledger.class,longId);

            //データストアからデータをロードするための処理
            ledger.getCreatedBy(); //台帳の作成ユーザ
            
            //台帳を使用可能なユーザ
            for(LedgerUser user : ledger.getLedgerUser())
            {
                user.getUser();
            }
        }
        finally
        {
            pm.close();
        }
    
        return ledger;
    }

IDからインスタンスを取得するためのメソッドはPersistenceManagerクラスのgetObjectById()メソッドです。

黄色時の部分はデータストアから各属性のデータをロードするための処理です。GAEのデータストアでは、
オブジェクトの属性の型が他のクラスの場合、接続が開かれているうちにその属性のアクセスしておかないと
ロードが行われません。

今回の例で言うと台帳クラスの台帳名(ledgerName)は自動的にロードされますが、作成ユーザ(createdBy)や
台帳ユーザ一覧(List<LedgerUser>)はアクセスしないとロードされません。

台帳の詳細画面では台帳を使用可能なユーザ等も表示するためにこの処理が必須になります。

最後に詳細画面のJSPです。

[ledgerdetail.jsp]
・・・・(省略)
<%
  Ledger ledger = (Ledger)request.getAttribute("ledger");
%>
・・・・(省略)
<div style="text-align: left;font-weight: bold;">台帳名</div>
<div style="text-align: left;"><input type="text" value="<%= ledger.getLedgerName() %>" size="50"></div>
・・・・(省略)
<table width="400px">
<tr id="acthdr" style="background-color: #ccccff;"><th width="5%"></th><td>アカウント</td></tr>

<!-- 使用可能ユーザ一覧 -->
<% 
    for(LedgerUser user : ledger.getLedgerUser())
    {
%>
<tr>
   <td>
<%
      //作成ユーザ以外の使用可能ユーザを削除できるようにチェックボックスの表示を制御する
      if(!user.getUser().getEmail().equals(ledger.getCreatedBy().getEmail()))
      {
%>
       <input type="checkbox"/>
<%
      }
      else
      {
%>
       &nbsp;
<%
      }
%>
   </td>
   <td>
       <%= user.getUser().getEmail() %>
   </td>
 </tr>
<%
    }
%>
</table>

少しづつですがまた進めていきます。

コメント

コメントの投稿

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

トラックバック

http://csfun.blog49.fc2.com/tb.php/67-81746b46

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