⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java分页大全.txt

📁 java 技术参考汇集超值大礼包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
     * @param sql  query sql 
     */ 
    public PagedStatementOracleImpl(String sql){ 
        super(sql); 
    } 


    /** 
     * 构造一查询出当页数据的PageStatement 
     * @param sql  query sql 
     * @param pageNo  页码 
     */ 
    public PagedStatementOracleImpl(String sql, int pageNo){ 
        super(sql, pageNo); 
    } 

    /** 
     * 构造一查询出当页数据的PageStatement,并指定每页显示记录条数 
     * @param sql query sql 
     * @param pageNo 页码 
     * @param pageSize 每页容量 
     */ 
    public PagedStatementOracleImpl(String sql, int pageNo, int pageSize){ 
        super(sql, pageNo, pageSize); 
    } 


    /** 
     *生成查询一页数据的sql语句 
     *@param sql 原查询语句 
     *@startIndex 开始记录位置 
     *@size 需要获取的记录数 
     */ 
    protected String intiQuerySQL(String sql, int startIndex, int size){ 
        StringBuffer querySQL = new StringBuffer(); 
        if (size != super.MAX_PAGE_SIZE) { 
            querySQL.append("select * from (select my_table.*,rownum as my_rownum from(") 
                    .append(  sql) 
                    .append(") my_table where rownum<").append(startIndex + size) 
                    .append(") where my_rownum>=").append(startIndex); 
        } else { 
            querySQL.append("select * from (select my_table.*,rownum as my_rownum from(") 
                    .append(sql) 
                    .append(") my_table ") 
                    .append(") where my_rownum>=").append(startIndex); 
        } 
        return querySQL.toString(); 
    } 

    /** 
     *将ResultSet数据填充进CachedRowSet 
     */ 
    protected  RowSet populate(ResultSet rs) throws SQLException{ 
        OracleCachedRowSet ocrs = new OracleCachedRowSet(); 
        ocrs.populate(rs); 
        return ocrs; 
    } 

} 


相关连接:
  JSP页面查询显示常用模式,介绍查询结果集封装的几种常用模式。本程序使用了其中部分代码
  RowSet规范原来是JDBC(TM) 2.0 Optional Package的一部分,现在已经并入JDBC3.0规范,并且将成为J2SE1.5的组成部分。
  关于RowSet的实现各个数据库的jdbc driver应该都有提供,oracle实现可以到http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html下载(Additional RowSet support)
  Sun也提供了RowSet的参考实现,应该可以支持大多数数据库:http://java.sun.com/products/jdbc/download.html
  PetStore 是Sun关于J2EE设计模式的一个示例程序。 

版权声明   给作者写信  本篇文章对您是否有帮助?  投票: 是    否     投票结果:        
 
 
 
作者其它文章: 
JSP页面查询显示常用模式 
使用jsp实现word、excel格式报表打印 
作者全部文章  
 
 
  评论人:sun2bin    参与分: 108672    专家分: 985    来自: http://www.nju.edu.cn
 发表时间: 2003-09-06 09:31  
在我的印象里面,Oracle中如果使用where rownum > xxx的话将会一条记录也不返回。一般只使用rownum<xxx或rownum<=xxx。  
 
  评论人:sun2bin    参与分: 108672    专家分: 985    来自: http://www.nju.edu.cn
 发表时间: 2003-09-06 09:32  
对不起,看错了。:P  
 
  评论人:calmness    参与分: 3    专家分: 0  发表时间: 2003-09-08 22:12  
若使用EJB的CMP来获得大的查询结果,该如何控制呢  
 
  评论人:evan    参与分: 47686    专家分: 375    来自: Shanghai
 发表时间: 2003-09-09 09:17  
千万不要这么做,效率极其低下  
 
  评论人:mmgg    参与分: 49    专家分: 0  发表时间: 2003-09-11 10:19  
这是我写的测试代码,为什么只能看第一页,不能翻到第二页!
<%@ page import = "page.*"%>
<script language="javascript">
    function doQuery(){
        form1.actionType.value="doQuery";
        form1.submit();    
        }    
