web到底怎样做分页比较好呢?我现在做的 每次都要从数据库中取相应的数据,要是有查条件的话更麻烦,每次都要重新装载查询条件!感觉麻烦死了,以前做c/s将数据一次性取出,效率又高又简单!
大家都有什么好方法啊,快说说

解决方案 »

  1.   

    像楼主说的那样如果数据量大的话不管是b/s和c/s将数据一次性取出都是一种比较差的设计,比如许多人都用过plsql developer吧,用它做select查询他也不会一下子显示所有数据,只有按了上面一个按钮才会继续把数据全部取出的。b/s的分页可以用一些框架帮你完成,但框架也只是简化你的开发,如果想提高性能的话,可以用一些jdbc本身的标准和特性来做,比如用CachedRowSet代替ResultSet,如果想做得再极至一点,那只能利用数据库本身得特性,比如sql server的top和oracle的rownumber。如果再想增加一些用户体验的话,那在前台可以将分页做成Ajax请求
      

  2.   

    software_apprentice() 你说的这些我都在用,但是感觉不爽啊,比如查询条件怎么处理啊?放在session中或放在隐藏框中都觉得不好,而且要是查询条件多的话,也不好处理
      

  3.   

    分页时jdbc访问海量数据库的方法,我一直在用很好用!
    -------------------------------------
    sql = "select * from (select rownum as my_rownum,
    table_a.* from (" + sql0 + ") table_a where 
    rownnum <" + nEndBeginRecNum + ") where my_rownum >=" + nBeginRecNum;其中:
       sql0为原始的sql语句,可以进行排序操作
       nBeginRecNum,nEndRecNum为起始和终止记录号。
    -------------------------------------
      

  4.   

    rownum,2000里没有这方法吧!2005才有吧?
      

  5.   

    用newxy技术最方便:<%@ page contentType="text/html; charset=GBK" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><%@ taglib uri="/WEB-INF/newxy-html.tld" prefix="nhtml"%>
    <%@ taglib uri="/WEB-INF/newxy-logic.tld" prefix="nlogic"%>
    <%@ taglib uri="/WEB-INF/newxy-bean.tld" prefix="nbean"%><nhtml:javascripts/>
    <nhtml:stylesheets/><nbean:formBean name="industry" sql="select * from industry"/>
    <logic:present name="industry">
      <logic:notEmpty name="industry" property="_coll">
        <div align="center" style="font-size:14px"><b>== 行 业 ==</b></div>
        <div><nlogic:navigate formName="industry" length="20"/></div>
        <table>
        <nlogic:iterate id="rec" name="industry" property="_coll">
          <nhtml:TR >
            <td style="font-size:14px;color:#000088;cursor:hand">
                <bean:write name="rec" property="code"/>
                <bean:write name="rec" property="industry"/>
            </td>
          </nhtml:TR>
        </nlogic:iterate>
        </table>
      </logic:notEmpty>
    </logic:present>每页显示20条行业代码及行业信息,默认为25条。来自:http://www.newxy.net/zh_cn/articles/pagination.jsp
      

  6.   

    select top 每页记录数 * from 表名
    where 主键列 > (select max(主键列) from (select top ((要查询的页数-1)*每页记录数) 主键列 from 表名 order by 主键列) as T)
    order by 主键列
    select top 10 * from song 
    where iSongId > (select max(iSongId) from (select top ((3-1)*10) iSongId from song order by iSongId) as T)
    order by iSongId
      

  7.   

    niitlxr(NIITLXR)  这位仁兄的方法不错,既高效,又简单。
      

  8.   

    数据量大的话不管是b/s和c/s将数据一次性取出都是一种比较差的设计
      

  9.   

    niitlxr(NIITLXR)  这位仁兄的方法不错,既高效,又简单。___过奖了,我也是抄的....WHERE 条件复杂的时候  也有点麻烦。
      

  10.   

    select top 每页记录数 * from 表名
    where 主键列 > (select max(主键列) from (select top ((要查询的页数-1)*每页记录数) 主键列 from 表名 order by 主键列) as T)
    order by 主键列
    ------------------------------------
    主键列) as T)     楼主这个"T"是什么意思啊?
      

  11.   

    Method one:
      每次取出需要显示的记录数 比如说20条,Oracle 实现:
     
      SELECT * FROM (SELECT ROWNUM AS NUM,查询字段... WHERE 1=1 AND ....查询条件   
      AND ROWNUM <= 当前页 * 页面显示数据量) WHERE NUM > (当前页-1)*页面数据量
    Method two:
      一次取出需要的数据(需要对记录限制),然后保存会话中,然后在一页一页显示
      参考实现可以查看 extremeTable 标签库方法一方便显示海量数据,可能缺陷:数据超大时,翻页可能很慢,排序过滤比较难
    方法二方便显示小量数据,耗内存,翻页快,排序、过滤非常方便,具体参见extremeTable标签
      

  12.   

    niitlxr(NIITLXR)  正解!
    ===============rownum 不是vs2005 的 而是Oracel数据库查询的,他代替了sql的order by 排序
    支持,学习.......
      

  13.   

    我也在做分页,现在遇到了问题,哪位能帮帮忙。
    谁对java的分页比较熟悉?
    要求遍历一个表的数据,然后从另一个表中提取条件筛选出合适的列出来,分页显示,现在我用的方法不能筛选,只能显示全部的。我是web开发,java执行程序,jsp做显示页面
      

  14.   

    这是分页jsp页面,可根据需要自己改动:
    <%@page contentType="text/html; charset=GBK"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <input type="hidden" name="currentPage" value="${currentPage}">
    <script type="text/javascript">
    var pagingFormName="${param.formName}";
    function firstPage(){
      goPage(1);
    }
    function previousPage(){
      goPage(parseInt(document.forms(pagingFormName).currentPage.value)-1);
    }
    function nextPage(){
      goPage(parseInt(document.forms[pagingFormName].currentPage.value)+1);
    }
    function endPage(){
      goPage(${pages});
    }
    function goPage(index){
      var form=document.forms[pagingFormName];
      form.currentPage.value=index;
      form.submit();
    }
    </script>
    <table>
      <tr>
        <td>共${amount}条记录</td>
        <td>共${pages}页</td>
        <td>当前是第${currentPage}页</td>
        <c:if test="${currentPage > 1}">
        <td><a href="javascript:firstPage()">首页</a></td>
        <td><a href="javascript:previousPage()">前一页</a></td>
        </c:if>
        <c:if test="${currentPage < pages}">
        <td><a href="javascript:nextPage()">后一页</a></td>
        <td><a href="javascript:endPage()">尾页</a></td>
        </c:if>
      </tr>
    </table>后台处理程序需要将以下几个变量存入request中(可写成一个固定的方法)  public class PagingUtils{  /**
       * 默认当前为第几页的变量名
       */
      public static final String CURRENT_PAGE_NAME = "currentPage" ;  /**
       * 默认每一页最大数据量变量名
       */
      public static final String PAGE_SIZE_NAME = "pageSize" ;  /**
       * 默认总记录数变量名
       */
      public static final String AMOUNT_NAME = "amount" ;  /**
       * 默认总页数变量名
       */
      public static final String PAGES_NAME = "pages" ;  public static PagingData init(HttpServletRequest request){
        //在这里初始化一个PagingData对象
      }
      public static void save(HttpServletRequest request,PagingData data){
        //在这里将PagingData对象中的数据存入request
      }
      
    }public class PagingData
        implements Serializable
    {
      /**
       * 分页后查询到的数据.
       */
      private List data = new ArrayList () ;  /**
       * 总记录数
       */
      private int amount = 0 ;  /**
       * 总页数
       */
      private int pages = 1 ;  /**
       * 当前为第几页
       */
      private int currentPage ;  /**
       * 每一页的数据量
       */
      private int pageSize ;  /**
       * 构造分页数据实体
       * @param pageSize int 每一页的数据量
       * @param currentPage int 当前为第几页
       */
      public PagingData ( int pageSize , int currentPage )
      {
        this.pageSize = pageSize ;
        this.currentPage = currentPage ;
      }  /**
       * 分页后查询到的数据
       * @return List
       */
      public List getData ()
      {
        return data ;
      }  /**
       * 总记录数
       * @return int
       */
      public int getAmount ()
      {
        return amount ;
      }  /**
       * 总页数
       * @return int
       */
      public int getPages ()
      {
        return pages ;
      }  /**
       * 当前为第几页
       * @return int
       */
      public int getCurrentPage ()
      {
        return currentPage ;
      }  /**
       * 每一页的数据量
       * @return int
       */
      public int getPageSize ()
      {
        return pageSize ;
      }  /**
       * 查询到的数据量
       * @return int
       */
      public int getCurrentAmount ()
      {
        return data.size () ;
      }  /**
       * 设定总记录数
       * @param amount int
       */
      public void setAmount ( int amount )
      {
        this.amount = amount ;
        if ( amount > 0 )
        {
          int k = amount % pageSize ;
          pages = ( k == 0 ) ? amount / pageSize :
              ( ( amount - k ) / pageSize ) + 1 ;
        }
      }  /**
       * 设定查询到的数据
       * @param data List 查询到的数据
       */
      public void setData ( List data )
      {
        this.data = data ;
      }
    }
    在处理分页的程序中调用PagingUtils类的方法就行了
    在分页的jsp中:
    <jsp:include file="paing.jsp?formName=myForm"/>此行必须写在一个Form中
    需要时改动上面的分页jsp文件就行