検索結果の格納と表示

検索結果のリストの各要素はメディアなどのコードを持っているだけで、データ自体は持っていない。そこで事前に作成しておいたコードとその内容の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>

ページ表示画面