</script>
<form name=form1 method=get>
<input type=hidden name=actionType>
性别:<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">
<input type=button value=" 查询 " onclick="doQuery()">
</form>
<%! int pageNo;%>
<%

try{        //可以通过参数pageno获得用户选择的页码        
pageNo = Integer.parseInt(request.getParameter("pageno") );    }catch(Exception ex){        
//默认为第一页        
pageNo=1;    
}
String sql="select xh,xm,nsrsbh,nsrmc from fl_cjzgjcd";    //使用Oracle数据库的分页查询实现,每页显示5条

PagedStatement pst =new PagedStatementOracleImpl(sql,  pageNo, 3);        
//pst.setString(1, gender);
RowSetPage empPage = pst.executeQuery(); 

if (empPage == null )
empPage = RowSetPage.EMPTY_PAGE;
%>
<table  cellspacing="0" width="90%"> 
< tr> <td>ID</td> <td>代码</td>  <td>用户名</td> <td>姓名</td>  < /tr>
<%    javax.sql.RowSet empRS = (javax.sql.RowSet) empPage.getRowSet();
if (empRS!=null) while (empRS.next() ) {
%>        
<tr>
<td><%= empRS.getString("XH")%></td>
<td><%= empRS.getString("XM")%></td>
<td><%= empRS.getString("NSRSBH")%></td>
<td><%= empRS.getString("NSRMC")%></td>
</tr><%    }
// end while
%>        
<tr>
< %    //显示总页数和当前页数(pageno)以及分页代码。     //此处doQuery为页面上提交查询动作的javascript函数名,pageno为标识当前页码的参数名
%>            
<td colspan=4><%= empPage.getHTML("doQuery", "pageno")
%>
</td>        
</tr>    
</table>  
 
  评论人:mmgg    参与分: 49    专家分: 0  发表时间: 2003-09-11 11:08  
OK了,你的代码中有个小问题!</form>应该是在</table>的后边,否则无法传递pageno参数给页面!  
 
  评论人:evan    参与分: 47686    专家分: 375    来自: Shanghai
 发表时间: 2003-09-11 12:21  
谢谢!

jsp代码中不要这么申明:<%! int pageNo;%>,因为这样pageNo是servlet成员变量,会存在多线程问题  
 
  评论人:eppen    参与分: 21    专家分: 5  发表时间: 2003-09-11 12:59  
网上还有一个比较好的分页方法

http://tech.163.com/tm/030407/030407_89186.html
 
 
  评论人:mmgg    参与分: 49    专家分: 0  发表时间: 2003-09-12 13:28  
明白了,evan,期待您的下一篇文章!  
 
  评论人:mmgg    参与分: 49    专家分: 0  发表时间: 2003-09-12 16:44  
evan,每次查询都要连接一次数据库是否影响效率,我看到的其他的代码大都是连接数据库后将连接放到session中,下次用的时候取出,不知道你是怎么考虑的?  
 
  评论人:evan    参与分: 47686    专家分: 375    来自: Shanghai
 发表时间: 2003-09-16 21:29  
如果连接保存在session中什么时候关闭?如果用户很多也会有问题吧?
一般解决方法是使用连接池,大多应用服务器或web framework都支持,自己写一个也不难
 
 
  评论人:freedomlinux    参与分: 36    专家分: 0  发表时间: 2003-10-10 10:16  
