核心sql

i是第几页,itemNum是每页显示的数据条数
select * from (
select e.*,rownum rn from (
select * from employee where 1=1 order by empno) e where rownum <(i*itemNum))
where rn >(i-1)*itemNum

大体思路

使用Page类封装(Page当做Dao类中某个方法的参数,Dao类中需要有个方法来获得获得满足条件的记录总数

每次点击查询,重新获得总记录数

首次进入某个需要显示分页的jsp页面,先创建一个Page对象,设置页号为第一页,并同时使用当前的这个Page,从Dao类中查询,得到第一页的List数据,使用session.setAttribute()方法,把Page对象和List数据存入到session中

第二次则是将pageNo的请求参数获得,把session中的Page对象取出,设置pageNo,之后再使用这个Page,从Dao类中获得新的一页的List数据,把Page对象和List数据再次存入session中

之后,为分页按钮设置好href链接(上一页,下一页,最后一页,a标签定义herf,带上页号的参数 query.jsp?pageNo=?

//使用EL表达式读取Page对象中的数据
<a href="query.jsp?pageNo=${page.pageNo}"></a>
<tr >
<td colspan="2"></td>
<td colspan="5">
<c:if test="${not employeePage.first}">
<a href="doQuery.jsp?pageNo=1">首页</a>
</c:if>
<c:if test="${employeePage.previous}">
<a href="doQuery.jsp?pageNo=${employeePage.prevNo}">上一页</a>
</c:if>
<%--如果有下一页,就显示下一页的链接 --%>
<c:if test="${employeePage.next}">
<a href="doQuery.jsp?pageNo=${employeePage.nextNo}">下一页</a>
</c:if>
<c:if test="${not employeePage.last}">
<a href="doQuery.jsp?pageNo=${employeePage.totalPage}">尾页</a>
</c:if>
</td>
<td>
<span>当前第${employeePage.pageNo}页/总共${employeePage.totalPage}页</span>
</td>
</tr>

Page类代码

/**
* 分页控制类,封装了相关分页时所需的信息,包括:<br>
* <pre>
* pageNo - 页号
* pageSize - 每页显示记录数
* totalRow - 总行数
* totalPage - 总页数
* previous - 是否有上一页
* next - 是否有下一页
* first - 是否是每一页
* last - 是否是最后一页
* firstIndex -当前页号的开头索引 如页号为2,每页显示记录数为5,当前的页号的开头索引为6
* lastIndex -当前页号的末尾索引 如页号为2,每页显示记录数为5,当前的页号的末尾索引为10
* </pre>
*
* @param <T> 查询条件对象。Map 或者 POJO
* @author starsone
* <p>
* pageSize=10;
* 1页: 第1~10条记录
* 2页: 第11~20第记录
* .....
* 【第一页】【上一页】【下一页】【最后一页】
* Page<Book> page = new Page<Book>();
*/
public class Page<T> { //预定常量:每页的行数
public static final int R5 = 5;
public static final int R10 = 10;
public static final int R20 = 20;
public static final int R50 = 50; public static final int R100 = 100;
public static final int DEFAULT_SIZE = R10; //总行数
private int totalRow = 0;
//当前页号
private int pageNo = 1;
//每页的记录数
public int pageSize = DEFAULT_SIZE;
//总页数
private int totalPage = 0; //是否有上一页 <c:if test=“${sessionScope.page.previous}”> </c:if>
private boolean previous; //是否有下一页
private boolean next; //是否是第一页
private boolean first; //是否是最后一页
private boolean last; //当前页数据首条记录索引 每页10, 当前2页:11~20
private int firstIndex; //当前页数据最后条记录索引
private int lastIndex; //查询条件对象
private T queryObject; public Page() {
this(0);
} /**
* @param totalRow 总记录数
*/
public Page(int totalRow) { // 101
this(totalRow, DEFAULT_SIZE);
} /**
* @param totalRow 总记录数
* @param pageSize 每页记录数
*/
public Page(int totalRow, int pageSize) {
this.totalRow = totalRow;
this.pageSize = pageSize;
//根据记录数自动算出总页数
if (totalRow % pageSize == 0) {
this.totalPage = totalRow / pageSize;
} else {
this.totalPage = totalRow / pageSize + 1;
}
} /**
* @param queryObject 查询条件
*/
public Page(T queryObject, int pageSize, int totalRow) {
this.queryObject = queryObject;
this.totalRow = totalRow;
this.pageSize = pageSize;
//根据记录数自动算出总页数
if (totalRow % pageSize == 0) {
this.totalPage = totalRow / pageSize;
} else {
this.totalPage = totalRow / pageSize + 1;
}
} /**
* @param totalRow 总记录数
* @param queryObject 查询条件
*/
public Page(int totalRow, T queryObject) {
setTotalRow(totalRow);
this.queryObject = queryObject;
} /**
* 得到总记录数
*
* @return
*/
public int getTotalRow() {
return totalRow;
} /**
* @param totalRow
*/
public void setTotalRow(int totalRow) {
this.totalRow = totalRow;
} /**
* 得到当前的页号
*
* @return
*/
public int getPageNo() {
return pageNo;
} /**
* 得到下一页的页号
*
* @return
*/
public int getNextNo() {
if (this.getNext()) {
return pageNo + 1;
} else {
return totalPage;
}
} /**
* 得到上一页的页号
*
* @return
*/
public int getPrevNo() {
if (this.getPrevious()) {
return pageNo - 1;
} else {
return pageNo;
}
} public void setPageNo(int pageNo) {
this.pageNo = pageNo;
} /**
* 得到每页显示的记录数
*
* @return
*/
public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} /**
* 得到总页数
*
* @return
*/
public int getTotalPage() {
if (totalRow % pageSize == 0) {
this.totalPage = totalRow / pageSize;
} else {
this.totalPage = totalRow / pageSize + 1;
}
return totalPage;
} public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
} /**
* 是否有下一页
*
* @return
*/
public boolean getNext() {
if (pageNo == 1 && pageNo < getTotalPage()) {
return true;
}
if (pageNo > 1 && pageNo < getTotalPage()) {
return true;
} else {
return false;
}
} /**
* 是否有上一页
*
* @return
*/
public boolean getPrevious() {
if (getPageNo() > 1) {
return true;
} else {
return false;
}
} /**
* 是否是第一页
*
* @return
*/
public boolean getFirst() {
return (getPageNo() > 1 ? false : true);
} /**
* 是否是最后一页
*
* @return
*/
public boolean getLast() {
return (getPageNo() == getTotalPage() ? true : false);
} /**
* 得到本页数据首条记录索引
*
* @return
*/
public int getFirstIndex() {
int i = getPageNo(); //pageNo = 3
return ((i < 1 ? 1 : i) - 1) * getPageSize() + 1;
} /**
* 得到本页数据最后一条记录索引
*
* @return
*/
public int getLastIndex() {
return getFirstIndex() + this.getPageSize() - 1;
} /**
* 得到查询分页的条件
*
* @return
*/
public T getQueryObject() {
return queryObject;
} /**
* 设置查询分页的条件
*
* @return
*/
public void setQueryObject(T queryObject) {
this.queryObject = queryObject;
//this.totalRow = new EmployeeDao().countForQuery(((Employee) queryObject));
//根据记录数自动算出总页数
if (totalRow % pageSize == 0) {
this.totalPage = totalRow / pageSize;
} else {
this.totalPage = totalRow / pageSize + 1;
}
} // 便于调试
@Override
public String toString() {
return "Page [是否是第一页:" + getFirst()
+ ", 是否是最后页:" + getLast()
+ ", 是否有上一页:" + getPrevious()
+ ", 是否有下一页:" + getNext()
+ ", 当前的页号:" + getPageNo()
+ ", 每页记录数:" + getPageSize()
+ ",开始索引:" + getFirstIndex()
+ ",末尾索引:" + getLastIndex()
+ ", 总页数=" + getTotalPage()
+ ", 总记录数=" + getTotalRow() + "]";
} }

