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. centos 7 编译mod_security

    yum install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel libtoo ...

  2. struct timeval和gettimeofday()

    http://www.cppblog.com/lynch/archive/2011/08/05/152520.html struct timeval结构体在time.h中的定义为: struct ti ...

  3. 动态加载.so文件并执行类函数

    背景:不同产品组将其功能编译为.so,这些.so 可以加载到统一的基础平台上运行,如果产品组代码有改动,只需要更新对应的.so 问题:如何动态加载.so文件,并使用里边的函数/类 ? 解决方法1: 使 ...

  4. 跨平台的EVENT事件 windows linux

    #ifndef _HIK_EVENT_H_ #define _HIK_EVENT_H_ #ifdef _MSC_VER #include <Windows.h> #define hik_e ...

  5. PHP 时间获取本周 本月 本季度用法

    <?php        $week_begin = mktime(0, 0, 0,date("m"),date("d")-date("w&qu ...

  6. [BZOJ1034][ZJOI2008]泡泡堂BNB 贪心

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3414  Solved: 1739 [Submit][ ...

  7. 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?

    牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...

  8. 线段树【p2801】教主的魔法

    Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. 每个人的 ...

  9. (转)Unity3d各种坑

    1.unity的资源包一旦量很大的时候卸载不干净,你可以尝试反复切场景 ,内存诡异的 增加 一直到爆,assetsbundle.unload(true);有问题 你想要卸载你必须先让你加载过的资源为n ...

  10. 每天一个linux命令1之scp

    不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftpServer,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是采 ...