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. C/C++ 运算符 & | 运算

    C/C++中的“按位或 规则: 1|1=1 1|0=1 0|1=1 0|0=0 按位或运算 按位或运算符“|”是双目运算符.其功能是参与运算的两数各对应的二进位(也就是最后一位)相或.只要对应的二个二 ...

  2. 战斗机的祈雨仪式(NOIP模拟赛Round 7)

    [问题描述] 炎炎夏日,如果没有一场大雨怎么才能尽兴?秋之国的人民准备了一场祈雨仪式.战斗机由于拥有操纵雷电的能力,所以也加入了其中,为此,她进行了一番准备. 战斗机需要给自己的Spear of Lo ...

  3. UVA 10330 Power Transmission

    题意:懒得打了.LUCKY CAT 里有 http://163.32.78.26/homework/q10330.htm 第一个网络流题目.每个节点都有一个容量值.需要拆点.拆成i - > i ...

  4. vs2015部署---下一代VC运行时库系统:the Universal CRT

    前言 其实the Universal CRT(通用C运行时库)已经不能算是“下一代”,因为它已经在前两年伴随着Visual Studio 2015和Windows10发布.但是由于之前使用VS2015 ...

  5. electron 安装使用

    1.安装 node.js 链接:http://pan.baidu.com/s/1o7W7BIy 密码:y6od 一路next 我安装在F:\Program Files\node.js下 2.检查nod ...

  6. linux文件系统之loop环设备--新建一个文件系统并挂载

    1.  /dev目录下有所有已经连接到操作系统上的设备,他们能在/dev里出现就表示他们在硬件层面和系统核心层面被识别了.对于stdin.stdout.zero等设备是可以直接用> <这些 ...

  7. Font Awesome 字体使用方法, 兼容ie7+

    WebFont 技术可以让网页使用在线字体,而无需使用图片,从而有机会解决开头设计师提到的问题.它通过 CSS 的@font-face语句引入在线字体,使用 CSS 选择器指定运用字体的文本,与此同时 ...

  8. Fiddler抓包4-工具介绍(request和response)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6719717.html 前言 本篇简单的介绍下fiddler界面的几块区域,以及各自区域到 ...

  9. MyBatis笔记:invalid bound statement (not found)

    maven项目在本地运行的时候没有问题,一旦把war包部署到测试机上就不能运行.查看了一下tomcat日志发现抛出这样的错误:invalid bound statement (not found),后 ...

  10. 数学【p2613】 【模板】有理数取余(费马小定理)

    题目描述 给出一个有理数 c=a/b ,求 c mod 19260817的值. 说明 对于所有数据, 0≤a,b≤10^10001 分析: 一看题 这么短 哇简单!况且19260817还是个素数!(美 ...