Существует два различных способа создания страниц с помощью пружины:
- использование дополнительных компонентов JSP, таких как Библиотека тегов отображения - это может быть очень просто, поскольку в библиотеке JSPможет (но не обязан) полностью обрабатывать нумерацию страниц (недостаток: вам нужно загружать все элементы для каждого запроса или хранить их где-нибудь (например, в сеансе))
- Реализовать его самостоятельнов контроллере: это, например, как я это сделал в одном из моих приложений, он основан на структуре Roo (см. ответ Joeslice).Слой DAO реализован с Hades , но вы можете сделать это без.По крайней мере, это только для иллюстрации того, как работает контроллер (я думаю, это то, что вы просили).
Контроллер:
@RequestMapping("/users")
@Controller
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView list(
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "size", required = false) Integer size) {
if (page != null || size != null) {
Page<User> userPage = this.userDao.readAll(buildPageAble(page, size));
ModelMap uiModel = pagingProperties(userPage);
uiModel.addAttribute("users", userPage.asList());
return new ModelAndView("users/list", uiModel);
} else {
return new ModelAndView("users/list", "users", this.userDao.readAll());
}
}
private PageRequest buildPageAble(Integer pageOrNull, Integer sizeOrNull) {
int page = (pageOrNull != null) ? pageOrNull : 1;
int size = (sizeOrNull != null) ? sizeOrNull : DEFAULT_PAGE_SIZE;
return new PageRequest(page - 1, size);
}
private ModelMap pagingProperties(Page<?> pagedResult) {
ModelMap uiModel = new ModelMap();
uiModel.addAttribute("page", pagedResult.getNumber());
uiModel.addAttribute("size",pagedResult.getSize());
uiModel.addAttribute("maxPages", pagedResult.getTotalPages());
return uiModel;
}
}
A Page
и PageRequest
объекты, предоставленные Аидом.Если вы не используете Hades, вы можете легко заменить его на свои собственные вещи. page-1
в buildPageAble
объясняется тем, что базы интерфейса на Roo используют 1 для первой страницы, а Hades использует 0 для первой.
JSP основан на Spring Roo, но вы можете скопировать его и использовать без Roo.
список пользователей jspx:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:page="urn:jsptagdir:/WEB-INF/tags/form" xmlns:table="urn:jsptagdir:/WEB-INF/tags/form/fields" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8"/>
<jsp:output omit-xml-declaration="yes"/>
<page:list id="pl_com_queomedia_cfmt_core_domain_User" items="${users}">
<table:table data="${users}" id="l_com_queomedia_cfmt_core_domain_User" path="/users" typeIdFieldName="businessId">
<table:column id="c_com_queomedia_cfmt_core_domain_User_firstName" property="firstName"/>
<table:column id="c_com_queomedia_cfmt_core_domain_User_lastName" property="lastName"/>
<table:column id="c_com_queomedia_cfmt_core_domain_User_login" property="login"/>
<table:column id="c_com_queomedia_cfmt_core_domain_User_emailAddress" property="emailAddress" maxLength="25"/>
</table:table>
</page:list>
</div>
При этом используются теги Roo, важно использовать util: разбиение на страницы, используемое fields: table, потому чтоэто добавляет пейджинговый материал к выводу:
поля: table.tagx
...
<c:if test="${not empty param.page}">
<input name="page" type="hidden" value="1" />
</c:if>
<c:if test="${not empty param.size}">
<input name="size" type="hidden" value="${fn:escapeXml(param.size)}" />
</c:if>
...
<c:if test="${not empty maxPages}">
<util:pagination maxPages="${maxPages}" page="${param.page}" size="${param.size}" />
</c:if>
...
util: pagination.tagx
<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:spring="http://www.springframework.org/tags" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:output omit-xml-declaration="yes" />
<jsp:directive.attribute name="maxPages" type="java.lang.Integer" required="true" rtexprvalue="true" description="The maximum number of pages available (ie tableRecordCount / size)" />
<jsp:directive.attribute name="page" type="java.lang.Integer" required="false" rtexprvalue="true" description="The current page (not required, defaults to 1)" />
<jsp:directive.attribute name="size" type="java.lang.Integer" required="false" rtexprvalue="true" description="The number of records per page (not required, defaults to 10)" />
<jsp:directive.attribute name="render" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate if the contents of this tag and all enclosed tags should be rendered (default 'true')" />
<c:if test="${empty render or render}">
<c:if test="${empty page || page lt 1}">
<c:set var="page" value="1" />
</c:if>
<c:if test="${empty size || size lt 1}">
<c:set var="size" value="10" />
</c:if>
<spring:message code="list_size" var="list_size" htmlEscape="false" />
<c:out value="${list_size} " />
<c:forEach var="i" begin="5" end="25" step="5">
<c:choose>
<c:when test="${size == i}">
<c:out value="${i}" />
</c:when>
<c:otherwise>
<spring:url value="" var="sizeUrl">
<spring:param name="page" value="1" />
<spring:param name="size" value="${i}" />
</spring:url>
<a href="${sizeUrl}">${i}</a>
</c:otherwise>
</c:choose>
<c:out value=" " />
</c:forEach>
<c:out value="| " />
<c:if test="${page ne 1}">
<spring:url value="" var="first">
<spring:param name="page" value="1" />
<spring:param name="size" value="${size}" />
</spring:url>
<spring:url value="/resources/images/resultset_first.png" var="first_image_url" />
<spring:message code="list_first" var="first_label" htmlEscape="false" />
<a class="image" href="${first}" title="${fn:escapeXml(first_label)}">
<img alt="${fn:escapeXml(first_label)}" src="${first_image_url}" />
</a>
</c:if>
<c:if test="${page gt 1}">
<spring:url value="" var="previous">
<spring:param name="page" value="${page - 1}" />
<spring:param name="size" value="${size}" />
</spring:url>
<spring:url value="/resources/images/resultset_previous.png" var="previous_image_url" />
<spring:message code="list_previous" var="previous_label" htmlEscape="false" />
<a class="image" href="${previous}" title="${fn:escapeXml(previous_label)}">
<img alt="${fn:escapeXml(previous_label)}" src="${previous_image_url}" />
</a>
</c:if>
<c:out value=" " />
<spring:message code="list_page" arguments="${page},${maxPages}" argumentSeparator="," />
<c:out value=" " />
<c:if test="${page lt maxPages}">
<spring:url value="" var="next">
<spring:param name="page" value="${page + 1}" />
<spring:param name="size" value="${size}" />
</spring:url>
<spring:url value="/resources/images/resultset_next.png" var="next_image_url" />
<spring:message code="list_next" var="next_label" htmlEscape="false" />
<a class="image" href="${next}" title="${fn:escapeXml(next_label)}">
<img alt="${fn:escapeXml(next_label)}" src="${next_image_url}" />
</a>
</c:if>
<c:if test="${page ne maxPages}">
<spring:url value="" var="last">
<spring:param name="page" value="${maxPages}" />
<spring:param name="size" value="${size}" />
</spring:url>
<spring:url value="/resources/images/resultset_last.png" var="last_image_url" />
<spring:message code="list_last" var="last_label" htmlEscape="false" />
<a class="image" href="${last}" title="${fn:escapeXml(last_label)}">
<img alt="${fn:escapeXml(last_label)}" src="${last_image_url}" />
</a>
</c:if>
</c:if>
</jsp:root>