booklist.jsp

<%@page import="books.accp.utils.Pager"%>
<%@page import="books.accp.entities.Book"%>
<%@page import="java.util.List"%>
<%@page import="books.accp.bizImpl.BooksMangerImpl"%>
<%@page import="books.accp.biz.BooksManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
BooksManager manager = new BooksMangerImpl();
int pageindex = 1;
if (request.getParameter("pageindex") != null)
pageindex = Integer.parseInt(request.getParameter("pageindex"));
Pager pager = new Pager();
pager.setTotalCount(manager.GetBookCount());
pager.setPageSize(3);
pager.setPageIndex(pageindex);
pager.getPageCount(); List<Book> list = manager.GetBookListByPage(pager);
request.setAttribute("list", list);
request.setAttribute("pager", pager);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>书籍列表</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>书名</th>
<th>价格</th>
<th>图片</th>
<th>库存</th>
</tr>
<c:forEach var="book" items="${list}">
<tr>
<td>${book.bid }</td>
<td><a href="bookinfo.aspx?bid=${book.bid}">${book.bookName }</a></td>
<td>${book.b_price }</td>
<td><img src="${image}" /></td>
<td>${book.stock }</td>
</tr>
</c:forEach>
</table>
<%@ include file="../utils/pager.jsp"%>
<%-- <jsp:include page="../utils/pager.jsp"></jsp:include> --%>
</body>
</html>

抽取出来的pager.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<style type="text/css">
.txtgo {
width: 30px;
border: 1px solid;
}
</style> <script type="text/javascript">
function goPage(pageindex) {
document.getElementById("pageindex").value = pageindex;
document.forms[0].submit();
} function jumpTo(){
var pageindex = document.getElementById("pageindex").value;
var regexp=/^\d+$/;
if(!regexp.test(pageindex)){
alert("请输入正确的数字!");
return false;
}else{
goPage(pageindex);
}
}
</script>
<form name="frmpage" method="post">
<div id="pager">
<c:if test="${pager.pageIndex > 1 }">
<a href="#" onclick="goPage(1)">首页</a>
<a href="#" onclick="goPage(${ pager.pageIndex - 1 })">上一页</a>
</c:if>
<c:if test="${pager.pageIndex < pager.pageCount }">
<a href="#" onclick="goPage(${ pager.pageIndex + 1 })">下一页</a>
<a href="#" onclick="goPage(${ pager.pageCount})">末页</a>
</c:if>
<input type="text" id="pageindex" name="pageindex"
value="${param.pageindex == null ? 1 : param.pageindex}"
class="txtgo" /> <input type="button" value="go" onclick="jumpTo()">
</div>
</form>

公共分页类:pager.java

package books.accp.utils;

public class Pager {

    //当前页
private int pageIndex = 1;
//页大小
private int pageSize = 3;
//总记录数
private int totalCount = 0;
//总页数
private int pageCount = 0; public int getPageIndex() {
return pageIndex;
} public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public int getTotalCount() {
return totalCount;
} public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
} /**
* 获取总页数
*
* @return
*/
public int getPageCount() {
pageCount = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount
/ pageSize + 1;
return pageCount;
} /**
* 获取开始记录数
*
* @return
*/
public int getStartRow() {
return (pageIndex - 1) * pageSize + 1;
} /**
* 获取结束记录数
* @return
*/
public int getEndRow() {
return pageIndex * pageSize;
} }

数据访问层:BookDaoImpl.java

