数据分页是软件开发中一项重要的工作,一般包括两类处理方法:
1.后台完成数据分页的分页功能,也就是在获得显示数据的时候就进行分页处理,只获得页面所要显示的数据内容
适用于大型系统,可以避免一次性从数据库中读取大量数据所带来的资源消耗
2.在后台获得所有的数据,而在前台显示的时候有选择的输出所要显示的内容
适用于数据量较小的情况,特别适用于那些对只读数据的显示
数据分页跟用户关系最为密切的就是我们常看到的,First Previous 1 2 Next Last.
这两天正好要实现这个,所以研究了下面两种方法:
1.前端显示和后端的数据读取完全自己写
在struts的web开发中,数据获取只要action对象得到数据记录条,而最关键就在于前台的显示页面,因为逻辑和控制数据输出都在这个页面显示的。这里关键要用到几个标记,我就不分开说明了,看代码吧
<div align="center">
<h3>Paging</h3>
<c:set var="listSize" value="${fn:length(presidents)}"/>
<c:set var="pageSize" value="10"/>
<c:set var="pageBegin" value="${param.pageBegin}"/>
<c:set var="pageEnd" value="${pageBegin + pageSize - 1}"/>
<c:if test="${(pageBegin - pageSize) ge 0}">
<a href='<c:url value="/page.do">
<c:param name="pageBegin" value="${pageBegin - pageSize}"/>
</c:url>'>
Prev
</a>
</c:if>
<c:if test="${(listSize gt pageSize) and (pageEnd lt listSize)}">
<a href='<c:url value="/page.do">
<c:param name="pageBegin" value="${pageBegin + pageSize}"/>
</c:url>'>
Next
</a>
</c:if>
<table border="2">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Term of Office</th>
</tr>
<c:forEach var="pres" items="${presidents}"
begin="${pageBegin}" end="${pageEnd}">
<tr>
<td><c:out value="${pres.firstName}"/></td>
<td><c:out value="${pres.lastName}"/></td>
<td><c:out value="${pres.term}"/></td>
</tr>
</c:forEach>
</table>
</div>
在页面中要注意包含
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
另外注意在web.xml中配置jsp taglib
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/functions</taglib-uri>
<taglib-location>/WEB-INF/fn.tld</taglib-location>
</taglib>
</jsp-config>
而对于第二个包,要注意lib里面standard.jar的版本,在低版本中是没有functions的,在测试中就遇到了此问题。
2.借助插件jquery.pagination.js,再加上一些处理函数可以让前后端过程非常易于控制和更改
页面上:
<div id="Pagination" class="pagination">
</div>
初始化页面时:
var totalPages = 10;
//pagination element settings
$("#Pagination").pagination(totalPages, {
first_text:"First",
prev_text:"Previous",
next_text:"Next",
last_text:"Last",
ellipse_text:" ",
num_edge_entries: 2,
num_display_entries: 1,
callback: pageselectCallback
});
回调函数:
function pageselectCallback(page_id, jq){
//retrieve data process;
//data display
$('#Searchresult').text("Result "+((page_id*10)+1)+"-"+((page_id*10)+10));
}
这样在每次点击页码之后就能得到page_id,jq. 之后在回调函数中,retrieve data 就可以根据返回的参数page_id去获取数据,如果是结合ajax,那么就可以实现页面的无刷新翻页
因为在这个项目中没有用到struts的MVC控制框架,所以我是用了第二种方法