少し空いてしまいましたが、本日はGAE開発日記の11回目です。台帳一覧からクリックされた台帳の詳細を表示する部分のコードを紹介します。
以下が台帳一覧画面と台帳詳細画面のイメージです。


まず台帳一覧側のJSPのコードを見てください。
[ledgerlist.jsp]
台帳名のリンクがクリックされたら、showDetail()というJavaScriptの関数が呼ばれるようにしています。
Scriptの内容はこんな感じです。
[ledgerlist.jsp]
formの要素としてname属性にledger_idという値を持つhiddenタグをあらかじめ作成しておき、
スクリプトでそのタグの値にクリックされた台帳レコードのIDを設定してフォームをサブミットしています。
次にリクエストを処理するハンドラクラスのコードを見てください。
[LedgerDetail.java]
リクエストから台帳のコードを取得し、Daoクラスに渡して台帳クラスのインスタンスを取得しています。
そして、取得した台帳クラスのインスタンスをRequestオブジェクトに設定し、JSPにリクエストのフォワードしています。
次はDaoクラスのコードです。
[LedgerDao.java]
IDからインスタンスを取得するためのメソッドはPersistenceManagerクラスのgetObjectById()メソッドです。
黄色時の部分はデータストアから各属性のデータをロードするための処理です。GAEのデータストアでは、
オブジェクトの属性の型が他のクラスの場合、接続が開かれているうちにその属性のアクセスしておかないと
ロードが行われません。
今回の例で言うと台帳クラスの台帳名(ledgerName)は自動的にロードされますが、作成ユーザ(createdBy)や
台帳ユーザ一覧(List<LedgerUser>)はアクセスしないとロードされません。
台帳の詳細画面では台帳を使用可能なユーザ等も表示するためにこの処理が必須になります。
最後に詳細画面のJSPです。
[ledgerdetail.jsp]
少しづつですがまた進めていきます。
以下が台帳一覧画面と台帳詳細画面のイメージです。


まず台帳一覧側の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