package books.accp.daoImpl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import books.accp.dao.BaseDao;
import books.accp.dao.BooksDao;
import books.accp.entities.Book;
import books.accp.utils.Pager; public class BooksDaoImpl extends BaseDao implements BooksDao { @Override
public List<Book> GetBookList() {
String sql = "select * from Books";
ResultSet rs = ExecuteQuery(sql, null);
List<Book> list = GetResultSetToList(rs);
return list;
} @Override
public int GetBookCount() {
String sql = "select count(*) from Books";
Object obj = ExecuteScanlar(sql, null);
int count = obj == null ? 0 : Integer.parseInt(obj.toString());
return count;
} @Override
public List<Book> GetBookListByPage(Pager pager) {
String sql = "SELECT * FROM (SELECT Books.*,ROWNUM AS rn FROM Books) WHERE rn >= ? AND rn <= ?";
Object[] paras = new Object[2];
paras[0] = pager.getStartRow();
paras[1] = pager.getEndRow();
ResultSet rs = ExecuteQuery(sql, paras);
List<Book> list = this.GetResultSetToList(rs);
return list;
} public List<Book> GetResultSetToList(ResultSet rs) {
List<Book> list = new ArrayList<Book>();
try {
while (rs.next()) {
Book b = new Book();
b.setBid(rs.getInt("bid"));
b.setBookName(rs.getString("bookname"));
b.setB_price(rs.getDouble("B_price"));
b.setImage(rs.getString("Image"));
b.setStock(rs.getInt("Stock"));
list.add(b);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseAll(rs);
}
return null;
}
}

数据访问接口:BooksDao.java

package books.accp.dao;

import java.sql.ResultSet;
import java.util.List; import books.accp.entities.Book;
import books.accp.utils.Pager; public interface BooksDao{
public List<Book> GetBookList(); public int GetBookCount(); public List<Book> GetResultSetToList(ResultSet rs); public List<Book> GetBookListByPage(Pager pager);
}

BaseDao.java

package books.accp.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; public class BaseDao {
private static String jdbcname = "java:comp/env/jdbc/books";
private static Connection con;
private static PreparedStatement stmt; /**
* 关闭jdbc对象
*
* @param rs
*/
public static void CloseAll(ResultSet rs) {
// 关闭操作对象
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} /**
* 创建连接对象
*
* @return
*/
private static Connection CreateConnection() {
// 通过连接池创建Connection对象,一定是基于Tomcat的应用,连接池是由Tomcat进行管理
Context context;
try {
context = new InitialContext();
DataSource ds = (DataSource) context.lookup(jdbcname);
con = ds.getConnection();
return con;
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} /**
* 为PreparedStatement添加参数
*
* @param stmt
* @param paras
*/
private static void AddPararents(PreparedStatement stmt, Object[] paras) {
try {
if (paras != null && paras.length > 0) {
for (int i = 0; i < paras.length; i++) {
stmt.setObject(i + 1, paras[i]);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 执行查询的方法
* 这里不能关闭ResultSet,因为是ResultSet是一个游标,必须保持数据库的打开状态
* @param 要执行的sql语句
* @param sql语句执行的参数
* @return
*/
public static ResultSet ExecuteQuery(String sql, Object[] paras) {
ResultSet rs = null;
try {
con = CreateConnection(); stmt = con.prepareStatement(sql); AddPararents(stmt, paras);
// 执行查询操作,返回ResultSet对象
rs = stmt.executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /**
* 返回首行首列
*
* @param sql
* @param paras
* @return
*/
public static Object ExecuteScanlar(String sql, Object[] paras) {
ResultSet rs = null;
try {
con = CreateConnection();
stmt = con.prepareStatement(sql);
AddPararents(stmt, paras);
// 执行查询操作,返回ResultSet对象
rs = stmt.executeQuery();
if (rs != null && rs.next()) {
return rs.getObject(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseAll(rs);
}
return null;
} /**
* 执行增加、修改、删除的方法
*
* @param sql
* @param paras
* @return
*/
public static int ExecuteUpdate(String sql, Object[] paras) {
try {
con = CreateConnection();
stmt = con.prepareStatement(sql);
AddPararents(stmt, paras);
// 执行查询操作,返回ResultSet对象
int result = stmt.executeUpdate();
return result;
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseAll(null);
}
return -1;
}
}

连接池:

<Resource name="jdbc/books" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="bookuser" password="bookuser"
driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:localhost:1521:orcl" />

SQL表:

create table BOOKS
(
BID NUMBER not null,
BOOKNAME VARCHAR2(100) not null,
B_PRICE VARCHAR2(10) not null,
IMAGE VARCHAR2(200) not null,
STOCK NUMBER not null
)
;
alter table BOOKS
add constraint PK_BOOKID primary key (BID); prompt Loading BOOKS...
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (27, '泰戈尔诗集', '18.00', 'images/book/book_01.gif', 979);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (28, '痕记', '22.80', 'images/book/book_02.gif', 977);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (29, '天堂之旅', '25.00', 'images/book/book_03.gif', 989);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (30, '钱钟书集', '332.50', 'images/book/book_04.gif', 999);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (31, '赵俪生高昭—夫妻回忆录', '38.00', 'images/book/book_05.gif', 998);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (32, '无聊斋', '28.00', 'images/book/book_06.gif', 998);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (33, '一颗热土豆是一张温馨的床', '38.00', 'images/book/book_07.gif', 999);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (34, '李戡戡乱记', '22.00', 'images/book/book_08.gif', 999);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (35, '生生世世未了缘', '17.50', 'images/book/book_09.gif', 999);
insert into BOOKS (BID, BOOKNAME, B_PRICE, IMAGE, STOCK)
values (36, '一生有多少爱', '17.50', 'images/book/book_10.gif', 999);

源代码

JSP 基于Oracle分页的更多相关文章

  1. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  2. [转]oracle分页用两层循环还是三层循环?

    select t2.* from --两层嵌套 (select t.* , rownum as row_numfrom t where rownum <=20) t2 where t2.row_ ...

  3. [Oracle]关于Oracle分页写法的性能分析及ROWNUM说明

    关于分页写法的性能分析及ROWNUM的补充说明 分页写法 一.测试前数据准备 SQL> SELECT COUNT(*) FROM BPM_PROCVAR; COUNT(*) ---------- ...

  4. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  5. Oracle 分页原理

    oracle rownum 及分页处理的使用方法 在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据.在这些情况下我们都需要用到rownum. ...

  6. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  7. Sqlserver2008和Oracle分页语句

    SqlServer 分页语句 select StuID ,StuNo,StuName,Age,Sex, ClassName ClassName from (select *, row_number() ...

  8. mysql和oracle 分页查询(转)

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  9. 说说oracle分页的sql语句

    说说oracle分页的sql语句,分排序和不排序两种. 当结果集不需要进行排序时,每页显示条数为:rowPerPage,当前页数为:currentPage. 1. 相对来说,这种查询速度会快一些,因为 ...

随机推荐

  1. [ CodeVS冲杯之路 ] P1501

     不充钱,你怎么AC? 题目:http://codevs.cn/problem/1501/ 水题一道 直接dfs,记录上当前深度,到了叶子节点就更新答案,并且每个节点将当前深度的计数+1,答案即为ma ...

  2. 《Linux命令、编辑器与shell编程》第三版 学习笔记---000

    Linux概述 1.具有内核编程接口 2.支持多用户(同时) 3.支持多任务 4.支持安全的分层文件系统 a.标准 b.链接 c.权限 5.shell(命令解释器和编程语言) a.文件名生成(通配符和 ...

  3. Spring Cloud之分布式配置中心

    用服务的方式来实现 ConfigAppApplication.java package com.packtpub.ConfigApp; import org.springframework.boot. ...

  4. [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3330  Solved: 1739 [Subm ...

  5. Vue v-for嵌套数据渲染问题

    Vue v-for嵌套数据渲染问题 问题描述: 由于在获取商品子分类的时候,同时需要获取子分类下的商品,那么多层的列表渲染就只能是第一层好用 问题原因: vue在处理多层的渲染的时候,不能直接用等号赋 ...

  6. 51nod 1007 正整数分组【01背包变形】

    1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...

  7. Job的使用

    1.Job完成状态监听: job.addJobChangeListener(new JobChangeAdapter() {            @Override            publi ...

  8. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 猴子排序的期望

    链接:https://www.nowcoder.com/acm/contest/116/F来源:牛客网 题目描述 我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡 ...

  9. teamviewer13报错

    用自己的笔记本电脑远程桌面AGV电脑在终端运行teamviewer报错如下: Init...CheckCPU: SSE2 support: yesChecking setup...Launching ...

  10. implements

    implements 是实现某个接口的意思. 如果某个类 后面使用 implements,并指定了相应的接口,那在该类下面就需要实现相应接口的方法. 比如:接口interface java.lang. ...