使用范例

/* public static void main(String[] args) {
// 模拟页页提交的查询条件
Employee emp = new Employee(); Page<Employee> page = new Page<Employee>(13); // 设置(保存)查询条件
page.setQueryObject(emp); //设置 默认每页显示的记录数
page.setPageSize(Page.R5);
// 设置当前页号
page.setPageNo(3); System.out.println(page);
// session.setAttribute("empPage", page);
}*/
select * from (select e.*,rownum rn from (select * from emploee where order by empno) where rownum <= (i*itemNUm) ) where rn >(i-1)*itemNum

Jsp学习笔记(4)——分页查询的更多相关文章

  1. JSP学习笔记

    JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...

  2. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  3. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  4. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象

     JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...

  5. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  6. JSP 学习笔记1

    JSP 学习笔记   JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例--JSP页面有系统编译成Servlet,Servlet再负责响应用户请求. 1.JSP注释 < ...

  7. jsp学习笔记:mvc开发模式

    jsp学习笔记:mvc开发模式2017-10-12 22:17:33 model(javabe)与view层交互 view(视图层,html.jsp) controller(控制层,处理用户提交的信息 ...

  8. SQLServer学习笔记<>相关子查询及复杂查询

    二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...

  9. JSP学习笔记2

    <JAVA遇见HTML——JSP篇>学习笔记(下) 1.Javabean Javabeans就是符合某种规范的java类,使用Javabeans的好处是[解决代码的重复编写],减少代码冗余 ...

  10. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

随机推荐

  1. bootstrap实战练习中涉及的知识点(很有用哦!)

    看的有关视频做的笔记,对bootstrap中涉及的知识点做了一定的解析,很有用哦!(新手上路,有不合适的地方可以指出哦!) 下面进入正题: Bootstrap是当下最流行的前端框架(界面工具集) 特点 ...

  2. Source Maps简介

    提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件.但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦.不过也不用担心,souce maps将会帮你解决这一问题. Sourc ...

  3. 存在于文件名中的SQL手工注入

    SQL注入已经在前一章为大家介绍了个大概,本文将讲述我遇到的本以为是文件上传漏洞,却是以文件名触发的SQL注入! 本文分享的内容同样来自于一道CTF题! 1. 直接进入正题 (1) 初步探测 先看一下 ...

  4. net core Webapi基础工程搭建(六)——数据库操作_Part 2

    目录 前言 开始 使用 小结 前言 昨天是写着写着发现,时间不早了,已经养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天实在是不想让昨天没做完的事情影响,所以又坐下,沉下心(周末了),开始把数据 ...

  5. spark读取pg数据库报错操作符不存在

    代码: Properties connectionProperties = new Properties(); connectionProperties.put("user", C ...

  6. day01计算机硬件基础

    1.cpu\内存\硬盘 2.存储器 操作系统 是什么 为什么 如何用 1.什么是编程语言: 语言是一个事物与另一个事物沟通的表达方式 编程语言即程序员与计算机沟通的介质 计算机是程序员的奴隶 2.什么 ...

  7. 微服务API通过ip可访问,域名不可访问问题分析

    摘要 经常会有同学遇到api通过ip可以访问,但是通过域名却不可以访问.本篇文章总结了造成这种情况可能的原因. 因为与具体技术的选型.规则配置有关,所以没有深入讨论,只是列出可能性,仅供参考. 分析 ...

  8. Liunx学习总结(九)--防火墙

    防火墙的作用 防火墙作为一个边界防御工具,其监控流量要么允许它.要么屏蔽它. 多年来,防火墙的功能不断增强,现在大多数防火墙不仅可以阻止已知的一些威胁.执行高级访问控制列表策略,还可以深入检查流量中的 ...

  9. HTML连载33-背景定位

    一.背景定位 同一个标签可以同时设置背景颜色和背景图片,如果颜色和图片同时存在,那么图片会覆盖颜色 1.在CSS中有一个叫做background-position:属性,就是专门用来控制背景图片的位置 ...

  10. 猫眼电影和电影天堂数据csv和mysql存储

    字符串常用方法 # 去掉左右空格 'hello world'.strip() # 'hello world' # 按指定字符切割 'hello world'.split(' ') # ['hello' ...