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. SJCL:斯坦福大学JS加密库

    斯坦福大学Javascript加密库简称SJCL,是一个由斯坦福大学计算机安全实验室创立的项目,旨在创建一个安全.快速.短小精悍.易使用.跨浏览器的JavaScript加密库.(斯坦福大学下载地址:h ...

  2. week01-绪论报告

    一.作业题目: 仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算: 构造有理数T,元素e1,e2分别被赋以分子.分母值 ...

  3. 在AppCode中的razor调用HtmlHelper方法和UrlHelper方法

    原文发布时间为:2011-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 可以写一个帮助类,如下 using System.Web.WebPages;using System.Web.Mv ...

  4. [ CodeVS冲杯之路 ] P1294

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1294/ 随手一打就是这么漂亮的全排列,想当年我初一还是初二的时候,调了1个多小时才写出来(蒟蒻一枚) 直接DFS每次枚 ...

  5. [ CodeVS冲杯之路 ] P1063

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1063/ 本来是想写石子合并的,结果把题目看错了,写成了合并果子…… 凑合交了上去,直接A了…… 题目将可以将任意两堆合 ...

  6. Broadcom GNSS xxx Geolocaltion Sensor与Windows导航程序的兼容性(转)

    Broadcom是Windows 8(3G)平板普遍采用的一款GPS传感器, 其windows驱动程序可以提供GNSS接口.GNSS接口提供的数据,说实话确实比普通手机的数据好.在开机.室外.无AGP ...

  7. git的使用03

    之前我们写的都是将代码存在本地,我们还可以将代码github官网上,放在github的服务器上去托管

  8. [BZOJ2038] [2009国家集训队]小Z的袜子(hose) 莫队算法练习

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10299  Solved: 4685[Sub ...

  9. MVC5 ModelState

    ModelState.IsValid 总是false的原因 在做添加功能的时候,发现这个IsValid总是false,这个是它自己的验证机制. 因为是添加,就是说主键是自增的,添加的时候不需要指定这个 ...

  10. UVA Live 6437 Power Plant 最小生成树

    题意: 有许多油井和村庄什么的,让你使得这些村庄能连通一个油井就好了.第一行给你一个数字T代表有T组测试数据,第二行有 M , N , K ,M代表包括油井在内的村庄数,N 代表有N个 两两连通的地方 ...