Java如何做到分页显示
分析需求:
必须返回:总页数(int)+查询的表数据(List<Map<String,String>>)
因此可封装成:
int pageCount;
List<Map<String,String>> datas;
Map<String,Object> map = new HashMap<String,Object>();
map.put("pageCount",pageCount);
map.put("datas",datas);
Java方面
写一个DAO:
public interface PageDAO {
public Map<String,Object> query(Integer pageNo) throws Exception;
}
他的实现类
@Override
public Map<String, Object> query(Integer pageNo) throws Exception {
Map<String, Object> result= new HashMap<String, Object>();
//每一页显示10个数据
int pageSize= 10;
//计算总页数 总页数= 行数 / pageSize +(行数%pageSize==0 ? 0:1)
//总行数
String sql = "SELECT COUNT(1) FROM stud ";
QueryRunner run = new QueryRunner(C3p0Pool.getDataSource());
int rows = Integer.parseInt(""+run.query(sql, new ScalarHandler()));
int pageCount = rows/pageSize +(rows%pageSize==0? 0 : 1 ) ;
result.put("pageCount",pageCount);//封装总页数
//查询表数据
int stratN= (pageNo-1)*pageSize;
sql= "select * from stud limit "+ stratN +","+ pageSize;
List<Map<String,Object>> datas = run.query(sql, new MapListHandler());
result.put("datas",datas);
return result;
}
Web方面:
在indexjsp页面直接跳转
PageServlet:
public class PageServlet extends HttpServlet {
// 注入service
IPageService service = new PageService();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 当前要查询的页 序号
String sPageNo = request.getParameter("page");
if (sPageNo == null || sPageNo.trim().length() == 0) {
sPageNo = "1";
}
Integer pageNo = null;
try {
pageNo = Integer.parseInt(sPageNo);
} catch (NumberFormatException e) {
System.out.println("页面异常");
}
// 调用service
try {
Map<String, Object> res = service.query(pageNo);
//往res中 添加当前的页序号
res.put("currentPage", pageNo);
//导向分页后的页面
request.setAttribute("res", res);
request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
} catch (Exception e) {
System.out.println("导向错误页面");
}
}
}
show.jsp
导入标准标签库:
<%@ taglib uri="http://java.sun/jsp/jstl/core" prefix="c"%>
然后从后台用EL表达式拿数据:
<body>
<h3>学生信息</h3>
<!-- 类似于增强for循环,从res.datas(后台把查询到的信息放到此)中拿,
放到map中,在从map中用EL表达式拿
-->
<c:forEach items="${res.datas}" var="map">
${map.id} , ${map.name }<br />
</c:forEach>
<hr />
<!-- 后台封装了一个当前页currentPage,判断是否是第一页,不是就加一个上一页
-->
<c:set value="${res.pageCount}" var="pageCount"></c:set>
<c:if test="${res.currentPage != 1}">
<a href="<c:url value='/PageServlet?page=${res.currentPage-1}'/>">上一页</a>
</c:if>
<!-- 用for循环,从1开始到总页数pageCount, -->
<c:forEach begin="1" end="${pageCount}" var="idx">
<c:if test="${res.currentPage == idx}">
${idx}
</c:if>
<!-- 判断是否为当前页,不是则将现在的页码,用url传到后台,由后台处理 -->
<c:if test="${res.currentPage != idx}">
<a href="<c:url value='/PageServlet?page=${idx}'/>">${idx}</a>
</c:if>
</c:forEach>
<c:if test="${res.currentPage != pageCount}">
<a href="<c:url value='/PageServlet?page=${res.currentPage+1}'/>">下一页</a>
</c:if>
<hr />
<!--这是用下拉菜单的形式做分页查询 -->
<select onchange="sub(this)">
<c:forEach begin="1" end="${pageCount}" var="idx">
<option <c:if test='${idx==res.currentPage }'>selected</c:if> value="${idx }">第${idx }页</option>
</c:forEach>
</select>
<script type="text/javascript">
function sub(obj) {
window.location.href="<c:url value='/PageServlet?page='/>"+ obj.value;
}
</script>
</body>
连接池的工具包
http://pan.baidu/s/1hrQBXyO
更多推荐
Java如何做到分页显示
发布评论