【Jsp精品源码栏目提醒】:网学会员在Jsp精品源码频道为大家收集整理了“JSP分页技术实现 - 基础科学“提供大家参考,希望对大家有所帮助!
在 java 中分页的一种实现我的项目中的分页功能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 用来进行翻页控制/public class PageController int totalRowsAmount //总行数boolean rowsAmountSet //是否设置过 totalRowsAmountint pageSize2 //每页行数int currentPage1 //当前页码int nextPageint previousPageint totalPages //总页数boolean hasNext //是否有下一页boolean hasPrevious //是否有前一页String descriptionint pageStartRowint pageEndRowpublic PageControllerint totalRowssetTotalRowsAmounttotalRowspublic PageController/ param i 设定总行数/public void setTotalRowsAmountint i ifthis.rowsAmountSettotalRowsAmount itotalPagestotalRowsAmount/pageSize1setCurrentPage1this.rowsAmountSettrue/ param i 当前页/public void setCurrentPageint i currentPage inextPagecurrentPage1previousPagecurrentPage-1//计算当前页开始行和结束行ifcurrentPagepageSizelttotalRowsAmountpageEndRowcurrentPagepageSizepageStartRowpageEndRow-pageSize1elsepageEndRowtotalRowsAmountpageStartRowpageSizetotalPages-11//是否存在前页和后页if nextPagegttotalPageshasNextfalseelsehasNexttrueifpreviousPage0hasPreviousfalseelsehasPrevioustrueSystem.out.printlnthis.description/ return/public int getCurrentPage 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/ return/public int getTotalPages return totalPages/ return/public int getTotalRowsAmount return totalRowsAmount/ param b/public void setHasNextboolean b hasNext b/ param b/public void setHasPreviousboolean b hasPrevious b/ param i/public void setNextPageint i nextPage i/ param i/public void setPageSizeint i pageSize i/ param i/public void setPreviousPageint i previousPage i/ param i/public void setTotalPagesint i totalPages i/ return/public int getPageEndRow return pageEndRow/ return/public int getPageStartRow return pageStartRowpublic String getDescriptionString descriptionquotTotal:quotthis.getTotalRowsAmountquot items quotthis.getTotalPages quot pagesquot// this.currentPagequot Previous quotthis.hasPrevious // quot Next:quotthis.hasNext// quot start row:quotthis.pageStartRow// quot end row:quotthis.pageEndRowreturn descriptionpublic String descriptionString descriptionquotTotal:quotthis.getTotalRowsAmountquot items quotthis.getTotalPages quot pagesCurrent page:quotthis.currentPagequot Previous quotthis.hasPrevious quot Next:quotthis.hasNextquot start row:quotthis.pageStartRowquot end row:quotthis.pageEndRowreturn descriptionpublic static void mainString argsPageController pcnew PageController3System.out.printlnpc.getDescription// pc.setCurrentPage2// System.out.printlnpc.description// pc.setCurrentPage3// System.out.printlnpc.description(2)查询 Action 的代码片断public ActionForward executeActionMapping mappingActionForm formHttpServletRequest requestHttpServletResponse responsethrows Exception Base queryForm Base formifqueryForm.getName.equalsquotquotPageController pcnew PageControllerEmployeeBase servicenew EmployeeBaseArrayList resultArrayListservice.searchqueryFormpcHttpSession sessionrequest.getSessionsession.setAttributequotqueryFormquotqueryFormsession.setAttributequotpageControllerquotservice.getPageControllerrequest.setAttributequotqueryResultquotresultrequest.setAttributequotpageControllerquotservice.getPageControllerreturn mapping.findForwardquothaveResultquotelsereturn mapping.findForwardquotnoResultquot(3),翻页 Action 的代码片断public ActionForward executeActionMapping mappingActionForm formHttpServletRequest requestHttpServletResponse responsethrows Exception //读取翻页参数TurnPageForm turnPageFormTurnPageFormform//从 PageController 中取出查询信息,并使用 bean 提供的调用接口处理结果HttpSession sessionrequest.getSessionPageController pcPageControllersession.getAttributequotpageControllerquotBase queryFormBasesession.getAttributequotqueryFormquotpc.setCurrentPageturnPageForm.getViewPageEmployeeBase servicenew EmployeeBaseArrayList resultArrayListservice.searchqueryFormpc//根据参数将数据写入 requestrequest.removeAttributequotqueryResultquotrequest.removeAttributequotpageControllerquotrequest.setAttributequotqueryResultquotresultrequest.setAttributequotpageControllerquotpc//forward 到显示页面return mapping.findForwardquothaveResultquot(4)数据库访问 bean 中的片断public Collection searchBase base PageController pcthrows SQLException ArrayList emps new ArrayListResultSet rs getSearchResultbasers.absolute-1pc.setTotalRowsAmountrs.getRowsetPageControllerpcif rs.getRow gt 0 rs.absolutepc.getPageStartRowdo System.out.printlnquotin loopquot rs.getRowBase b new Baseb.setNamers.getStringquotNamequotb.setIdCardrs.getStringquotIDCardquotSystem.out.printlnquotFrom db:quot rs.getStringquotIDCardquotemps.addbif rs.next break while rs.getRow lt pc.getPageEndRow 1return emps5在
jsp 中,翻页部分的代码片断ltbean:write namequotpageControllerquot propertyquotdescriptionquot/gtltlogic:equal namequotpageControllerquot propertyquothasPreviousquot valuequottruequotgtlta pageControllerquot propertyquotpreviousPagequot/gtquot classquota02quotgtPreviouslt/agtlt/logic:equalgtltlogic:equal namequotpageControllerquot propertyquothasNextquot valuequottruequotgtlta pageControllerquot propertyquotnextPagequot/gtquot classquota02quotgtNextlt/agtlt/logic:equalgt这样一来,翻页的功能可以以你喜欢的方式表现给 client作者其它文章:Struts 处理用户表单请求的核心源代码:Struts 例子的设计分析转- -struts 简单例子的分析使用 strutsibaits 和 JSTL 开发简便通用的文件上传系统Struts 标记库作者全部文章
JSP 页面查询显示常用模式1.直接使用 ResultSet2.Value Object3.hashmap keyvalue4.RowSet------------------------1.直接使用 ResultSet 最大众化的方法, 原文中忽略了这一方法,偶给加上了 代码略2. 使用 Value Object。
将每条记录均封装成 JavaBean 对象,把这些对象装入 Collection 传送给
JSP 显示。
这种方法的缺点是每一种查询都需要定义一个 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.preparedStatementsql pst.setString1 “101” ResultSet rs pst.executeQuery List list new ArrayList Employee emp while rs.next emp new Employee emp.setReakNamers.getString“real_name” emp.setEmpCoders.getString“emp_code” … list.addemp return list finally DBUtil.closers pst conn //
jsp 显示部分代码lt List empList Listrequest.getAttribute“empList” if empList null empList Collections.EMPTY_LISTgt…lttable cellspacingquot0quot width”90”gt lttrgt lttdgt代码lt/tdgt lttdgt姓名lt/tdgt lt/trgtlt Employee emp for int i0 ilt empList.size i emp Employee empList.getigt lttrgt lttdgtlt emp.getEmpCodegtlt/tdgt lttdgtlt emp.getRealNamegtlt/tdgt lt/trgtlt // end forgtlt/tablegt3. 使用 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.addmap 。
4. 重复 2、3 步直到 ResultSet 遍历完毕 ,可参在 DBUtil. resultSetToListResultSet rs方法中实现了上述过程(所有列名均使用大写)考使用。
HashMap map nullwhilers.nextmap new HashMapmap.putquotField1quotrs.getStringquotField1quotmap.putquotField2quotrs.getStringquotField2quotmap.putquotfieldnquotrs.getStringquotfieldnquot以上是写死的,可以使用 ResultSetMetadata 进行干净彻底的一次性封装,可以取到 rs 中所有字段名String name nullResultSetMetaData rsmd rs.getMetaDataint num rsmd.getColumnCountint i 0whilers.nextfori1iltnuminame rsmd.getColumnNameimap.putquotnamequotrs.getStringquotrsquot/end for//end while/示例代码://查询数据部分代码: … 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.preparedStatementsql pst.setString1 “101” rs pst.executeQuery List list DBUtil. resultSetToListResultSet rs return list finally DBUtil.closers pst conn //
JSP 显示部分代码lt List empList Listrequest.getAttribute“empList” if empList null empList Collections.EMPTY_LISTgt…lttable cellspacingquot0quot width”90”gt lttrgt lttdgt代码lt/tdgt lttdgt姓名lt/tdgt lt/trgtlt Map colMap for int i0 ilt empList.size i colMap Map empList.getigt lttrgt lttdgtltcolMap.get“EMP_CODE”gtlt/tdgt lttdgtltcolMap.get“REAL_NAME”gtlt/tdgt lt/trgtlt // end forgtlt/tablegt4. 使用 RowSet。
RowSet 是 JDBC2.0 中提供的接口Oracle 对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。
OracleCachedRowSet 实现了 ResultSet 中的所有方法,但与ResultSet 不同的是,OracleCachedRowSet 中的数据在 Connection 关闭后仍然有效。
oracle 的 rowset 实现在 http://otn.oracle.com/software/content.html 的 jdbc 下载里有,名称是ocrs12.zip示例代码://查询数据部分代码: import javax.sql.RowSet import oracle.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.preparedStatementsql pst.setString1 “101” rs pst.executeQuery OracleCachedRowSet ors newOracleCachedRowSet //将 ResultSet 中的数据封装到 RowSet 中 ors.populaters return ors finally DBUtil.closers pst conn //
JSP 显示部分代码lt javax.sql.RowSet empRS javax.sql.RowSet request.getAttribute“empRS”gt…lttable cellspacingquot0quot width”90”gt lttrgt lttdgt代码lt/tdgt lttdgt姓名lt/tdgt lt/trgtlt if empRS null while empRS.next gt lttrgt lttdgtlt empRS.get“EMP_CODE”gtlt/tdgt lttdgtlt empRS.get“REAL_NAME”gtlt/tdgt lt/trgtlt // end whilegtlt/tablegt适用场合: 1.ResultSet 适合于短平快项目,纯
JSP 方案最适合 2.value object使用于定制的查询操作个人认为该方法比较 SB,而许多人却乐此不疲, 如果使用 strutsibatishibernate 等开发基本上属于此中模式, 使用 value object 其实还是一个比较重量级的方案,如果不使用 EJB 或 web sevice 等分布式方案,确实没有使用 value object 的必要, 大家都倡导轻量级的解决方案,为何不更轻松些,使用方法 1 或 3, 写一大堆 value bean,无论是从开发工作量和维护上都是一个噩梦 3.HashMap 充当数据容器适用于多条查询语句或需要对查询结果进行处理的情况。
该方法比较不错,灵活机动,适用范围广, 纯
JSP,EJB,WEB SERVICE 均适用 4.RowSet适合于单条查询语句,适用于快速开发。
RowSet 本身就是一种数据容器,其功能与 hashmap 差不多, 方法 3 可以取代方法 4总结得不错,为何第二种方法与第三种方法的示例代码一样呢? 评论人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 08:50方法 2,3 不一样的把,2 要写 valuebean3 使用 hashmap 充当数据容器,把每条记录都放到一个 hashmap 中,然后把hashmap 放到 list 里 评论人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 09:03改了一下HashMap map nullwhilers.nextmap new HashMapmap.putquotField1quotrs.getStringquotField1quotmap.putquotField2quotrs.getStringquotField2quotmap.putquotfieldnquotrs.getStringquotfieldnquot以上是写死的,可以使用 ResultSetMetadata 进行干净彻底的一次性封装,可以取到 rs 中所有字段名String name nullResultSetMetaData rsmd rs.getMetaDataint num rsmd.getColumnCountint i 0whilers.nextfori1iltnuminame rsmd.getColumnNameimap.putquotnamequotrs.getStringquotrsquot/end for//end while/
JSP 分页技术实现title:
JSP 分页技术实现summary:使用工具类实现通用分页处理author: evan_zhaoemail: evan_zhaohotmail.com 目前比较广泛使用的分页方式是将查询结果缓存在 HttpSession 或有状态 bean 中,翻页的时候从缓存中取出一页数据显示。
这种方法有两个主要的缺点: 一是用户可能看到的是过期数据; 二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间, 并且缓存的数据也会占用大量内存,效率明显下降。
其它常见的方法还有每次翻页都查询一次数据库,从 ResultSet 中只取出一页数据(使用 rs.lastrs.getRow获得总计录条数, 。
使用 rs.absolute定位到本页起始记录) 这种方式在某些数据库如 oracle的 JDBC 实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
至于缓存结果集 ResultSet 的方法则完全是一种错误的做法。
因为 ResultSet 在 Statement或 Connection 关闭时也会被关闭,如果要使 ResultSet 有效势必长时间占用数据库连接。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。
这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。
而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
在 oracle 数据库中查询结果的行号使用伪列 ROWNUM 表示(从 1 开始) 。
例如 select from employee where rownumlt10 返回前 10 条记录。
但因为 rownum 是在查询之后排序之前赋值的,所以查询 employee 按 birthday 排序的第 100 到 120 条记录应该这么写:pre select from select my_table. rownum as my_rownum from select name birthday from employee order by birthday my_table where rownum lt120 where my_rownumgt100/pre mySQL 可以使用 LIMIT 子句: select name birthday from employee order by birthday LIMIT 9920 DB2 有 rownumber函数用于获取当前行数。
SQL Server 没 研 究 过 , 可 以 参 考 这 篇 文 章 :http://www.csdn.net/develop/article/18/18627.shtm 在 Web 程序中分页会被频繁使用, 但分页的实现细节却是编程过程中比较麻烦的事情。
大多分页显示的查询操作都同时需要处理复杂的多重查询条件, 语句需要动态拼接组成, sql再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示,程序会变得很复杂并且难以理解。
因此需要一些工具类简化分页代码, 使程序员专注于业务逻辑部分。
下面是我设计的两个工具类: PagedStatement 封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了 PreparedStatement 支持动态设置参数。
RowSetPage 参考 PetStore 的 page by page iterator 模式, 设计 RowSetPage 用于封装查询结果(使用 OracleCachedRowSet 缓存查询出的一页数据, 关于使用 CachedRowSet 封装数据库查询结果请参考
JSP 页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息, 并且可以生成简单的 HTML 分页代码。
PagedStatement 查询的结果封装成 RowsetPage。
下面是简单的使用示例: //DAO 查询数据部分代码: … public RowSetPage getEmployeeString gender int pageNo throws Exception String sqlquotselect emp_id emp_code user_name real_name from employee wheregender quot //使用 Oracle 数据库的分页查询实现每页显示 5 条 PagedStatement .
上一篇:
JSP网页设计规范
下一篇:
湖南成考生选择专业从哪些方面出发?