刚做到页面这一块,数据库取记录,怎么做分页
分页的关键原理是什么

解决方案 »

  1.   

    你用JSP的话 分页的关键肯定是SQL语句啦:
    给你举个例子:
    /**
    * 实现新闻的分页查询
    * @param size 每页显示的大小
    * @param currentPage 当前的页码
    * @return 新闻列表
    */
    public List<News> findNewsByCondition(int size, int currentPage) {
    int length=0;
    if(currentPage>1){
    length = size ;
    }else{
    length = size * (currentPage-1);
    }

    String sql = "select top "
    + size
    + " * from news where  newsID not in ( select top "
    + length
    + " newsID from news order by newsID desc ) order by newsID desc";
    List<News> items = new ArrayList<News>();
    Result rs = SqlHelper.getRs(sql);
    if (rs != null && rs.getRowCount() > 0) {
    for (int i = 0; i < rs.getRowCount(); i++) {
    Map map = rs.getRows()[i];
    items.add(get(map));
    }

    }
    return items;

    }
    方法很简单  你应该能看的懂,在页面需要分页的地方获取的数据就从这个方法来拿就可以.
      

  2.   

    一种是数据库级别的分页,
    public List <News> findNewsByCondition(int size, int currentPage) { 
    int length=0; 
    if(currentPage>1){ 
    length = size ; 
    }else{ 
    length = size * (currentPage-1); 
    } String sql = "select top " 
    + size 
    + " * from news where  newsID not in ( select top " 
    + length 
    + " newsID from news order by newsID desc ) order by newsID desc"; 
    List <News> items = new ArrayList <News>(); 
    Result rs = SqlHelper.getRs(sql); 
    if (rs != null && rs.getRowCount() > 0) { 
    for (int i = 0; i < rs.getRowCount(); i++) { 
    Map map = rs.getRows()[i]; 
    items.add(get(map)); 
    } } 
    return items; } 
    还有一中是在页面上对数据进行分页
      

  3.   

    在网页实现分页主要是传参数问题,把参数传到dao里面,而在dao主要作出要从第几条开始找,找到第几条。StringBuffer sql=new StringBuffer("select * from (select nid,sname,sdescription,nprice,simg,nmctag,nmaxid,nminid,rownum as num from t_mc where 1=1");
    if(nid!=-1){
    sql.append("and nid="+nid);
    }
    if(skey!=null){
    sql.append("and sname like '%"+skey+"%' ");
    }
    if(prstart!=-1){
    sql.append("and nprice>="+prstart);

    }
    if(prend!=-1){
    sql.append("and nprice<="+prend);

    }
    if(tymax!=-1){
    sql.append("and nmaxid="+tymax);

    }
    if(tymin!=-1){
    sql.append("and nminid="+tymin);
    }
    if(paend!=-1){
    sql.append("and rownum<="+paend);

    }
    sql.append(")");
    if(pastart!=-1){

    sql.append("where num>="+pastart);
    }
    这是一个商品分页显示,可以参数一下。
      

  4.   

    而传参数除了相应的商品属性的参数之外,在分页起作用的主要是paend,pastart这二个参数是决定从查询记录数的范围。
      

  5.   


    <%@ page contentType="text/html; charset=gb2312" language="java" errorPage="../error.jsp" %>
    <script language="JavaScript"><!--
    function Jumping(){
      document.PageForm.submit();
      return ;
    }function gotoPage(pagenum){
      document.PageForm.jumpPage.value = pagenum;
      document.PageForm.submit();
      return ;
    }-->
    </script>每页<%=pageCtl.rowsPerPage%>行
    共<%=pageCtl.maxRowCount%>行
    第<%=pageCtl.curPage%>页
    共<%=pageCtl.maxPage%>页
    <BR>
    <%if(pageCtl.curPage==1){ out.print(" 首页 上一页");   }else{  %>   
    <A HREF="javascript:gotoPage(1)">首页</A>
    <A HREF="javascript:gotoPage(<%=pageCtl.curPage-1%>)">上一页</A>
    <%}%>
    <%if(pageCtl.curPage==pageCtl.maxPage){ out.print("下一页 尾页");   }else{  %>   
    <A HREF="javascript:gotoPage(<%=pageCtl.curPage+1%>)">下一页</A>
    <A HREF="javascript:gotoPage(<%=pageCtl.maxPage%>)">尾页</A>
    <%}%>
    转到第<SELECT name="jumpPage" onchange="Jumping()">
         <% for(int i=1;i<=pageCtl.maxPage;i++)  {
         if (i== pageCtl.curPage){
         %>
         <OPTION selected value=<%=i%>><%=i%></OPTION>
         <%}else{%>
         <OPTION value=<%=i%>><%=i%></OPTION>
         <%}}%>   
         </SELECT>页
      

  6.   

    语句都写 原理如下
    package com.ichong.idao;import java.util.List;import com.ichong.entity.News;
    public interface INewsDao {

    /**
     * @分页查找宠物新闻
     * @param page 查找第几页
     * @param size 每页多少条记录
     * @return
     */
    List<News> getNewsByPageAndSize(int page,int size);
    /**
     * @获取按size条记录每页共能分多少页
     * @param size
     * @return
     */
        int getPages(int size);
        
        
        boolean addNews(News news);
        
        boolean deleteNews(int id);

    }页面中:
    <%
    int pagenum = 1;
    int pagesum = 0;
    int size = 5; if (request.getParameter("pagenum") != null) { //容错处理
    try {
    pagenum = Integer.parseInt(request.getParameter("pagenum")); //容错处理
    if (pagenum < 1) //容错处理
    pagenum = 1; //容错处理
    } catch (Exception e) {
    pagenum = 1; //容错处理 }
    }
    INewsDao nd = DaoFactory.getNewsDao();
    pagesum = nd.getPages(size);        if (pagenum > pagesum) { //容错处理
    pagenum = pagesum; //容错处理
    } //容错处理
    if(pagenum <1) //容错处理
    pagenum = 1; //容错处理         
    List<News> news = nd.getNewsByPageAndSize(pagenum, size);

    %>
      

  7.   

    先获取所有信息的数量,然后确定每页显示多少条信息,然后计算有多少页。
    在读取数据的时候根据读取的页数,计算出该页显示的信息的行号,然后获取数据显示。
    http://user.qzone.qq.com/409120723/blog/1240717889  
    这里面有六个分页方法,你好好看看,需要用哪个自己决定。
      

  8.   

    GOOGLE一搜一大堆,主要原理就是首先算出一共有多少条显示数据,然后根据根据你每页要显示的条数求模,然后得到的就是共有多少页,在根据每页的具体条数通过Http协议传递给下页
      

  9.   

    我知道的一种方法是:
    关键在于确定当前页(超链接里的参数),然后根据当前页发送请求,数据库返回相应的数据。
    1.首页为1,每页显示行数自己设置。
    2.根据首页和当前页可以确定上一页
    3.根据数据总条数和每页显示数可以确定末页
    4.根据末页和当前页可以确定下一页
    /**
     * 分页实体类
     * @author dhw
     *
     */
    public class MyPage {
    /**每页显示行数*/
    private int row = 22;
    /**当前页,默认为1*/
    private int onNbr = 1;
    /**上一页*/
    private int upNbr;
    /**下一页*/
    private int downNbr;
    /**末页*/
    private int lastNbr;
    /**总的数据量*/
    private int dbRows;

    public int getDbRows() {
    return dbRows;
    }
    public void setDbRows(int dbRows) {
    this.dbRows = dbRows;
    // 通过总行数设置最后页和下一页
    this.lastNbr = (this.dbRows%this.row==0?this.dbRows/this.row:this.dbRows/this.row+1);
    this.downNbr = (this.onNbr==this.lastNbr?this.onNbr:this.onNbr+1);
    }
    public int getOnNbr() {
    return onNbr;
    }
    public void setOnNbr(int onNbr) {
    this.onNbr = onNbr;
    // 通过当前页设置上一页
    this.upNbr = this.onNbr>1?this.onNbr-1:1;
    }
    public int getDownNbr() {
    return downNbr;
    }
    public int getLastNbr() {
    return lastNbr;
    }
    public void setLastNbr(int lastNbr) {
    this.lastNbr = lastNbr;
    }
    public int getUpNbr() {
    return upNbr;
    }
    public void setUpNbr(int upNbr) {
    this.upNbr = upNbr;
    }
    public void setDownNbr(int downNbr) {
    this.downNbr = downNbr;
    }
    public int getRow() {
    return row;
    }
    public void setRow(int row) {
    this.row = row;
    }}
    我这里只是提供一种思路,也应该有其他方法。
      

  10.   

    JSP中的超链接,myPage是放在session里的,怎么取就不用我说了吧,后台分页根据onNbr和row可以确定:
    <a href="queryPetList.do?onNbr=1">首页</a>
    <a href="queryPetList.do?onNbr="+myPage.getUpNbr()>上一页</a>
    <a href="queryPetList.do?onNbr="+myPage.getDownNbr()>下一页</a>
    <a href="queryPetList.do?onNbr="+myPage.getLastNbr()>末页</a>当然还有一种方式是AJAX不刷新页面方式,那需要异步请求。
      

  11.   

    我的资源里有个javabean分页源码,注释的相当详细,运行效果不错
    楼主可以去参考参考
      

  12.   

    数据层用hibernate或者是其他什么orm的话比较简单  
       直接用criteria写条件 
      criteria.addOrder(...);
      criteria.setFirstResult(start);//开始位置
      criteria.setMaxResults(COUNT);//
          criteria.list();
          取当前页显示的数据
          用另外一个criteria来取总条数
          ...查询条件省略
            criteria1.setProjection(Projections.rowCount());
    List countlist= criteria1.list();
    totalCount = Integer.parseInt(countlist.get(0).toString());//总条数
           countlist.get(0).toString()这种写法是有点丑陋了 呵呵 不过 聚合函数操作嘛
           必然会有个返回值的
    用jdbc的话要判断结果集的大小比如每页显示12条 最后一页还有3条 这样的情况要单独处理 
      

  13.   

    谢谢大家的提供
    关键问题 整个过程很复杂 我始终理不清 
    从页面到业务逻辑层  在到DAO层, 在到数据库中的数据
    我很难把他们串起来  .................
    脑子都想破了
      

  14.   

    static pages and non-static pages,non-static pages need db support
      

  15.   

    package s2jsp.bysj.impl;
    import java.util.*;
    public class Paginate {
    private int pageNo;
    private int pageSize;
    private int pageCount;
    private int totalCount; public Paginate(int pageNo, int pageSize) {
    super();
    this.pageNo = pageNo;
    this.pageSize = pageSize;
    }
    public Paginate() {
    super();
    // TODO Auto-generated constructor stub
    }
    public Paginate(int pageNo, int pageSize, int pageCount, int totalCount) {
    super();
    this.pageNo = pageNo;
    this.pageSize = pageSize;
    this.pageCount = pageCount;
    this.totalCount = totalCount;
    }
    public int getPageCount() {
    return pageCount;
    }
    public void setPageCount(int pageCount) {
    this.pageCount = pageCount;
    }
    public int getPageNo() {
    return pageNo;
    }
    public void setPageNo(int pageNo) {
    this.pageNo = pageNo;
    }
    public int getPageSize() {
    return pageSize;
    }
    public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    }
    public int getTotalCount() {
    return totalCount;
    }
    public void setTotalCount(int totalCount) {
    this.totalCount = totalCount;
    }

    public List Pagging(List all)
    {
    // if(this.pageSize<=all.size())
    // {
    // return all;
    // }
    if(all.size()==0)
    {
    return null;
    }

    if(this.pageSize<0)
    {
    this.pageSize=5;
    }
    this.totalCount=all.size();
    this.pageCount=this.totalCount/this.pageSize;
    if(this.totalCount%this.pageSize!=0)
    {
    this.pageCount++;
    }


    if(pageNo<0)
    {
    pageNo=1;
    }
    if(pageNo>pageCount)
    {
    pageNo=pageCount;
    }


    List lst=new ArrayList();
    for (int i = (this.pageNo-1)*this.pageSize; i < this.pageNo*this.pageSize; i++) {
    if(i>=all.size())
    {
    break;
    }
    lst.add(all.get(i));
    }
    return lst;
    }}
    定义这个类   以后想给那个集合分页   就创建个对象   设置下 pageNo当前页码数  pageSize每页显示几条信息   把要分页的那个集合传进去   就ok这个是通用的  不过效率会有点低  但是现在很实用