Java Web之分页的实现(通用)
一、用到的工具类的封装
为了实现代码的重用性,我们将经常用到的代码封装到工具类中,以便在任何地方都可以调用
1、获取路径工具
在jsp页面中,我们经常会向Servlet发送请求,并通过反射,实现通过传递不同的参数,调用Servlet的对应方法
因此,我们在工具类中封装一个获取路径的方法,用于获取jsp页面的请求路径及相关参数
1 public static String getPath(HttpServletRequest request){
String uri=request.getRequestURI(); //返回“项目名/请求Servlet名”的字符串
String quString=request.getQueryString(); //获取请求的参数部分
String path=uri+"?"+quString; //拼串,请求地址:项目名/servlet名?参数
if(path.contains("&pageNumber")){
//截串,将没有用的参数截去,只留下用于反射的method参数
path=path.substring(0, path.indexOf("&pageNumber"));
}
return path;
}
二、后台分页的实现
1、bean层:
创建Page实体类:注意Page类要应用泛型,实现可重用
属性:
private List<T> list; //当前页列表数据,数据库查询得到
private int pageNumber; //当前页码,前端页面传递
private int totalRecord; //总记录数,数据库查询得到
private int pageSize; //每页显示条数,在Servlet中指定
//private int totalPage; //总页数,计算得到
//private int index; //当前页的起始索引,计算得到
private String path; //用来设置Servlet访问路径及method参数
方法:
各个属性对应的get、set方法以及getTotalPage()和getIndex()方法,用来计算总页数和索引值
public class Page<T> {
private List<T> list; //当前页列表数据,数据库查询得到
private int pageNumber; //当前页码,前端页面传递
private int totalRecord; //总记录数,数据库查询得到
private int pageSize; //每页显示条数,前端页面传递
//private int totalPage; //总页数,计算得到
//private int index; //当前页的起始索引,计算
private String path; //用来设置Servlet访问路径及method参数 public Page() {
super();
} public Page(int pageNumber, int totalRecord, int pageSize) {
super();
this.pageNumber = pageNumber;
this.totalRecord = totalRecord;
this.pageSize = pageSize;
} public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getPageNumber() { //控制页码不能<1,也不能>totalPage
if(pageNumber<1){
pageNumber=1;
}else if (pageNumber>getTotalPage()) {
pageNumber=getTotalPage();
}
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return (int) Math.ceil((double)getTotalRecord()/getPageSize());
}
public int getIndex() {
return (getPageNumber()-1)*getPageSize(); //分页查询,在数据访问层一定会调用getIndex方法获得索引值
} //而在getIndex方法中调用了getPageNumber方法,保证了页码在正常范围内 public String getPath() {
return path;
} public void setPath(String path) {
this.path = path;
} }
2、Servlet层:
创建getPage(req,resp)方法,用来获取对应页码的数据并封装为Page类的对象
1)通过工具类获取请求路径
2)获取请求页码参数
3)调用Service层的getPage方法,获取请求页面的信息,并封装为Page类对象
4)设置Page类对象的path属性(访问路径)
5)通过request.setAttribute("page", page);将页面信息放入域中
6)将请求转发到页面
1 public void getPage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
String path=WEBUtils.getPath(request);
String pageNumber=request.getParameter("pageNumber"); //获取页码
Page<Book> page=new Page<Book>();
page=bookService.getPage(pageNumber,pageSize); //获取页面信息
page.setPath(path); //设置访问路径
request.setAttribute("page", page); //将页面信息放入域中
request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request, response);
}
3、Service层:
1)设置默认页码
2)pageNumber类型转换
3)获取总记录数
4)封装Page类对象
5)获取当前页的数据列表并封装到page中
public Page<Book> getPage(String pageNumber,int pageSize) {
int pageNo=1; //设置默认页码,当pageNumber类型转换出错时,会起作用,否则值被覆盖
Page<Book> page=null; try {
//servlet层获取的参数类型为string,需要转换为整型
pageNo=Integer.parseInt(pageNumber);
} catch (Exception e) {
System.out.println("字符串转换出错");
}
//1.获取总记录数
int totalRecord=bookDao.getRecordsCount();
//2.封装page对象
page=new Page<Book>(pageNo, totalRecord, pageSize);
//3.查询当前页对应的数据列表并封装到page对象中
List<Book> list=bookDao.getPageList(page.getIndex(),pageSize);
page.setList(list);
return page;
}
4、Dao层:
1)访问数据库,查询数据库中总记录数
2)访问数据库,通过limit index,number 实现分页查询,得到请求页的数据列表
public int getRecordsCount() {
conn=JDBCUtils.getConnection();
String sql="select count(*) as totalPage from book";
PreparedStatement ps=null;
ResultSet rs=null;
int totalPage=0; try {
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
if(rs.next()){
totalPage=rs.getInt("totalPage");
}
}catch(SQLException e){
e.printStackTrace();
} finally {
JDBCUtils.closeStatement(rs, ps);
JDBCUtils.closeConnection(conn);
}
return totalPage;
}
getRecordsCount()
public List<Book> getPageList(int index, int pageSize) {
conn=JDBCUtils.getConnection();
String sql="select id,book_name,author,price,sales,stock,img_path,create_date,update_date,status"
+ " from book limit ?,?";
PreparedStatement ps=null;
ResultSet rs=null;
List<Book> list=new ArrayList<Book>(); try {
ps=conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, pageSize);
rs=ps.executeQuery();
while (rs.next()) {
list.add(createBook(rs));
}
}catch(SQLException e){
e.printStackTrace();
}finally {
JDBCUtils.closeStatement(rs, ps);
JDBCUtils.closeConnection(conn);
}
return list;
}
getPageList(int index, int pageSize)
三、前台分页的实现
为了实现分页的通用性,我们在这里将分页的代码封装到一个新的jsp页面中
只需要在其他的jsp页面中通过<%@include file="XXX"%>标签导入,就可以实现分页功能
注意:
1、jsp页面中所有请求servlet的路径都通过${page.path}&pageNumber=XXX的形式(page.path由请求动态获取路径信息,具有通用性)pageNumber表示请求页码
2、第一页不能再向上一页跳转、末页不能再想下一页跳转问题:通过在Page类的getPageNumber方法中限制页码的范围实现
3、通过<c:set></c:set>设置页码在页面中出现的范围
1.总页码<=5时,显示所有页数
2.总页码>5时:
当前页码<=3时:显示1~5页
当前页码>3时:显示当前页在中间的5页
4、通过<c:forEach></c:forEach>显示由begin到end的5个页面,当前页用【】标识
<div class="page">
<a href="${page.path}&pageNumber=1">首页</a>
<a href="${page.path}&pageNumber=${page.pageNumber-1}">上一页</a>
<!--
始终保证当前页在中间,一共显示5页
1.总页码<=5时,显示所有页数
2.总页码>5时:
当前页码<=3时:显示1~5页
当前页码>3时:显示当前页在中间的5页,当当前页为倒数前3页时,显示最后5页
-->
<c:choose>
<c:when test="${page.totalPage<=5}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${page.totalPage}"></c:set>
</c:when>
<c:when test="${page.pageNumber<=3}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="5"></c:set>
</c:when>
<c:when test="${page.pageNumber>3}">
<c:set var="begin" value="${page.pageNumber-2}"></c:set>
<c:set var="end" value="${page.pageNumber+2}"></c:set>
<c:if test="${page.pageNumber+2>=page.totalPage}">
<c:set var="begin" value="${page.totalPage-4}"></c:set>
<c:set var="end" value="${page.totalPage}"></c:set>
</c:if>
</c:when>
</c:choose>
<!-- 通过循环显示由begin到end的5个页面,当前页用【】标识 -->
<c:forEach begin="${begin}" end="${end}" var="index">
<c:if test="${page.pageNumber==index}">
<a href="${page.path}&pageNumber=${index}">【${index}】</a>
</c:if>
<c:if test="${page.pageNumber!=index}">
<a href="${page.path}&pageNumber=${index}">${index}</a>
</c:if>
</c:forEach> <a href="${page.path}&pageNumber=${page.pageNumber+1}">下一页</a>
第${page.pageNumber}页,共${page.totalPage}页
转到第<input id="setPage" type="text" value="${page.pageNumber}"/>页,<a id="goto" href="">跳转</a>
<a href="${page.path}&pageNumber=${page.totalPage}">末页</a>
<script type="text/javascript">
window.onload=function(){
var agoto=document.getElementById("goto");
agoto.onclick=function(){
var setPage=document.getElementById("setPage").value;
window.location="${page.path}&pageNumber="+setPage;
return false;
};
};
</script>
<!--或 <script type="text/javascript">
$(function(){
$("#goto").click(function(){
var $setPage=$("#setPage").val();
window.location="/MyBookStore/book?method=getPage&pageNumber="+$setPage;
return false;
});
});
</script> -->
</div>
Java Web之分页的实现(通用)的更多相关文章
- Java Web -【分页功能】详解
分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...
- (转)java web自定义分页标签
转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...
- Java Web(十) 分页功能
分页 分页的使用非常普遍,现在一步步的把分页功能实现出来,先看看已经写好的效果: 该页面的所有数据都存放在一个javaBean对象(PageBean)里,每次访问该页面时,Serlvet就会把page ...
- Java Web(十一) 分页功能的实现
虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果自己手写是一个怎样的流程的?今天就来说说它,手动实现分页效果. --WH 一.分页的思路 首先我们得知道写分页代码时的思 ...
- 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service ...
- Java Web面试题整理(思维导图)
1,动态网站技术有哪些? 2,一般的Web架构是指BS 还是CS,BS架构是什么咚咚? 3,Web应用程序的流程,即把一个URL串输入地址栏后发生写什么? 4,说一说Servlet生命周期? 5,在W ...
- kpvalidate开辟验证组件,通用Java Web请求服务器端数据验证组件
小菜利用工作之余编写了一款Java小插件,主要是用来验证Web请求的数据,是在服务器端进行验证,不是简单的浏览器端验证. 小菜编写的仅仅是一款非常初级的组件而已,但小菜为它写了详细的说明文档. 简单介 ...
- JAVA WEB 用servlet实现分页,思路比较清晰和简单。
JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...
- java web分页查询初试
ssh2分页查询初试,放着记录学习一下. entity:student.java: package com.zte.entity; /** * 数据持久化,跟数据库的的相应的表的字段是对应的. * * ...
随机推荐
- jmeter--简单使用
1.启动jmeter 2.创建线程组 2.点击线程组,选择添加,选择sampler(采样器),选择http请求 3.在添加的请求页面中,填写服务器名称或IP,端口,路径,请求的方法 4.添加请求的参数 ...
- Jmete基础使用
1,jmeter下载与安装 Jmeter的运行需要JDK支持,所以需要先安装好jdk,并配置好环境变量: 下载地址:http://jmeter.apache.org/download_jmeter.c ...
- 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP
题意 两个长度为$r$的子串相等称为$r$相似,两个$r$相似的权值等于子串开头位置权值乘积,给定字符串和每个位置权值,求$r$相似子串数量和最大权值乘积 对反串建立后缀自动机得到后缀树,后缀树上两个 ...
- 【转】C++11 标准新特性:Defaulted 和 Deleted 函数
原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaul ...
- gcc 4.8.5安装
在利用张乐博士的最大熵模型工具包(Maximum Entropy Modeling Toolkit for Python and C++)和条件随机场的经典工具包CRF++(CRF++: Yet An ...
- Ubuntu 下安装mysql
本文引用自 https://www.cnblogs.com/jpfss/p/7944622.html 此篇为http://www.cnblogs.com/EasonJim/p/7139275.html ...
- OSS阿里云文件上传 demo。
所需jar包: aliyun-openservices-1.2.3.jar jdom-1.1.jar commons-codec-1.4.jar commons-logging-1.1.1.jar g ...
- LeetCode 510. Inorder Successor in BST II
原题链接在这里:https://leetcode.com/problems/inorder-successor-in-bst-ii/ 题目: Given a binary search tree an ...
- findBug 错误修改指南
1. EC_UNRELATED_TYPESBug: Call to equals() comparing different types Pattern id: EC_UNRELATED_TYPE ...
- 时空上下文视觉跟踪(STC)算法
论文原文以及Matlab代码下载 算法概述 而STC跟踪算法基于贝叶斯框架,根据跟踪目标与周围区域形成的的时空关系,在图像低阶特征上(如图像灰度和位置)对目标与附近区域进行了统计关系建模.通过计算置信 ...