there are a little problem in  JavaScript of "Page.java" .the writer use "document.all" ,but not "document.getElementById".so another browser (i.e mozilla) can not browse it.i correct the javaScript in it.
so the linux user can browse it smoothly,here is the code.
///////////////////////////////////////////////////////////////
    public String getHTML(String queryJSFunctionName, String pageNoParamName){
        if (getTotalPageCount()<1){
            return "<input type='hidden' name='"+pageNoParamName+"' value='1' >";
        }
        if (queryJSFunctionName == null || queryJSFunctionName.trim().length()<1) {
            queryJSFunctionName = "gotoPage";
        }
        if (pageNoParamName == null || pageNoParamName.trim().length()<1){
            pageNoParamName = "pageno";
        }

        String gotoPage = "_"+queryJSFunctionName;
       
        StringBuffer html = new StringBuffer("\n");
        html.append("<script language=\"Javascript1.2\">\n")
             .append("function ").append(gotoPage).append("(pageNo){  \n")
             .append(  "   var curPage=1;  \n")
             .append(  "   try{ curPage = document.getElementById(\"")
             .append("select_id").append("\").value;  \n")
             .append(  "        document.getElementById(\"").append("select_id")
             .append("\").value = pageNo;  \n")
             .append(  "        ").append(queryJSFunctionName).append("(pageNo); \n")
             .append(  "        return true;  \n")
             .append(  "   }catch(e){ \n")
//             .append(  "      try{ \n")
//             .append(  "           document.forms[0].submit();  \n")
//             .append(  "      }catch(e){   \n")
              . append(  "           alert('Not define inquiry method : function ")
             .append(queryJSFunctionName).append("()'); \n")
             .append(  "          document.getElementById(\"").append("select_id")
             .append("\").value = curPage;  \n")
             .append(  "          return false;  \n")
//             .append(  "      }  \n")
             .append(  "   }  \n")
             .append(  "}")
             .append(  "</script>  \n")
             .append(  "");
        html.append( "<table  border=0 cellspacing=0 cellpadding=0 align=center width=80%>  \n")
             .append( "  <tr>  \n")
             .append( "    <td align=left><br>  \n");
         html.append(  "        共" ).append(  getTotalPageCount() ).append("页")
             .append(  "       [") .append(getStart()).append("..").append(getEnd())
             .append("/").append(this.getTotalSize()).append("]  \n")
             .append( "    </td>  \n")
             .append( "    <td align=right>  \n");
        if (hasPreviousPage()){
             html.append( "[<a href='javascript:").append(gotoPage)
             .append("(") .append(getCurrentPageNo()-1) 
              . append( ")'>上一页</a>]   \n");
        }
        html.append(  "       第")
             .append(   "        <select name='")
             .append(pageNoParamName).append("' id='select_id'").append(" onChange='javascript:")
             .append(gotoPage).append("(this.value)'>\n");
        String selected = "selected";
        for(int i=1;i<=getTotalPageCount();i++){
            if( i == getCurrentPageNo() )
                 selected = "selected";
            else selected = "";
            html.append( "      <option value='").append(i).append("' ")
              .append(selected).append(">").append(i).append("</option>  \n");
        }
        if (getCurrentPageNo()>getTotalPageCount()){
            html.append( "      <option value='").append(getCurrentPageNo())
            .append("' selected>").append(getCurrentPageNo())
            .append("</option>  \n");
        }
        html.append( "    </select>页  \n");
        if (hasNextPage()){
             html.append( "    [<a href='javascript:").append(gotoPage)
               .append("(").append((getCurrentPageNo()+1)) 
                 .append( ")'>下一页</a>]   \n");
        }
        html.append( "</td></tr></table>  \n");

        return html.toString();

    }
////////////////////////////////////////////////////////////////////////
Don't use document.all

I've lost count of the number of Javascript scripts I've seen floating around that include the equivalent of the following code snippet:

