Displaytag1.1支持在外部實現大數據量分頁。主要有兩種方式實現:
Displaytag 1.1 offers two alternative ways for working with partial lists:
-
the first one uses the valuelist pattern, and requires that the object that you give to displaytag implements the org.displaytag.pagination.PaginatedList interface. You can pass this object to displaytag as an usual list, and it will extract paging and sorting information from it. This way is more recommended if you have to build your backend layer and you can easily follow this pattern.
-
a second way, recommended if you only have to use partial list for few tables that show a performance problem using full lists, is passing all the needed parameters as separate tag attributes (recors to be shown, page number, total number of records...)
其中第二種方式看起來較為簡單,只需在<displaytag>中增加兩個屬性:partialList="true"size="resultSize"即可,但是在使用發現這種方式由于是在原來內存分頁的基礎上修改的,所以還是存在一些Bug(比如:分頁導航的值不會變......)
所以這里介紹Displaytag推薦的第一種方式,即:
實現org.displaytag.pagination.PaginatedListorg.displaytag.pagination.PaginatedList接口。
實現PaginatedList接口:
import
?java.util.List;

import
?org.displaytag.pagination.PaginatedList;
import
?org.displaytag.properties.SortOrderEnum;


/**?*/
/**
?*?分頁列表
?*?
?*?
@author
?John.Zhu
?*?
?
*/
public
?
class
?PageList?
implements
?PaginatedList?
{

????
/**?*/
/**
?????*?每頁的列表
?????
*/
????
private
?List?list;


????
/**?*/
/**
?????*?當前頁碼
?????
*/
????
private
?
int
?pageNumber?
=
?
1
;


????
/**?*/
/**
?????*?每頁記錄數?page?size
?????
*/
????
private
?
int
?objectsPerPage?
=
?
15
;


????
/**?*/
/**
?????*?總記錄數
?????
*/
????
private
?
int
?fullListSize?
=
?
0
;

????
private
?String?sortCriterion;

????
private
?SortOrderEnum?sortDirection;

????
private
?String?searchId;


????
public
?List?getList()?
{
????????
return
?list;
????}
????
public
?
void
?setList(List?list)?
{
????????
this
.list?
=
?list;
????}
????
public
?
int
?getPageNumber()?
{
????????
return
?pageNumber;
????}
????
public
?
void
?setPageNumber(
int
?pageNumber)?
{
????????
this
.pageNumber?
=
?pageNumber;
????}
????
public
?
int
?getObjectsPerPage()?
{
????????
return
?objectsPerPage;
????}
????
public
?
void
?setObjectsPerPage(
int
?objectsPerPage)?
{
????????
this
.objectsPerPage?
=
?objectsPerPage;
????}
????
public
?
int
?getFullListSize()?
{
????????
return
?fullListSize;
????}
????
public
?
void
?setFullListSize(
int
?fullListSize)?
{
????????
this
.fullListSize?
=
?fullListSize;
????}
????
public
?String?getSortCriterion()?
{
????????
return
?sortCriterion;
????}
????
public
?
void
?setSortCriterion(String?sortCriterion)?
{
????????
this
.sortCriterion?
=
?sortCriterion;
????}
????
public
?SortOrderEnum?getSortDirection()?
{
????????
return
?sortDirection;
????}
????
public
?
void
?setSortDirection(SortOrderEnum?sortDirection)?
{
????????
this
.sortDirection?
=
?sortDirection;
????}
????
public
?String?getSearchId()?
{
????????
return
?searchId;
????}
????
public
?
void
?setSearchId(String?searchId)?
{
????????
this
.searchId?
=
?searchId;
????}
}
Contoller:
/**?*/
/**
?????*?分頁查詢
?????*?
?????*?
@param
?request
?????*?
@param
?response
?????*?
@return
?????*?
@throws
?Exception
?????
*/
????
private
?ModelAndView?paging(HttpServletRequest?request,

????????????HttpServletResponse?response,?ModelAndView?mav)?
throws
?Exception?
{
????????
//
?獲取當前頁數,displaytag通過參數"page"傳遞這個值
????????????????
int
?pageNumber;
????????
if
?(request.getParameter(
"
page
"
)?
!=
?
null
????????????????
&&
?
!
""
.equals(request.getParameter(
"
page
"
)))?
{
????????????pageNumber?
=
?Integer.parseInt(request.getParameter(
"
page
"
));

????????}
?
else
?
{
????????????pageNumber?
=
?
1
;
????????}
????????PageList?pageList?
=
?
new
?PageList();
????????Map?map?
=
?WebUtils.getParametersStartingWith(request,?
"
search_
"
);
????????Page?page?
=
?dao.query(map,?pageNumber,?PAGE_SIZE);
????????????????
//
?設置當前頁數
????????pageList.setPageNumber(pageNumber);
????????????????
//
?設置當前頁列表
????????pageList.setList(page.getResults());
????????????????
//
?設置page?size
????????pageList.setObjectsPerPage(PAGE_SIZE);
????????????????
//
?設置總頁數
????????pageList.setFullListSize(page.getTotalCount());

????????mav.addObject(
"
results
"
,?pageList);

????????
return
?mav;
????}
好了,現在直接在JSP上使用 displaytag就行了:
<
display:table?
name
="${results}"
?id
="row"
?class
="simple?nocol"
?pagesize
="${pageSize}"
?export
="true"
?
????????????????????decorator
="org.displaytag.decorator.TotalTableDecorator"
?
????????????????????requestURI
="${pageContext.request.contextPath}/pageQuery.do?method=paging"
>
??????????????? ?
<
display:column?
property
="date.time"
?title
="日期"
?format
="{0,date,yyyy-MM-dd}"
?sortable
="false"
?
/>
????????????????
<
display:column?
property
="code"
?title
="編碼"
?group
="1"
?sortable
="false"
?
/>
????????????????
<
display:column?
property
="name"
?title
="名稱"
?group
="1"
?sortable
="false"
?
/>
?????????????????
<
display:column?
property
="costTotal"
?title
="總額(元)"
?format
="{0,number,0,000}"
?total
="true"
?sortable
="false"
?
/>
</
display:table
>