有兩種不同的方式有pageination彈簧:
- 使用額外的JSP組件如Display Tag libary - 這可能是很容易的,因爲在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;
}
}
甲Page
和PageRequest
是對象提供了通過陰間。如果你不使用哈迪斯,你可以很容易地用你自己的東西來替換它。page-1
in 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>
這裏使用了小豆標籤,重要的是UTIL:田野使用分頁:表,因爲它的尋呼東西添加到輸出:
字段:表.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>
我不需要另一個「東西」來安裝。我已經走得太遠了,問題是:爲了簡化事情安裝了spring。沒有找到我正在尋找的東西,這是一個全面的應用程序(UI工具在哪裏?),答案是在春天之上安裝一些東西......(roo)。也許roo真的很簡單,並且「做」了一些工作,但可能它使用它的首選libraries.say GWT.well,我沒有打算使用gwt,我希望春天能夠解決一些基本的UI問題。盒子的意思是不需要安裝一個(很簡單但是)需要安裝B的那個... – AgostinoX 2011-06-17 07:45:45
@AgostinoX:你可以使用Roo來產生GWT的gui,但是這在onyl的一個選項中,另外一個是產生正常的HTML gui(wihtout GWT) – Ralph 2011-06-17 07:50:31
@AgostinoX:如果你正在尋找一些輕鬆而又容易學習的曲線,那就忘了Spring吧。 Spring和它的邊項目(Spring Security就是你的情況)可以完成你想要的所有事情,但要做一些工作並不是一天的工作。您必須首先了解其核心概念,使用將處理所需功能不同方面的不同組件,然後將這些組件的原型組合在一起。這是值得的恕我直言,但不要指望一些非常簡單和快速的東西。併爲Roo +1。 – abalogh 2011-06-17 09:42:28