需求:做出类似百度这样页码限制的数据分页查询的功能网页
在数据库中通过数据的总行数以及你想要每次获取多少数据,就可以得到想要的页数
总页数 = 总行数/pageSize + (行数%pageSize==0?0:1);
所以获取数据的方法:
package cn
.hncu.dao
import java
.util.HashMap
import java
.util.List
import java
.util.Map
import javax
.faces.model.ScalarDataModel
import org
.apache.commons.dbutils.QueryRunner
import org
.apache.commons.dbutils.handlers.MapListHandler
import org
.apache.commons.dbutils.handlers.ScalarHandler
import cn
.hncu.domain.Stud
import cn
.hncu.pubs.dbutilsC3po
public class PageDaoImpl implements PageDAO {
@Override
public Map<String, Object> query(Integer pageNo, Stud s) throws Exception {
Map<String, Object> result = new HashMap<String, Object>()
int pageSize =
10
// 计算总页数
// 总页数 = 总行数/pageSize + (行数%pageSize==
0?
0:
1)
// 查询总行数
int startN = (pageNo -
1) * pageSize
String sql =
"select count(1) from stud2 where 1=1"
String sql2 =
"select * from stud2 where 1=1 "
if (s
.getId() != null && s
.getId()
.trim()
.length() >
0) {
sql = sql +
" and id like '%" + s
.getId()
.trim() +
"%'"
sql2 = sql2 +
" and id like '%" + s
.getId()
.trim() +
"%'"
}
if (s
.getName() != null && s
.getName()
.trim()
.length() >
0) {
sql = sql +
" and name like '%" + s
.getName()
.trim() +
"%'"
sql2 = sql2 +
" and name like '%" + s
.getName()
.trim() +
"%'"
}
QueryRunner run = new QueryRunner(dbutilsC3po
.getDataSource())
int rows = Integer
.parseInt(
"" + run
.query(sql, new ScalarHandler()))
// 总页数
int pageCount = rows / pageSize + (rows % pageSize ==
0 ?
0 :
1)
result
.put(
"pagecount", pageCount)
result
.put(
"pagesize", pageSize)
sql2 = sql2 +
" limit " + startN +
"," + pageSize
List<Map<String, Object>> studs = run
.query(sql2, new MapListHandler())
result
.put(
"studs", studs)
return result
}
}
那么我们应该如何将这些数据在页面中显示并且限制它的页数呢
package cn.hncu.pubs;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class pageUtils {
/**
* 计算显示当前分页的起始页
*
* @param pageNum
* 当前页码
* @param pageCount
* 总页数
* @param sideNum
* 分页系数 分页条中显示几个数字页码。 显示数字页码个数 = 2 * sideNum + 1
* @param result
* @param response
* @param request
*/
public static void calcPage(
int pageNum,
int pageCount,
int sideNum,
Map<String, Object> result) {
int startNum =
0;
int endNum =
0;
if (pageCount <= sideNum) {
endNum = pageCount;
}
else {
if ((sideNum + pageNum) >= pageCount) {
endNum = pageCount;
}
else {
endNum = sideNum + pageNum;
if ((sideNum + pageNum) <= (
2 * sideNum +
1)) {
if ((
2 * sideNum +
1) >= pageCount) {
endNum = pageCount;
}
else {
endNum =
2 * sideNum +
1;
}
}
else {
endNum = sideNum + pageNum;
}
}
}
if (pageNum <= sideNum) {
startNum =
1;
}
else {
if ((pageNum + sideNum) >= pageCount) {
if ((
2 * sideNum +
1) >= pageCount) {
if ((pageCount -
2 * sideNum) >=
1) {
startNum = pageCount -
2 * sideNum;
}
else {
startNum =
1;
}
}
else {
startNum = pageCount -
2 * sideNum;
}
}
else {
if ((pageNum - sideNum) >=
1) {
startNum = pageNum - sideNum;
}
else {
startNum =
1;
}
}
}
result.put(
"startNum", startNum);
result.put(
"endNum", endNum);
}
}
然后通过jstl+el在页面获取数据:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>分页查询结果页面</title>
</head>
<body>
<c:forEach items="${results.studs }" var="s">
${s.id} ${s.name}<br />
</c:forEach>
</body>
<hr />
<c:if test="${results.currentPage!=1}">
<a
href="<c:url value='/PageServlet?pageno=${results.currentPage-1}' />">
上一页 </a>
</c:if>
<c:forEach begin="${results.startNum }" end="${results.endNum }"
var="idx">
<c:if test="${results.currentPage==idx}">
${idx}
</c:if>
<c:if test="${results.currentPage!=idx}">
<a href="<c:url value='/PageServlet?pageno=${idx}' />"> ${idx} </a>
</c:if>
</c:forEach>
<c:if test="${results.currentPage!=results.pagecount}">
<a
href="<c:url value='/PageServlet?pageno=${results.currentPage+1}' />">
下一页 </a>
</c:if>
<select onchange="sub(this);">
<c:forEach begin="1" end="${results.pagecount}" var="idx">
<option <c:if test='${idx==results.currentPage}'>selected</c:if>
value="${idx}">第${idx}页</option>
</c:forEach>
</select>
<form action="<c:url value='/PageServlet'/>" method="post">
id中包含:<input type="text" name="id" /> <br/>
name中包含:<input type="text" name="name" /> <br/>
<input type="submit" name="addquery" value="查询" />
</form>
<script type="text/javascript">
function sub(obj) {
window.location.href = "<c:url value='/PageServlet?pageno='/>"
+ obj.value;
}
</script>
</html>