JAVA分页-使用多种方法实现分页技术_第1页
JAVA分页-使用多种方法实现分页技术_第2页
JAVA分页-使用多种方法实现分页技术_第3页
JAVA分页-使用多种方法实现分页技术_第4页
JAVA分页-使用多种方法实现分页技术_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/在struts中分页的一种实现/ 我的项目中的分页功能1, 思路使用一个页面控制类,它记录页面信息,如上页,下页,当前页等。在查询的Action中,将这个控制类和查询条件一起传递给数据库访问bean,然后将这两个参数保存在用户session中。在分页控制Action中,利用接收到的分页参数调用数据库访问的bean.2,实现(1)分页控制类/* author nick* Created on 2004-3-18* file name:PageController.java* * */package com.tower.util;/* author nick* 2004-3-18* 用来进行翻页

2、控制* */public class PageController int totalRowsAmount; /总行数boolean rowsAmountSet; /是否设置过totalRowsAmountint pageSize=2; /每页行数int currentPage=1; /当前页码int nextPage;int previousPage;int totalPages; /总页数boolean hasNext; /是否有下一页boolean hasPrevious; /是否有前一页String description;int pageStartRow;int pageEndRow

3、;public PageController(int totalRows)setTotalRowsAmount(totalRows);public PageController()/* param i* 设定总行数*/public void setTotalRowsAmount(int i) if(!this.rowsAmountSet)totalRowsAmount = i;totalPages=totalRowsAmount/pageSize+1;setCurrentPage(1);this.rowsAmountSet=true;/* param i* * 当前页* */public vo

