在你需要导出显示大量列表时,在一页中都显示出来,是不美观页不实用的。在这种时候,就需要设置一个分页来显示你的内容,如百度的分页:

分页分为:前段分页和后端分页

后端分页:

首先我们应该确定,我们要分页,都需要从哪得到哪些数据:

Page<T>类

在Servlet中得到:

int pageNumber   //当前页码 , 该数据在Servlet中获取

int pageSize      //每页显示的条数 , 在Servlet中指定

后期计算得到:

int index        // 分页开始的索引 , 通过计算获得

int totalPage     // 总页数 , 需要通过计算获得

从数据库中导出:

int totalRecord   // 总记录 , 通过查询数据库获得

List<T> data;    // 分页的数据 , 通过数据库查询

分页查询时,DAO、Service的分工

Service:

pageNumber

pageSize

DAO:

int totalRecord

List<T> data

下面是Page类,在这里声明了上面我们需要的6个数据中的4个,index、totalPage 2个需要计算得到的,我们就不在这里面声明了。这个page类可以拿过去直接使用的:

public class Page<T> {

    private int pageNumber;

    private int pageSize;

    private int totalRecord;

    private List<T> data;

    private String path;

    public Page(int pageNo, int pageSize, int totalRecord) {
super();
this.pageNumber = pageNo;
this.pageSize = pageSize;
this.totalRecord = totalRecord;
} public int getPageNumber() { if(pageNumber < 1){
return 1;
} if(pageNumber > getTotalPage()){
return getTotalPage();
} return pageNumber;
} public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public int getTotalPage() { if(getTotalRecord()%getPageSize()==0){
return getTotalRecord()/getPageSize();
}else{
return getTotalRecord()/getPageSize()+1;
}
} public int getTotalRecord() {
return totalRecord;
} public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
} public int getIndex() { return (getPageNumber() - 1) * getPageSize();
} public List<T> getData() {
return data;
} public void setData(List<T> data) {
this.data = data;
} public String getPath() {
return path;
} public void setPath(String path) {
this.path = path;
} }

Servlet关键代码

protected void getStuList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = WebUtils.getPath(request);
Page<Student> page=stuService.findAll(pageNo, pageSize);
page.setPath(url);
request.setAttribute("page",page );
request.getRequestDispatcher("/studentList.jsp").forward(request, response);
}

Dao关键代码:从数据库中导出 totalRecord  、List<T> data;

public static int getTotalRecord() {
PreparedStatement ps=null;
ResultSet rs = null;
Connection conn = Utils.getConnection();
String sql = " SELECT COUNT(*) AS total FROM student";
int total=0; try {
ps =conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
total = rs.getInt("total");
}
} catch (SQLException e) {
// e.printStackTrace();
}finally{
Utils.close(conn, ps, rs);
} return total;
} public List<Student> getLimitStuList(int index, int pageSize) {
PreparedStatement ps=null;
ResultSet rs = null;
Connection conn = Utils.getConnection();
String sql = " SELECT * FROM student limit ? , ?";
List<Student> list= new ArrayList<Student>();
try {
ps =conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, pageSize); rs = ps.executeQuery();
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String school = rs.getString("school");
double score = rs.getDouble("score");
list.add(new Student(id,name,school,score));
}
} catch (SQLException e) {
// e.printStackTrace();
}finally{
Utils.close(conn, ps, rs);
} return list;
}

这就是后端的一些关键代码,下面我们看下前段分页。

前段分页:这是一个JSP代码

百度是页里最多只显示10个页码

咱们设计为页面中最多显示5页码

这个问题就转变成了需要动态的设置forEach中begin和end的值

根据不同的情况去设置begin和end的值

第一种情况,总页数小于等于5

begin=1  end=总页数

第二种情况,当前页 小于等于 3

begin=1  end=5

第三种情况,当前页 大于3

lbegin=当前页-2   end=当前页+2

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<script type="text/javascript" src="${pageContext.request.contextPath}/ab/jquery.min.js"></script>
<div id="page_nav" align="center">
<a href="${page.path}&pageNo=1">首页</a>
<a href="${page.path}&pageNo=${page.pageNumber -1 }">上一页</a>
<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:otherwise>
<c:set var="begin" value="${page.pageNumber-2}"></c:set>
<c:set var="end" value="${page.pageNumber+2}"></c:set>
<c:if test="${end > page.totalPage }">
<c:set var="begin" value="${page.totalPage-4}"></c:set>
<c:set var="end" value="${page.totalPage}"></c:set>
</c:if>
</c:otherwise>
</c:choose>
<c:forEach begin="${begin }" end="${end}" var="num">
<c:if test="${page.pageNumber == num }">
【${num}】
</c:if>
<c:if test="${page.pageNumber != num }">
<a href="${page.path}&pageNo=${num}">${num }</a>
</c:if>
</c:forEach>
<a href="${page.path}&pageNo=${page.pageNumber +1}">下一页</a>
<a href="${page.path}&pageNo=${page.totalPage}">末页</a>
共${page.totalPage }页,${page.totalRecord }条记录到,去第<input value="${page.totalPage }" name = "pn" id ="pn_input"/>页 <input type="button" value="确定" id="btn_id"/>
<script type="text/javascript">
$("#btn_id").click(function(){
var value= $("#pn_input").val();
window.location="${page.path}&pageNo="+value;
});
</script>
</div>

上面的jsp可以直接用,直接加到你要导出显示的列表的下面:

