




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第18章JSP页面分页技术实现,在JSP页面中,访问数据库并读取一个数据结果集时,如果记录数太多,一个是会占用服务器的大量内存,造成服务器负荷过重,数据传输和显示速度缓慢得难以忍受;另一方面,一个JSP页面展示空间是有限的,不可能列出所有的数据库记录,一次传输所有的数据到客户端也非常的不合理。 因此,当检索的数据很多时,通常需要分页显示数据,并要实现翻页。本章主要介绍通过不同的方式在JSP中实现分页的设计思路和具体实现,通过一些例程来说明JSP页面翻页技术的实现。,本章目标:, 分页技术设计思路 在JSP页面中直接分页 在Servlet中实现分页 结合JavaBean实现分页 万能的分页技术实
2、现 根据不同的数据库实现分页技术,18.1分页技术设计思路,JSP开发中,实现分页的方法有很多种,每种方法都有其特点,也有其缺点。 在JSP页面中直接分页。这种方法将分页代码统一编写在JSP页面中,开发比较简单,但在页面比较多的时候,维护比较复杂。 在Servlet中实现分页。这种方法采用JSP+Servlet进行开发,页面显示代码和控制代码相分离。 在JavaBean中实现分页。这种方法采用JSP+JavaBean进行开发,页面显示代码和业务逻辑代码相分离。 万能分页技术。一般分页时需要考虑具体的数据表的读写以及显示,采用万能分页技术,可以对任意的表进行分页。 结合不同的数据库实现分页。上述
3、4种分页方法都是基于ResultSet里的数据来进行分页。存在性能和资源占用等问题。结合不同的数据库的特点和功能,可以设计出性能良好,占用资源较少的分页程序。,18.2在JSP页面中直接分页,实现分页的最简单、也最直接的方式,是直接在显示结果集的JSP页面中嵌入进行分页处理的Java代码。 要点: 显示maxRows条数据 通过“下一页”按钮或超链再次调用刚才的servlet查询下一maxRows的数据 下面的例子说明如何用这种方式实现一个记录集的分页。该例子使用的表为用户表userinfo,表结构在第17章做了介绍,如表17-1所示。 (1)新建一个文件page.jsp,在page.jsp文
4、件的文本编辑区中输入以下代码。 % java.sql.Connection sqlCon; /数据库连接对象 java.sql.Statement sqlStmt; /SQL语句对象 java.sql.ResultSet sqlRst; /结果集对象,java.lang.String strCon; /数据库连接字符串 java.lang.String strSQL; /SQL语句 int intPageSize; /一页显示的记录数 int intRowCount; /记录总数 int intPageCount; /总页数 int intPage; /待显示页码 java.lang.Stri
5、ng strPage; int i;,/设置一页显示的记录数 intPageSize = 5; /取得待显示页码 strPage = request.getParameter(page); if(strPage=null) /表明在QueryString中没有page这一个参数,此时显示第一页数据 intPage = 1; else /将字符串转换成整型 intPage = java.lang.Integer.parseInt(strPage); if(intPage1) intPage = 1; /装载JDBC驱动程序 Class.forName(com.mysql.jdbc.Driver)
6、.newInstance();,/连接数据库 /localhost/netshop为数据库,user为root,password为123456 sqlCon= java.sql.DriverManager.getConnection(jdbc:mysql:/localhost/netshop?user=root %, 数据分页显示 成员列表 登录名称 登录密码 电子邮件 ,0) /将记录指针定位到待显示页的第一条记录上 sqlRst.absolute(intPage-1) * intPageSize + 1); /显示数据 i = 0; while(i , 第页 共页 1) % 上一页 上一页
7、 下一页 下一页 , 这种方式的优点显而易见,直观、结构简单、易于理解,并且比较灵活,可以自由地根据不同的实际情况指定一个页面中最多显示的记录数。 缺点同样明显,这种方式只适合对单一的或极少量的结果集进行分页,实现分页的代码不能够被重用,需要为每一个结果集的显示写入实现分页的代码段。 因此,这种方式不适宜用来实现数据量大、数据表多的结果集的分页显示。,18.3在Servlet中实现分页,可以在服务器端的servlet 中实现分页,首先在JSP中,通过Java Servlet 来检索数据,然后用JSP来调用结果来显示。 要点: 将查询条件保存到session中,取session中的查询条件 设置
8、Statement对象的MaxRows(确定一页显示多少行数据) 顺序地通过执行SQL语句查询数据,按maxRows 来检索一个maxRows的数据, 下一页再检索下一maxRows的数据,以此类推。 下面的例子18.2实现了在Servlet中对userinfo表的数据进行分页显示。 (1)在Servlet目录下,新建一个文件UserListServlet.java,代码如下: package ch18.Servlet;,import java.io.IOException; import java.util.Collection; import javax.servlet.ServletEx
9、ception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ch18.JavaBean.DB_User; /* * 用户列表分页显示UserListServlet类 */,public class UserListServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet public UserListServlet() super();
10、protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setHeader(Pragma, No-cache); response.setHeader(Cache-Control, no-cache); response.setDateHeader(Expires, 0);,int pagesize = 5; String page = request.getParameter(page); DB_Us
11、er dbuser = new DB_User(); int count = dbuser.getCount(); / 记录总数 int totalPageNum = count / pagesize; / 计算总页数 / 如果纪录总数除以每页的显示个数,余数大于0,那么 / 总页数应该为商+1 if (count % pagesize) 0) totalPageNum += 1; if (page = null) page = 1; ,request.setAttribute(totalPageNum, new Integer(totalPageNum); Collection c = db
12、user.getAll(pagesize, Integer.parseInt(page); request.setAttribute(c, c); try request.getRequestDispatcher(userlist.jsp).forward(request, response); catch (Throwable t) getServletContext().log(t.getMessage(); ,(2)新建一个文件userlist.jsp,代码如下: , 成员列表 用户名 登录密码 邮件地址 , 没有用户数据! 没有用户数据! , ,共页 ,(3)在web.xml文件中输入
13、以下配置代码。 Login-Register-UserManager ,PageServlet PageServlet ch18.Servlet.UserListServlet PageServlet /UserListServlet ,18.4结合JavaBean实现分页,可以在JavaBean中实现页面分页,下面的例子18.3实现了在Servlet中对goods表的数据进行分页显示。 (1)在JavaBean目录下,新建一个文件page.java,代码如下: package ch18.JavaBean; import java.util.Vector; import java.sql.Re
14、sultSet; import java.sql.SQLException; import ch18.JavaBean.DB_Conn; import ch18.JavaBean.Goods; public class Page /获得查询返回结果集 public Vector getResultSet() DB_Conn db_conn=new DB_Conn(); ResultSet rs=null;,try db_conn.ConnectDB(); String sql=select * from goods; rs=db_conn.sm.executeQuery(sql); Vecto
15、r vector=new Vector(); while(rs.next() Goods goods=new Goods(); goods.setGoods_id(rs.getInt(goods_id); goods.setGoods_name(rs.getString(goods_name); goods.setTypeid(rs.getInt(typeid); goods.setGoods_price(rs.getFloat(goods_price); goods.setGoods_discount(rs.getFloat(goods_discount); goods.setGoods_d
16、esc(rs.getString(goods_desc); goods.setSupplier(rs.getString(supplier); goods.setQty(rs.getInt(qty); goods.setIspreferred(rs.getInt(ispreferred); goods.setGoods_pic(rs.getString(goods_pic); vector.addElement(goods); ,return vector; catch(SQLException SqlE) SqlE.printStackTrace(); return null; catch(
17、Exception e) e.printStackTrace(); return null; finally db_conn.CloseDB(); public String int2str(int id) String new_str=; if(id=0) new_str=No; if(id=1) new_str=Yes; return new_str; ,(2)新建一个文件page_sep.jsp,代码如下: % Goods goods=new Goods(); Vector vector=new Vector(); vector=page_sep.getResultSet();,/取得待
18、显示页码 strPage = request.getParameter(pagenumber); if(strPage=null) /表明在QueryString中没有pagenumber这一个参数,此时显示第一页数据 intPage = 1; else /将字符串转换成整型 intPage = Integer.parseInt(strPage); if(intPage1) intPage = 1; ,/计算总页数 intPageCount = (vector.size()+intPageSize-1) / intPageSize; /调整待显示的页码 if(intPageintPageCou
19、nt) intPage = intPageCount; /计算每一页的起始记录索引 currPageBegin = intPage*intPageSize-intPageSize; % 商品名称商品类别 商品价格商品折扣率 商品描述生产制造商 库存量是否推荐商品 商品图片 , width=50 height=50 , 第页 共页 1) % 上一页 上一页 下一页 下一页 ,18.5万能的分页技术实现,采用万能分页技术,可以对任意的表进行分页。 (1)新建一个文件select_table.jsp,代码如下: 万能分页测试 输入分页SQL: ,(2)新建一个文件pagetoall.jsp,代码如下
20、: % int recordcount; /记录总数 int perpagesize=5; /每页显示的记录数 int pagecount; /需显示总页数 int intpage; /待显示页码 int i=0;,int currpagebegin; String drivername=com.mysql.jdbc.Driver; /驱动程序名 String username=root; /用户名 String password=123456; /密码 String db_name=netshop; /数据库名 String url=jdbc:mysql:/localhost/+db_nam
21、e+?user=+username+ % %,if(strpage=null) intpage=1; else intpage=java.lang.Integer.parseInt(strpage); if(intpage % /动态执行分页查询SQL java.sql.ResultSet rs=statement.executeQuery(sqlcmd); rs.last(); /得到数据集中总记录数 recordcount=rs.getRow(); /得到总页数 pagecount=(recordcount+perpagesize-1)/perpagesize;,/重新设置待显示页码 if
22、(intpagepagecount)intpage=pagecount; /得到字段描述信息 java.sql.ResultSetMetaData metaData=rs.getMetaData(); StringBuffer hdata=new StringBuffer(); int colcount=metaData.getColumnCount(); hdata.append(); /输出表格列名 for(i=1;i+metaData.getColumnName(i)+); hdata.append(); /定位记录指针到(intpage-1)*perpagesize+1行 rs.abs
23、olute(intpage-1)*perpagesize+1); int j=0; % %,/从结果集中取得perpagesize条记录,作为当前页数据输出 while(j); for(int k=1;k+rs.getString(k)+); hdata.append(); rs.next(); j+; % ,共页 第页 1) % % 继续输入分页SQL,18.6根据不同的数据库实现分页技术,前面介绍的JSP分页技术,都是针对ResultSet里的数据来进行分页。ResultSet实际上是一个数据缓冲区,需要耗费一定的内存。采用ResultSet来实现分页有2个较大的缺点: 会话数较多时,消耗
24、的内存等系统资源比较厉害。每一个ResultSet都需要占用一定数量的内存。 如果结果集中记录数量很多时,例如1000万条记录,即将所有的数据都缓存到ResultSet中,消耗的内存相当厉害,有时候一个ResultSet可能消耗掉100M以上的内存,而且性能急剧下降,响应速度奇慢,对于用户而言,很难接受。 而反过来,在一些大型企业应用中,如电信、金融、保险等系统中,某些数据表中的记录数量经常达到几亿条以上,用户数量庞大,对这些系统中的页面分页,如果采用前面所述的ResultSet来开发,是肯定行不通的。 这时,一般可以利用不同大型数据库提供的一些增强的SQL功能来实现和改进分页。主要针对几种主
25、流常见的数据库中如何利用其SQL的特点,实现分页技术。,18.6.1 Oracle数据库分页,JSP分页技术实现的关键在于获得当前页面的数据。因此,只要能够编写出获得当前页数据的SQL,就可以完成JSP页面分页了。 Oracle数据库增强的SQL支持选取指定的记录数,下面是在Oracle中获得当前页数据的SQL代码片段。 Select * from ( Select a.*,rownum rc From ( Select * From goods Order by goods_type asc ) a Where rownum =startrow 其中,startrow、endrow分别是当前
26、页的起始记录和结束记录数。具体应用时,可以使用 startrow=(intpage-1)*perpagesize+1, endrow=intpage*perpagesize 进行计算。,18.6.2 DB2数据库分页,DB2数据库的SQL同样支持选取指定的记录数,下面是在DB2中获得当前页数据的SQL代码片段。 Select * from ( select rownumber() over() as rc,a.* From ( Select * From goods Order by goods_type,asx) As a) Where rc between startrow and end
27、row 其中,startrow、endrow分别是当前页的起始记录和结束记录数。具体应用时,可以使用 startrow=(intpage-1)*perpagesize+1, endrow=intpage*perpagesize 进行计算。,18.6.3 SQL Server 2000数据库分页,下面是在SQL Server 2000数据库中获得当前页数据的SQL代码片段。 Select top perpagesize * From goods Where (goods_id not int (select top perpagesize*intpage goods_id From goods
28、Order by goods_id ) Order by goods_id,18.6.4 SQL Server 2005数据库分页,SQL Server 2005与2000相比,提供了很多新的功能。利用SQL Server 2005的新功能,可以获得更好的分页查询性能并简化SQL语句的编写。下面是在SQL Server 2000数据库中获得当前页数据的SQL代码片段。 Select * From ( select goods_id, ROW_NUMBER() over (order by goods_name) as curr from goods ) as t Where t.curr = startrow And t.curr = endrow,18.6.5 MySQL数据库分页,MySQL数据库分页SQL最为简单,下面是在MySQL数据库中获得当前页数据的SQL代码片段。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 涂料应用知识培训总结
- 2025贵州省水利投资(集团)有限责任公司招聘84人模拟试卷及答案详解(典优)
- 2025年嘉兴海盐县医疗卫生事业单位公开招聘编外用工81人模拟试卷带答案详解
- 2025年马鞍山当涂县公开引进中小学教师65人考前自测高频考点模拟试题完整答案详解
- 2025年福建省晋江市新佳园物业发展有限公司招聘18人模拟试卷及答案详解(典优)
- 2025年连云港市赣榆区事业单位公开招聘工作人员31人模拟试卷有答案详解
- 2025福建泉州市部分公办学校专项招聘编制内新任教师46人(四)模拟试卷及答案详解(全优)
- 2025江苏盐城选聘物业管理营商环境体验员模拟试卷及答案详解参考
- 安全培训聋哑课件
- 2025广东广州市增城区教育局招聘广州增城外国语实验中学教师10人(编制)模拟试卷带答案详解
- 智慧指挥中心建设总体方案设计
- 中小学、幼儿园食堂食材采购项目 (米、面、油(含乳制品))服务方案投标文件(技术方案)
- 医保购药报销讲解
- 医学影像技术增强检查
- 3422对外承包工程操作指南 定义和适用范围.操作流程与关键文件.操作流程与关键文件.出口和进口报关单填制要求和规范.注意事项
- 2025年广东省中考道德与法治真题试卷【含答案】
- 2025秋人教版八年级上册英语教案Unit 1 Happy Holiday 第1课时
- 夜间驾驶知识课件
- 体态管理培训课件
- 陕西省西工大附中2022-2023学年七年级上学期第一次月考英语试卷(含答案)
- 《近似数》课件人教版数学七年级上册
评论
0/150
提交评论