一、用到的工具类的封装

  为了实现代码的重用性,我们将经常用到的代码封装到工具类中,以便在任何地方都可以调用

  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之分页的实现(通用)的更多相关文章

  1. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  2. (转)java web自定义分页标签

    转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...

  3. Java Web(十) 分页功能

    分页 分页的使用非常普遍,现在一步步的把分页功能实现出来,先看看已经写好的效果: 该页面的所有数据都存放在一个javaBean对象(PageBean)里,每次访问该页面时,Serlvet就会把page ...

  4. Java Web(十一) 分页功能的实现

    虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果自己手写是一个怎样的流程的?今天就来说说它,手动实现分页效果. --WH 一.分页的思路 首先我们得知道写分页代码时的思 ...

  5. 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

    EL应用      自定义一个标签,实现两个字符串的相加 1回顾      1.1servlet生命周期           init(ServletConfig)           service ...

  6. Java Web面试题整理(思维导图)

    1,动态网站技术有哪些? 2,一般的Web架构是指BS 还是CS,BS架构是什么咚咚? 3,Web应用程序的流程,即把一个URL串输入地址栏后发生写什么? 4,说一说Servlet生命周期? 5,在W ...

  7. kpvalidate开辟验证组件,通用Java Web请求服务器端数据验证组件

    小菜利用工作之余编写了一款Java小插件,主要是用来验证Web请求的数据,是在服务器端进行验证,不是简单的浏览器端验证. 小菜编写的仅仅是一款非常初级的组件而已,但小菜为它写了详细的说明文档. 简单介 ...

  8. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  9. java web分页查询初试

    ssh2分页查询初试,放着记录学习一下. entity:student.java: package com.zte.entity; /** * 数据持久化,跟数据库的的相应的表的字段是对应的. * * ...

随机推荐

  1. Selenium-使用firepath获取元素的xpath

  2. python-管理MySQL之ConfigParser模块

    1.拷贝2.7版本的ConfigParser.py模块支持无值解析 cp /usr/local/src/Python-2.7.5/Lib/ConfigParser.py /usr/lib/python ...

  3. 201621123014《JAVA程序设计》第1周学习总结

    1. 本章学习总结 关键字:JAVA特点.JDK.JVM.JRE.class.编译工具.JDK是JAVA的开发工具包,拥有JAVA需要的环境和各类JAVA工具,是JAVA的核心:JVM是JAVA虚拟机 ...

  4. 关于VS中包含库、附加包含库、

    转载:https://blog.csdn.net/qing101hua/article/details/53841827 VS中C++的包含目录.附加包含目录和库目录和附加库目录的区别 对Visual ...

  5. codeforces 515C C. Drazil and Factorial(水题,贪心)

    题目链接: C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  6. 【leetcode刷题笔记】Best Time to Buy and Sell Stock III

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  7. Mysql备份脚本python编写

    #!/usr/bin/env python #-*- coding: UTF-8 -*- ####################################################### ...

  8. 1068 Find More Coins (30)(30 分)

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  9. P1030 求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  10. unity渲染层级关系小结

    http://blog.csdn.net/meegomeego/article/details/42060389 最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这 ...