検索結果の格納と表示
検索結果のリストの各要素はメディアなどのコードを持っているだけで、データ自体は持っていない。そこで事前に作成しておいたコードとその内容のMapを利用して名称を各POJOに設定する。
Actionの該当個所の抜粋
List<Item> items = iService.findItems(item); for(Item item : items) { item.setGanreCodeName(pdUtils.getGanre(item.getGanreCode())); item.setMediaCodeName(pdUtils.getMedia(item.getMediaCode())); item.setPlaceCodeName(pdUtils.getPlace(item.getPlaceCode())); item.setOwnerCodeName(pdUtils.getOwner(item.getOwnerCode())); }
Itemクラスのデータ部分の抜粋
/** コード */ private int code; /** 頭文字 **/ private String topChar; /** アーティスト */ private String artist; /** タイトル */ private String title; /** 作成年 */ private int year; /** ジャンルコード */ private int ganreCode; /** メディアコード */ private int mediaCode; /** 保管場所コード */ private int placeCode; /** 所有者コード */ private int ownerCode; /** ジャンルの名前 */ private String ganreCodeName; /** メディアの名前 */ private String mediaCodeName; /** 保管場所の名前 */ private String placeCodeName; /** 所有者の名前 */ private String ownerCodeName;
検索結果のListはsessionIDをキーとしたMapに格納し、表示対象のページ分だけをSubListとして抜き出しHttpSession#setAttributeでsessionに入れる。
又この際、表示されている開始データ、終了データが何番目か、全件は何件か、またページ移動の為の移動可能な開始ページ、終了ページ、現在ページ番号をrequest,sessionなどに入れている。
Actionの該当個所
HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); rdManager.setRetrieveData(session, items); rdManager.getRetrieveSubList(request, 1);
関連するメソッド(getRetrieveSubList)
@Override public void getRetrieveSubList(HttpServletRequest request, int currentPage) { HttpSession session = request.getSession(); List<Item> originalList = (List<Item>)retrieveDataMap.get(session.getId()); int size = originalList.size(); int pageSize = SystemSettingUtils.getRetrievePageSize(); int start = (currentPage - 1) * pageSize; int end = start + pageSize - 1; end = end > (size - 1)?size - 1:end; int startCount = end == -1? 0: start + 1; int endCount = end == -1? 0: end + 1; List<Item> subList = null; if(startCount != 0 && endCount != 0) { subList = originalList.subList(start, end + 1); } session.setAttribute("items", subList); request.setAttribute("start", new Integer(startCount)); request.setAttribute("end", new Integer(endCount)); request.setAttribute("all", new Integer(size)); int startPage = currentPage; int endPage; int lastPage; if(size % pageSize != 0) { lastPage = size / pageSize + 1; } else { lastPage = size / pageSize; } int retrieveIndexCount; retrieveIndexCount = SystemSettingUtils.getRetrieveIndexCount(); if(startPage == currentPage) { int candidateStartPage = startPage != lastPage?startPage - retrieveIndexCount/2:startPage - retrieveIndexCount + 1; if(candidateStartPage <= 0) { startPage = 1; } else { startPage = candidateStartPage; } } endPage = startPage + retrieveIndexCount - 1; if(endPage * pageSize > size) { if(size % pageSize != 0) { endPage = size / pageSize + 1; } else { endPage = size / pageSize; } } session.setAttribute("startPage", new Integer(startPage)); session.setAttribute("currentPage", new Integer(currentPage)); session.setAttribute("endPage", new Integer(endPage)); }
ページ表示のJSP(わかりやすいので説明はしない)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="title.retrieveResult"/></title> </head> <body> <% int start = (Integer)request.getAttribute("start"); int end = (Integer)request.getAttribute("end"); int all = (Integer)request.getAttribute("all"); %> <table> <td width="200"> <%=start %>--<%=end %>(<s:text name="label.all"/><%=all %><s:text name="label.count"/>) <% int startPage = (Integer)session.getAttribute("startPage"); int currentPage = (Integer)session.getAttribute("currentPage"); int endPage = (Integer)session.getAttribute("endPage"); %> </td> <td> <% for(int i = startPage; i <= endPage; i++) { if(i != currentPage) { out.print("<a href=\"MovePage.action?page=" + i + "\">" + i + "</a>"); } else { out.print("<b><font size=+2>" + i + "</font></b>"); } } %> </td> </table> <table border="1"> <tr class="rheader"> <th><s:text name="label.artist"/></th> <th><s:text name="label.media"/></th> <th><s:text name="label.title"/></th> <th><s:text name="label.year"/></th> <th><s:text name="label.ganre"/></th> <th><s:text name="label.place"/></th> <th><s:text name="label.owner"/></th> <s:if test="#session['user'].modify_priv == true"> <th><s:text name="label.modify"/></th> </s:if> <s:if test="#session['user'].delete_priv == true"> <th><s:text name="label.delete"/></th> </s:if> </tr> <s:iterator value="#session['items']" status="itStatus"> <tr class="rcontents"> <td><s:property value="artist"/></td> <td><s:property value="mediaCodeName"/></td> <td><s:property value="title"/></td> <td><s:property value="year"/></td> <td><s:property value="ganreCodeName"/></td> <td><s:property value="placeCodeName"/></td> <td><s:property value="ownerCodeName"/></td> <s:if test="#session['user'].modify_priv == true"> <td> <s:form action="Modify_select"> <s:hidden name="code"/> <s:submit key="button.modify"/> </s:form> </td> </s:if> <s:if test="#session['user'].delete_priv == true"> <td> <s:form action="Delete_select"> <s:hidden name="code"/> <s:submit key="button.delete"/> </s:form> </td> </s:if> </tr> </s:iterator> </table> </body> </html>
ページ表示画面