先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。 然后查询结果输出界面: result.jsp 比如每页 20 个结果 result.jsp 自动重定向到 result.jsp?page=1 result.jsp?page=1 前 20 个: 0。。19 result.jsp?page=2 输出 : 20。。39 result.jsp?page=3 输出 : 40。。59 ... 不知道有没有更好的方法。 |
startunix 回复于:2002-12-11 16:53:45 |
我做的时候是把输出放在ArrayList中间(由于vector费资源。。),但是如果把rs返回到jsp中间的话,是不太好的,不利于组件话思想。 |
RoadStar 回复于:2002-12-11 17:00:33 |
startunix 能不能把你的POST出来一个看看? |
cinc 回复于:2002-12-11 17:12:39 |
结构就是: jsp -> java bean -> database java bean 里通过 jdbc 查询数据库,并把结果存放成 result[] 的形式 每个 result 对象表示数据库里的一个记录。 jsp 页面里把 这个 result[] 取出来显示。 这样 jsp 就没有直接和 数据库做操作,比较节省资源。 |
johnx 回复于:2002-12-11 17:26:13 |
板主弄个源代码出来看看萨 |
imagegarden 回复于:2002-12-11 18:26:11 |
[quote][b]下面引用由[u]cinc[/u]在 [i]2002/12/11 04:32pm[/i] 发表的内容:[/b] 先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。 然后查询结果输出界面: result.jsp 比如每页 20 个结果 result.jsp 自动重定向到 result.jsp?page=1 ... [/quote] 这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组? 而且,结果太大的select文,在查询时就花时间啊 |
cinc 回复于:2002-12-12 08:43:20 |
[quote][b]下面引用由[u]imagegarden[/u]在 [i]2002/12/11 06:26pm[/i] 发表的内容:[/b] 这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组? 而且,结果太大的select文,在查询时就花时间啊 [/quote] 我现在也只能做到,查询出所有符合条件的记录(result set) 然后把中间的 20 个放在一个数组里,让 jsp 来取。 如何让查询时就只返回 20 个还是没办法做到的。好像 sql 不支持。 |
eclipse 回复于:2002-12-12 09:10:06 |
不能回贴,就贴图吧 |
eclipse 回复于:2002-12-12 09:13:33 |
JSP数据库操数据分页显示 -------------------------------------------------------------------------------- 源作者:何志强 人气:3614 <%@ page contentType="text/html;charset=8859_1" %> <% //变量声明 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.String strPage; int i; //设置一页显示的记录数 intPageSize = 2; //取得待显示页码 strPage = request.getParameter("page"; if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据 intPage = 1; } else{//将字符串转换成整型 intPage = java.lang.Integer.parseInt(strPage); if(intPage<1) intPage = 1; } //装载JDBC驱动程序 java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); //设置数据库连接字符串 strCon = "jdbcracle:thin:@linux:1521ra4cweb"; //连接数据库 sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq"; //创建一个可以滚动的只读的SQL语句对象 sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY); //准备SQL语句 strSQL = "select name,age from test"; //执行SQL语句并获取结果集 sqlRst = sqlStmt.executeQuery(strSQL); //获取记录总数 sqlRst.last(); intRowCount = sqlRst.getRow(); //记算总页数 intPageCount = (intRowCount+intPageSize-1) / intPageSize; //调整待显示的页码 if(intPage>intPageCount) intPage = intPageCount; %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title> </head> <body> <table border="1" cellspacing="0" cellpadding="0"> <tr> <th>姓名</th> <th>年龄</th> </tr> <% if(intPageCount>0){ //将记录指针定位到待显示页的第一条记录上 sqlRst.absolute((intPage-1) * intPageSize + 1); //显示数据 i = 0; while(i<intPageSize && !sqlRst.isAfterLast()){ %> <tr> <td><%=sqlRst.getString(1)%></td> <td><%=sqlRst.getString(2)%></td> </tr> <% sqlRst.next(); i++; } } %> </table> 第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%> <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%> </body> </html> <% //关闭结果集 sqlRst.close(); //关闭SQL语句对象 sqlStmt.close(); //关闭数据库 sqlCon.close(); %> |
eclipse 回复于:2002-12-12 09:18:42 |
http://www.ambysoft.com/persistenceLayer.pdf |
9命怪猫 回复于:2002-12-12 09:22:40 |
偶用过ASP,那里边从数据库里读出数据来(放在recordset对象里边),就可以在对象里边直接设置pagesize属性,用以分页。不知道jsp是不是也可以如此。 |
cinc 回复于:2002-12-12 09:44:01 |
[这个贴子最后由cinc在 2002/12/12 09:48am 编辑] [quote][b]下面引用由[u]eclipse[/u]在 [i]2002/12/12 09:13am[/i] 发表的内容:[/b] JSP数据库操数据分页显示 -------------------------------------------------------------------------------- 源作者:何志强 人气:3614 ... [/quote] 对。没错。 下面是从别人那里抄来的一段代码。用来返回某一页上显示的部分帖子: /** * Get the top-level threads under the given category from start index * * @param category - The category * @param startIndex - The start index for retrieveing the records * @param length - The number of records to be tretieved * @return Collection - A collection of threads under the given category */ public Collection findByCategory( final int category, final int startIndex, final int endIndex throws SQLException, CategoryNotFoundException { final Connection conn = getConnection(); final ArrayList result = new ArrayList(); final PreparedStatement stat = conn.prepareStatement( "select * from threads where category_id=" + category + "order by last_update DESC" ; final ResultSet resultSet = stat.executeQuery(); if( resultSet.absolute( startIndex { do{ result.add( new Thread( resultSet.getString("id", resultSet.getString("title" , resultSet.getString("content", resultSet.getString("author", resultSet.getLong("last_update") }while( resultSet.next() && (resultSet.getRow() <= endIndex) ; } stat.close(); conn.close(); return result; } Thread 表示一个帖子 category 是论坛编号 resultSet.absolute( startIndex 用于定位到开始的那个帖子 结果存放在 ArrayList 中返回。 然后在 jsp 里用 while 循环把 collection 里的内容一个一个输出。 |
cinc 回复于:2002-12-12 09:46:36 |
[这个贴子最后由cinc在 2002/12/12 09:49am 编辑] [quote][b]下面引用由[u]imagegarden[/u]在 [i]2002/12/11 06:26pm[/i] 发表的内容:[/b] 这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组? 而且,结果太大的select文,在查询时就花时间啊 [/quote] ResultSet 在执行完 execute 后好像还不会把数据库中的记录都读入内存。 只有在 resultSet.next(), resultSet.getXXX("column_name" 的时候才会去读数据库里的数据 这样说来,查询结果比较多应该不会造成性能的下降。 看我上面的代码段。 |
pwair 回复于:2002-12-13 10:58:04 |
[这个贴子最后由pwair在 2002/12/13 11:00am 编辑] 各位:我试了一下, Select top 20 * from table; 不过好像不好用?标准sql支持select top么? |