4、id setCurrentPage(int i) currentPage = i;nextPage=currentPage+1;previousPage=currentPage-1;/计算当前页开始行和结束行if(currentPage*pageSizetotalPages)hasNext=false;elsehasNext=true;if(previousPage=0)hasPrevious=false;elsehasPrevious=true;System.out.println(this.description();/* return*/public int getCurrentPage

5、() return currentPage;/* return*/public boolean isHasNext() return hasNext;/* return*/public boolean isHasPrevious() return hasPrevious;/* return*/public int getNextPage() return nextPage;/* return*/public int getPageSize() return pageSize;/* return*/public int getPreviousPage() return previousPage;

6、/* return*/public int getTotalPages() return totalPages;/* return*/public int getTotalRowsAmount() return totalRowsAmount;/* param b*/public void setHasNext(boolean b) hasNext = b;/* param b*/public void setHasPrevious(boolean b) hasPrevious = b;/* param i*/public void setNextPage(int i) nextPage =

7、i;/* param i*/public void setPageSize(int i) pageSize = i;/* param i*/public void setPreviousPage(int i) previousPage = i;/* param i*/public void setTotalPages(int i) totalPages = i;/* return*/public int getPageEndRow() return pageEndRow;/* return*/public int getPageStartRow() return pageStartRow;pu

8、blic String getDescription()String description=Total:+this.getTotalRowsAmount()+ items +this.getTotalPages() + pages;/ this.currentPage+ Previous +this.hasPrevious +/ Next:+this.hasNext+/ start row:+this.pageStartRow+/ end row:+this.pageEndRow;return description;public String description()String des

9、cription=Total:+this.getTotalRowsAmount()+ items +this.getTotalPages() + pages,Current page:+this.currentPage+ Previous +this.hasPrevious + Next:+this.hasNext+ start row:+this.pageStartRow+ end row:+this.pageEndRow;return description;public static void main(String args)PageController pc=new PageCont

10、roller(3);System.out.println(pc.getDescription();/ pc.setCurrentPage(2);/ System.out.println(pc.description();/ pc.setCurrentPage(3);/ System.out.println(pc.description();(2)查询Action的代码片断public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse

11、 response)throws Exception Base queryForm= (Base) form;if(!queryForm.getName().equals()PageController pc=new PageController(); EmployeeBase service=new EmployeeBase(); ArrayList result=(ArrayList)service.search(queryForm,pc);HttpSession session=request.getSession();session.setAttribute(queryForm,que

12、ryForm);session.setAttribute(pageController,service.getPageController();request.setAttribute(queryResult,result); request.setAttribute(pageController,service.getPageController(); return mapping.findForward(haveResult);elsereturn mapping.findForward(noResult);(3),翻页Action的代码片断public ActionForward exe

13、cute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception /读取翻页参数TurnPageForm turnPageForm=(TurnPageForm)form;/从PageController中取出查询信息,并使用bean提供的调用接口处理结果HttpSession session=request.getSession();PageController pc=(PageController)session.getAttr

14、ibute(pageController); Base queryForm=(Base)session.getAttribute(queryForm);pc.setCurrentPage(turnPageForm.getViewPage();EmployeeBase service=new EmployeeBase();ArrayList result=(ArrayList)service.search(queryForm,pc);/根据参数将数据写入 requestrequest.removeAttribute(queryResult);request.removeAttribute(pag

15、eController);request.setAttribute(queryResult,result); request.setAttribute(pageController,pc);/forward 到显示页面 return mapping.findForward(haveResult);(4)数据库访问bean中的片断public Collection search(Base base, PageController pc)throws SQLException ArrayList emps = new ArrayList();ResultSet rs = getSearchResu

16、lt(base);rs.absolute(-1);pc.setTotalRowsAmount(rs.getRow();setPageController(pc);if (rs.getRow() 0) rs.absolute(pc.getPageStartRow();do System.out.println(in loop + rs.getRow();Base b = new Base();b.setName(rs.getString(Name);b.setIdCard(rs.getString(IDCard);System.out.println(From db: + rs.getStrin

17、g(IDCard);emps.add(b);if (!rs.next() break; while (rs.getRow() (pc.getPageEndRow() + 1);return emps;(5)在jsp中,翻页部分的代码片断 class=a02Previous class=a02Next这样一来,翻页的功能可以以你喜欢的方式表现给client 版权声明 本篇文章对您是否有帮助? 投票: 是 否 投票结果: 作者其它文章: Struts处理用户表单请求的核心源代码: Struts例子的设计分析(转)- - struts简单例子的分析 使用struts,ibaits和JSTL开发简便通

18、用的文件上传系统 Struts标记库 作者全部文章 评论人:fangxia 参与分: 593 专家分: 15 发表时间: 2005-03-30 14:31 思路8错,谢谢。 这个文章共有 1 条评论,共 1 页 / $JSP页面查询显示常用模式1.直接使用ResultSet2.Value Object3.hashmap key,value4.RowSet-1.直接使用ResultSet 最大众化的方法, 原文中忽略了这一方法,偶给加上了 代码略2. 使用Value Object。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示。这种方法的缺点是每一种查

19、询都需要定义一个java class,并且将记录数据封装成java对象时也需要很多额外的代码。示例代码:/查询数据代码 Connection conn = DBUtil.getConnection(); PreparedStatement pst = null; ResultSet rs = null; try String sql=“select emp_code, real_name from t_employee where organ_id=?”; pst = conn.preparedStatement(sql); pst.setString(1, “101”); ResultSet

20、 rs = pst.executeQuery(); List list = new ArrayList(); Employee emp; while (rs.next() emp = new Employee(); emp.setReakName(rs.getString(“real_name”); emp.setEmpCode(rs.getString(“emp_code”); list.add(emp); return list; finally DBUtil.close(rs, pst ,conn); /jsp显示部分代码 代码 姓名 % Employee emp; for (int i

21、=0; i 3. 使用hashmap作为数据容器。具体做法:1 生成一个List对象(List list = new ArrayList() )。2 生成一个Map对象(Map map = new HashMap() )。使用Map封装一行数据,key为各字段名,value为对应的值。(map.put(“USER_NAME”), rs.getString(“USER_NAME”)3 将第2 步生成的Map对象装入第1步的list对象中(list.add(map) )。4 重复2、3步直到ResultSet遍历完毕在DBUtil. resultSetToList(ResultSet rs)方法中

22、实现了上述过程(所有列名均使用大写),可参考使用。HashMap map = null;while(rs.next()map = new HashMap();map.put(Field1,rs.getString(Field1);map.put(Field2,rs.getString(Field2);*map.put(fieldn,rs.getString(fieldn);以上是写死的,可以使用ResultSetMetadata进行干净彻底的一次性封装,可以取到rs中所有字段名String name = null;ResultSetMetaData rsmd = rs.getMetaData(

23、);int num = rsmd.getColumnCount();int i = 0;while(rs.next()for(i=1;i=num;i+)name = rsmd.getColumnName(i);map.put(name,rs.getString(rs);/*end for*/*end while*/示例代码:/查询数据部分代码: Connection conn = DBUtil.getConnection(); PreparedStatement pst = null; ResultSet rs = null; try String sql=“select emp_code,

24、real_name from t_employee where organ_id=?”; pst = conn.preparedStatement(sql); pst.setString(1, “101”); rs = pst.executeQuery(); List list = DBUtil. resultSetToList(ResultSet rs); return list; finally DBUtil.close(rs, pst ,conn); /JSP显示部分代码 代码 姓名 % Map colMap; for (int i=0; i 4. 使用RowSet。RowSet是JDB

25、C2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭后仍然有效。oracle的rowset实现在/software/content.html的jdbc下载里有,名称是ocrs12.zip示例代码:/查询数据部分代码: import javax.sql.RowSet; import orac

26、le.jdbc.rowset.OracleCachedRowSet; Connection conn = DBUtil.getConnection(); PreparedStatement pst = null; ResultSet rs = null; try String sql=“select emp_code, real_name from t_employee where organ_id=?”; pst = conn.preparedStatement(sql); pst.setString(1, “101”); rs = pst.executeQuery(); OracleCac

27、hedRowSet ors = newOracleCachedRowSet(); /将ResultSet中的数据封装到RowSet中 ors.populate(rs); return ors; finally DBUtil.close(rs, pst, conn); /JSP显示部分代码 代码 姓名 适用场合: 1.ResultSet适合于短平快项目,纯JSP方案最适合 2.value object使用于定制的查询操作,个人认为该方法比较SB,而许多人却乐此不疲, 如果使用struts,ibatis,hibernate等开发基本上属于此中模式, 使用value object其实还是一个比较重量

28、级的方案,如果不使用 EJB或web sevice等分布式方案,确实没有使用value object的必要, 大家都倡导轻量级的解决方案,为何不更轻松些,使用方法1或3, 写一大堆value bean,无论是从开发工作量和维护上都是一个噩梦 3.HashMap充当数据容器适用于多条查询语句或需要对查询结果进行处理的情况。 该方法比较不错,灵活机动,适用范围广, 纯JSP,EJB,WEB SERVICE均适用 4.RowSet适合于单条查询语句,适用于快速开发。 RowSet本身就是一种数据容器,其功能与hashmap差不多, 方法3可以取代方法4版权声明 本篇文章对您是否有帮助? 投票: 是

29、否 投票结果: 作者其它文章: jdbc驱动导致的中文问题 在项目中使用Struts-menu 企业管理软件的需求描述方法 web开发中的多条件查询处理技巧1则 valuelist简介 作者全部文章 评论人:robornet 参与分: 636 专家分: 55 来自: 阳光岛 发表时间: 2005-04-26 08:41 ?得不?,?何第二?方法?第三?方法的示例代?一?呢? 评论人:robornet 参与分: 636 专家分: 55 来自: 阳光岛 发表时间: 2005-04-26 08:42 总结得不错,为何第二种方法与第三种方法的示例代码一样呢? 评论人:giscat 参与分: 16832

30、 专家分: 1787 发表时间: 2005-04-26 08:50 方法2,3不一样的把,2要写valuebean3使用hashmap充当数据容器,把每条记录都放到一个hashmap中,然后把hashmap放到list里 评论人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 09:03 改了一下 HashMap map = null;while(rs.next()map = new HashMap();map.put(Field1,rs.getString(Field1);map.put(Field2,rs.getString(Field2);*ma

31、p.put(fieldn,rs.getString(fieldn);以上是写死的,可以使用ResultSetMetadata进行干净彻底的一次性封装,可以取到rs中所有字段名String name = null;ResultSetMetaData rsmd = rs.getMetaData();int num = rsmd.getColumnCount();int i = 0;while(rs.next()for(i=1;i=num;i+)name = rsmd.getColumnName(i);map.put(name,rs.getString(rs);/*end for*/*end whi

32、le*/ 这个文章共有 4 条评论,共 1 页 上一篇文章 返回JSP/Servlet/JSF 下一篇文章 / $JSP分页技术实现 title: JSP分页技术实现summary:使用工具类实现通用分页处理author: evan_zhaoemail: evan_目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。其它常见的方法还有每次

33、翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库

34、,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询employee按birthday排序的第100到120条记录应该这么写:pre select * from ( select my_table.*, rownum as my_rownum fr

35、om ( select name, birthday from employee order by birthday ) my_table where rownum =100/premySQL可以使用LIMIT子句:select name, birthday from employee order by birthday LIMIT 99,20DB2有rownumber()函数用于获取当前行数。SQL Server没研究过,可以参考这篇文章:/develop/article/18/18627.shtm在Web程序中分页会被频繁使用,但分页的实现细节却是编程过

36、程中比较麻烦的事情。大多分页显示的查询操作都同时需要处理复杂的多重查询条件,sql语句需要动态拼接组成,再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示,程序会变得很复杂并且难以理解。因此需要一些工具类简化分页代码,使程序员专注于业务逻辑部分。下面是我设计的两个工具类:PagedStatement 封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了PreparedStatement支持动态设置参数。RowSetPage 参考PetStore的page by page iterator模式, 设计 RowSetPage用于封装查询结果(使

37、用OracleCachedRowSet缓存查询出的一页数据,关于使用CachedRowSet封装数据库查询结果请参考JSP页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息, 并且可以生成简单的HTML分页代码。PagedStatement 查询的结果封装成RowsetPage。下面是简单的使用示例: /DAO查询数据部分代码: public RowSetPage getEmployee(String gender, int pageNo) throws Exception String sql=select emp_id, emp_code, user_name, real_n

38、ame from employee where gender =?; /使用Oracle数据库的分页查询实现,每页显示5条 PagedStatement pst =new PagedStatementOracleImpl(sql, pageNo, 5); pst.setString(1, gender); return pst.executeQuery(); /Servlet处理查询请求部分代码: int pageNo; try /可以通过参数pageno获得用户选择的页码 pageNo = Integer.parseInt(request.getParameter(pageno) ); ca

39、tch(Exception ex) /默认为第一页 pageNo=1; String gender = request.getParameter(gender ); request.setAttribute(empPage, myBean.getEmployee(gender, pageNo) ); /JSP显示部分代码 function doQuery() form1.actionType.value=doQuery; form1.submit(); 性别: input type=text name=gender size=1 value= ID 代码 用户名 姓名 效果如图:因为分页显示一

40、般都会伴有查询条件和查询动作,页面应已经有校验查询条件和提交查询的javascript方法(如上面的doQuery),所以 RowSetPage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascript方法。注意在显示查询结果的时候上次的查询条件也需要保持,如input type=text name=gender size= 1 value=。同时由于页码的参数名可以指定,因此也支持在同一页面中有多个分页区。另一种分页代码实现是生成每一页的URL,将查询参数和页码作为QueryString附在URL后面。这种方法的缺陷是在查询条件比较复杂时难以处理,并且需要指定处理查询动作的servlet,可能不适合某些定制的查询操作。如果对RowSetPage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码,RowSetPage提供了很多getter方法用于获取相关信息(如当前页码、总页数、 总记录数和当前记录数等)。在实际应用中可以将分页查询和显示做成jsp taglib, 进一步简化JSP代码,屏蔽Java Code。附:分页工具类的源代码, 有注释,应该很容易理解。1.Page.java2.RowSetPage.java(RowSetPage继承Page)3.PagedStatement.java4.Pag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论