<c:forEach items="${page.data}" var="stu">
<tr>
<td>${stu.name }</td>
<td>${stu.school }</td>
<td>${stu.score }</td>
<td><a href="${pageContext.request.contextPath}/FindAllServlet?method=toUpdatePage&id=${stu.id}" >修改</a></td>
<td><a href="#?${stu.id}">删除</a></td>
</tr>
</c:forEach>
<tr><td colspan="5" align="center"><a href="#">添加</a></td></tr>
</table>
<br/>
<%@ include file="/Page.jsp" %>

但是要注意,一定要导入jar包和js包

运行结果:

Java后台及Jsp前端的简单分页_学习笔记的更多相关文章

  1. java后台与jsp前台特殊字符处理(字符串编码与解码)

    在后台与前台数据交互时如果有特殊字符就很容易出现问题,所以就需要对字符串进行编码传输,在获取后再进行解码: 1.Java后台进行编码与解码 URLEncoder.encode(str,"ut ...

  2. java maven、springmvc、mybatis 搭建简单Web项目学习笔记

    前言: 空余的时间,学学 Java,没准哪天用的到: 环境搭建折腾了好几天,总算搞顺了,也做个学习笔记,以防后面会忘记: 一.安装文件及介绍 JDK:jdk1.8.0 77 eclipse-maven ...

  3. 前端自动化构建工具 gulp 学习笔记 一、

    一.我对gulp的初期理解 是一种前端辅助开发工具 可以帮你把js,css,img等文件 合并.压缩,图片好像是合并为精灵图,合并为精灵图之后,还会生成一个css样式表. 官方解说是:基于流的自动化构 ...

  4. 0讲Java,给你一条简单清晰的学习道路!

    1. 计算机基础: 1.1 数据结构基础: 主要学习:1.向量,链表,栈,队列和堆,词典.熟悉2.树,二叉搜索树.熟悉3.图,有向图,无向图,基本概念4.二叉搜索A,B,C类熟练,9大排序熟悉.5.树 ...

  5. 使用Java带你打造一款简单的英语学习系统

    [一.项目背景] 随着移动互联网的发展,英语学习系统能结构化的组织海量资料.针对用户个性需求,有的放矢地呈现给用户,从而为英语学习者提供便利,提升他们的学习效率. [二.项目目标] 1. 实现美观的界 ...

  6. JSP实现数据传递(web基础学习笔记三)

    get和post的区别: JSP内置对象: 1)out内置对象:out内置对象是在JSP开发过程中使用得最为频繁的对象,然而其使用起来也是最简单的.out对象用于向客户端浏览器输出数         ...

  7. 【Java】多线程_学习笔记

    多线程 1.进程 进程:当一个程序进入内存运行时,它就成为了进程.进程具有独立性.动态性.并发性. A.独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间 ...

  8. 《Java疯狂讲义》(第3版)学习笔记 1 - 如何学习Java

    1.Java是一种面向对象语言,不要简单当做脚本使用.从基础学起,不要从Spring.J2EE.Hibernate和EJB开始学. 2.不要浮躁,应该扎扎实实先学好Java语言,然后按Java本身的学 ...

  9. 简单Linux命令学习笔记

    1.查看进程 ps -ef | grep 关键字       /*关键字为服务名*/ netstat -unltp | grep 关键字        /*关键字为服务名或者是端口均可*/ 2.杀死进 ...

随机推荐

  1. ZJNU 2349 - 抽抽抽

    为4的倍数,列出所有可能情况再判断即可 处理输入的数据对4取模 可得 4444 2244 2222 1111 3333 1133 1223 1344 1124 3324 共十种情况 所以得出答案 #i ...

  2. 框架-Spring及组件概念

    1.什么是Spring Spring框架是一款开源java平台.创建于2003年,轻量级框架(基本版本只有2M). 使用Spring优点: (1)     使用POJOs开发,不再需要EJB容器:如果 ...

  3. 题解【[BJOI2012]算不出的等式】

    题目背景emmm \[\text{首先特判掉p=q时的情况(ans = }p^2-1\text{)}\] \[\text{构造函数}f(k) = \left\lfloor \frac{kq}{p}\r ...

  4. 总结一些常用的训练 GANs 的方法

    众所周知,GANs 的训练尤其困难,笔者自从跳入了 GANs 这个领域(坑),就一直在跟如何训练 GANs 做「对抗训练」,受启发于 ganhacks,并结合自己的经验记录总结了一些常用的训练 GAN ...

  5. uni-app文章详情-富文本展示 优雅展示代码块

    在uni-app开发中,开发一个资讯详情页面,详情里包含图片和代码块.这时候用简单的rich-text控件已经不够用了.用官方demo里的html-parser.js也无法很好的展示代码区域.这个时候 ...

  6. phpExcel查询数据库导出excel表

    <?php         require_once 'PHPExcel.php';       require_once 'PHPExcel/Writer/Excel5.php';    re ...

  7. 损失函数coding

    损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别? 在此强调这一点,尽管成本函数和损失函数是同义词并且可以互换使用,但它们是不同的. 损失函数用于单个训练样 ...

  8. 201409-1 相邻数对 Java

    两两比较,注意不要越界就行 import java.util.Arrays; import java.util.Scanner; public class Main { public static v ...

  9. 01 语言基础+高级:1-9 网络编程_day11【网络编程】

    day11[网络编程] 主要内容 软件架构CS/BS 网络通信三要素 TCP通信 Socket套接字 ServerSocket 教学目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类 ...

  10. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...