if (document.all) {
   element = document.all[id];
else {
   element = document.getElementById(id);
}

document.all was introduced in Internet Explorer 4, because the W3C DOM hadn't yet standardised a way of grabbing references to elements using their ID. By the time IE 5 came out, document.getElementById() had been standardised and as a result, IE 5 included support for it.

IE 5 was released in September 1998. A popular browser statistics site (insert usual disclaimer as to the reliability of any stats but your own here) show IE 4's market share to be in the region of 1%. Even Netscape 4 has more users than that!

Don't use document.all. document.getElementById() is supported by every Javascript supporting browser released since 1998.  
 
客人: michaellhj  发表时间: 2003-11-20 13:07  
你好,记得你在JavaResearchOrganization上发过的帖子:”JSP分页技术实现“吗?


我看过后觉得很不错,决定采用你的方法了。首先注明的是我是新手,希望一些很低级的问题和错误请你原谅。

我是用websphere 
 
 
 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



          $$$$$$$$$$$$$$$$解决MVC下分页显示的问题 

 

  前几天做一个系统,用到的是Tomcat+struts+Mysql的MVC框架。由于很多模块都需要分页,网上很多方法都不是很适合,自己想写一个分页的方法,让所有的模块都能够使用,好不容易花了几天把问题给搞清楚了,觉得还是写些东西跟大家分享一下。如果那位有更好的方法的话,咱们共同探讨一下,让更多的人有所收获。在写这个代码的时候参考了网友evan_zhao的意见(http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=8893). 他说常见的方法每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用 rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
  至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。
  因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。

所以我用到了从数据库中查询当前页面记录的办法。由于设计到公司核心代码的缘故,我就简单的用一个图书的例子介绍一下是我的思路:
一 开发思路:
      我是用Struts的,当然就要使用到MVC这个模式,分页的时候也是这样的。
        首先要有一个和数据库链接的bean,我们暂时叫DBUtil吧,这里面封装了很多和数据库有关的东西,比如有查询,修改,插入等方法,这是一个基本的类,这里我们用到的是查询,这个方法返回的数据类型是Object[][]。这里大家要注意一下,你也可以返回别的类型,但是一定要注意把后面对应的程序也修改一下。一下是这个类的部分代码:
package com.model;

import com.attribute.Constants;

import java.sql.*;
import java.util.*;


/**
 * Created by IntelliJ IDEA.
 * User: 7612CE
 * Date: 2005-6-2
 * Time: 21:41:38
 * To change this template use Options | File Templates.
 */
public class DBUtil {

    String sDBDriver=Constants.DBDriver;
    String url=Constants.DBUrl;
    String dbUser=Constants.DBUser;
    String dbPassword=Constants.DBPassword;
    Connection conn=null;
    PreparedStatement stmt=null;
    ResultSet rs=null;

    public DBUtil()throws ClassNotFoundException{
        try{
            Class.forName(sDBDriver);
            conn=DriverManager.getConnection(url,dbUser,dbPassword);
        }catch(Exception e){
           System.out.println("DBUtil():"+e.getMessage());
        }
    }
/**
     * Search some record in object table
     * @param sql sql segment
     * @ param map values for match
     * @return Collection
     */
    public Object[][] doSearch(String sql,Object [] data)throws SQLException{
        PreparedStatement stmt = conn.prepareStatement(sql);
        for(int i=0;data!=null&&i<data.length;i++){
            System.out.print("the aql is ="+sql);
            System.out.println("data is " + data[i]);
            stmt.setObject(i+1,data[i]);
        }
        ResultSet rset = stmt.executeQuery();
        ResultSetMetaData rsm = rset.getMetaData();
        int col = rsm.getColumnCount();
        ArrayList list = new ArrayList();
        //Each element of list contains a record of resultset
        while(rset.next()){
            list.add(getLine(rset,col));
        }

        if(list.size()==0||col==0){
            closePrepStmt();
            return null;
        }

        closePrepStmt();
        //Construct box as a data matrix
        Object[][] box = new Object[list.size()][col];
        for(int i=0;i<list.size();i++)
            for(int j=0;j<col;j++)
            {
                box[i][j] =((Object[])list.get(i))[j];
            }
            return box;
    }
  由于是写分页的,当然也是要有一个page的类,具体代码如下,由于有很多注释,不用一一介绍了:
package com.util;

    /**
     * Title: 分页对象<br>
     * Description:  用于包含数据及分页信息的对象<br>
     *Page类实现了用于显示分页信息的基本方法,但未指定所含数据的类型,
     *可根据需要实现以特定方式组织数据的子类,<br>
     *如RowSetPage以RowSet封装数据,ListPage以List封装数据<br>
     * Copyright:    Copyright (c) 2002 <br>
     * @author evan_zhao@hotmail.com <br>
     * @version 1.0
     */
    public  class Page implements java.io.Serializable {
        public static final Page EMPTY_PAGE = new Page();
        public static final int  DEFAULT_PAGE_SIZE = 2;
        public static final  int MAX_PAGE_SIZE = 2;

        private int myPageSize = DEFAULT_PAGE_SIZE;

        private int start;
        private int avaCount,totalSize

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -