1、因此需要一些工具类简化分页代码,使程序员专注于业务逻辑部分。下面是我设计的两个工具类:PagedStatement封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了PreparedStatement支持动态设置参数。RowSetPage参考PetStore的pagepageiterator模式,设计RowSetPage用于封装查询结果(使用OracleCachedRowSet缓存查询出的一页数据,关于使用CachedRowSet封装数据库查询结果请参考JSP页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息,并且可以生成简单的HTML分页代码。
2、查询的结果封装成RowsetPage。下面是简单的使用示例:1. 2. /DAO查询数据部分代码: 3. 4. publicRowSetPagegetEmployee(Stringgender,intpageNo)throwsException 5. Stringsql=emp_id,emp_code,user_name,real_namegender=?;6. /使用Oracle数据库的分页查询实现,每页显示5条 7. PagedStatementpst=newPagedStatementOracleImpl(sql,pageNo,5);8. pst.setString(1,gender);
3、9. returnpst.executeQuery();10. 11. 12. 13. /Servlet处理查询请求部分代码:14. 15. 16. pageNo;17. try 18. /可以通过参数pageno获得用户选择的页码 19. pageNo=Integer.parseInt(request.getParameter(pageno);20. catch(Exceptionex) 21. /默认为第一页 22. pageNo=1;23. 24. request.getParameter(gender25. request.setAttribute(empPage,myBean.get
4、Employee(gender,26. 27. 28. /JSP显示部分代码 29. 30. 31. scriptlanguage=javascript32. functiondoQuery() 33. form1.actionType.value=doQuery34. form1.submit();35. 36. /script37. 38. formname=form1method=get39. inputtype=hiddenname=actionType40. 性别:41. type=textname=gendersize=1value=%=request.getParameter()
5、%42. type=button查询onclick=doQuery()43. 47. 48. tablecellspacing=0width=90%49. trtdID代码用户名姓名50. 54. 55. %=empRS.getString(EMP_ID56. EMP_CODE57. USER_NAME58. REAL_NAME59. 60. 63. 64. 68. tdcolspan=4.getHTML(69. 70. /table71. /form效果如图:因为分页显示一般都会伴有查询条件和查询动作,页面应已经有校验查询条件和提交查询的javascript方法(如上面的doQuery),所
6、以RowSetPage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascript方法。注意在显示查询结果的时候上次的查询条件也需要保持,如。同时由于页码的参数名可以指定,因此也支持在同一页面中有多个分页区。另一种分页代码实现是生成每一页的URL,将查询参数和页码作为QueryString附在URL后面。这种方法的缺陷是在查询条件比较复杂时难以处理,并且需要指定处理查询动作的servlet,可能不适合某些定制的查询操作。如果对RowSetPage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码,RowSetPage提供了很多gett
7、er方法用于获取相关信息(如当前页码、总页数、总记录数和当前记录数等)。在实际应用中可以将分页查询和显示做成jsptaglib,进一步简化JSP代码,屏蔽JavaCode。附:分页工具类的源代码,有注释,应该很容易理解。1.Page.java2.RowSetPage.java(RowSetPage继承Page)3.PagedStatement.java4.PagedStatementOracleImpl.java(PagedStatementOracleImpl继承PagedStatement)您可以任意使用这些源代码,但必须保留authorevan_zhao字样2. / 3. / 4. /P
8、age.java 5. /evan_zhao 6. / 7. / 8. 9. packagepage;10. 11. importjava.util.List;12. importjava.util.ArrayList;13. importjava.util.Collection;14. importjava.util.Collections;15. 16. 17. /* Title:分页对象Description:用于包含数据及分页信息的对象Page类实现了用于显示分页信息的基本方法,但未指定所含数据的类型, 可根据需要实现以特定方式组织数据的子类,如RowSetPage以RowSet封装数
9、据,ListPage以List封装数据totalSize)/throwRuntimeException(记录条数大于总条数?!71. 72. this.currentPageno(start-1)/pageSize+1;73. this.totalPageCount(totalSize+-1)/74. 75. (totalSize=0&avaCount=0) 76. 1;77. 78. 79. StartIndextoNo:-currentPageno);80. 81. 82. getData() 83. this.data;84. 85. 86. 87. 取本页数据容量(本页能包含的记录数)
10、 88. return本页能包含的记录数 89. 90. getPageSize() 91. this.myPageSize;92. 93. 94. 95. 是否有下一页 96. 97. 98. booleanhasNextPage()99. /* 100. (avaCount=0totalSize=0) 101. false;102. 103. 104. 105. (this.getCurrentPageNo()1);117. 118. 119. 120. 获取当前页第一条数据在数据库中的位置 121. return 122. 123. getStart() 124. 125. 126. 1
11、27. 128. 获取当前页最后一条数据在数据库中的位置 129. 130. 131. getEnd() 132. this.getStart()this.getSize()-1;133. (end0)134. 0;135. 136. end;137. 138. 139. 140. 获取上一页第一条数据在数据库中的位置 141. 记录对应的rownum 142. 143. getStartOfPreviousPage()144. Math.max(start-myPageSize,145. 146. 147. 148. 149. 获取下一页第一条数据在数据库中的位置 150. 151. 152. getStartOfNextPage()153. avaCount;154. 155. 156. 157. 获取任一页第一条数据在数据库中的位置,每页条数使用默认值 158. 页号 159. 160. 161. getStartOfAnyPage(intpageNo) 162. getStartOfAnyPage(pageNo,DEFAULT_PAGE_SIZE);163. 164. 165. 166. 获取任一页第一条数据在数据库中的位置 167. 168. 每页包含的记录数 169. 170. 171. pageSize) 172. startIndex(pageNo-1)173.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1