本帖最后由 skyair2046 于 2009-10-12 21:56:55 编辑

解决方案 »

  1.   

    http://topic.csdn.net/u/20090715/16/08d47b5b-f229-4938-b914-6b2f94320a3e.html?79481
      

  2.   

    看楼主做的项目应该是用的是ssh框架做的吧
    其实用一个自定义标签就是最好的 那么你以后也只要修改相应的参数 就可以直接用呢
    其实底层查询的方法你只要传递两个参数就可以了 一个是当前第几页 一个是每页显示的条数
    而在action里面 初始化的时候 将当前页数设置为第一页 而下一页 就将页码加一,上一页就减一 最后一页就是整个数据的最大页数(这个是根据你总共有多少条数据/你每页显示的条数算出来的)首页 就是将页码设置为1  
      

  3.   

    我的资源里有个javabean分页源码,下载后即可使用,搂主可以去看看
      

  4.   

    action里面初始化的当前页一是什么意思?这里看不懂。其他都差不多了
      

  5.   

    现在出了个小问题。总页数得不到值。
    Configuration cfg = new Configuration().configure();
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();
    Query query = session.createSQLQuery("select count(*) from student");
    List<Object[]> list = query.list();
    System.out.print(list.size());
    for (int i = 0; i < list.size(); i++) {

    Object[] obj = list.get(i);

    for (int j = 0; j < obj.length; j++) {
    System.out.print(obj[j] + "    "); } System.out.println();
    System.out.println("---------------------"); }
    }
    这个值实在是拿不到。。照理是可以拿出来的
    出这个异常
    1Exception in thread "main" java.lang.ClassCastException: java.math.BigInteger
      

  6.   

    1.后台:
    1.1设置一个分页的实体类;
    1.2在每次查询列表的时候
    1.2.1查询分页信息:总页数
    1.2.2在分页实体类里面更新当前页数
    1.3将列表合集和分页实体类对象返回到页面
    2.前台
    2.1读取当前页
    2.1.1当页面第一次显示的时候,没有当前页参数,则要判断
    2.2读取出列表合集和分页实体类对象
    2.2.1根据分页实体类里面的总页数和当前页比对,作出判断
    2.2.2在上一页、下一页链接中,作出分页计算
    以下以我做过的一个完整例子来说明一下(其中省去了数据库连接基类:BaseDao和主题类TopicPo的定义):package com.cdjj.pojo;
    /**
    * 分页组件(或者是分页实体)的定义
    */
    public class PatitionPo {
    //当前页
    private int nowpage = 1;
    //总页数
    private int totalpage = 1;
    //每页显示条数
    private int perpage = 3;



    public int getNowpage() {
    return nowpage;
    }
    public void setNowpage(int nowpage) {
    this.nowpage = nowpage;
    }
    public int getPerpage() {
    return perpage;
    }
    public void setPerpage(int perpage) {
    this.perpage = perpage;
    }
    public int getTotalpage() {
    return totalpage;
    }
    public void setTotalpage(int totalpage) {
    this.totalpage = totalpage;
    }
    }------------------------------------------------------------------------------------
    package com.cdjj.dao;import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;import com.cdjj.pojo.PatitionPo;
    import com.cdjj.pojo.TopicPo;
    /**
    *贴子类的数据访问层操作
    */
    public class TopicDao extends BaseDao{
    /**
     * 查询全部的topic
     * @param page
     * @param boardid
     * @return map,装两个对象:1.分页对象,2.帖子list
     */
    @SuppressWarnings("unchecked")
    public Map findAll(int page, int boardid) {
    //要返回的map
    Map data = new HashMap();
    //帖子的list
    List list = new ArrayList();
    /**分页的对象**/
    PatitionPo patitionPo = new PatitionPo();
    int perpage = patitionPo.getPerpage();
    //设置当前页和总页数
    patitionPo.setNowpage(page);
    patitionPo.setTotalpage(this.totalpage(boardid, perpage));

    //sql语句(重点掌握分页思想)
    String sql = "select top " + perpage
    + " * from TBL_TOPIC where boardid=" + boardid
    + " and topicid not in(select top " + (perpage * (page - 1))
    + " topicid from TBL_TOPIC where boardid=" + boardid
    + " order by publishTime desc) order by publishTime desc";
    System.out.println(sql);

    //三个数据库使用参数
    Statement stmt = null;
    Connection con = null;
    ResultSet rs = null;
    //获得连接
    con = this.getCon();
    try {
    //获得语句对象
    stmt = con.createStatement();
    //结果集对象
    rs = stmt.executeQuery(sql);
    //遍历结果集
    while(rs.next()){
    TopicPo topicPo = new TopicPo();
    topicPo.setTopicid(rs.getInt("topicid"));
    topicPo.setTitle(rs.getString("title"));
    list.add(topicPo);
    topicPo = null;
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //封装分页组件和帖子合集
    data.put("pa", patitionPo);
    data.put("list", list);
    return data;
    }

    /**
     * 这个方法用来得到要显示的总页数
     * @param boardid //主题ID
     * @param perpage //每页要显示的条数
     * @return //返回要显示的总页数
     */
    private int totalpage(int boardid, int perpage){
    int page = 1;
    String sql = "select count(*) from TBL_TOPIC where boardid=" + boardid;
    //总条数
    int totalcount = 0;

    //数据库三个对象
    Statement stmt = null;
    Connection con = null;
    ResultSet rs = null;

    //获得连接对象
    con = this.getCon();
    try {
    //获得语句对象
    stmt = con.createStatement();
    //获得结果集对象
    rs = stmt.executeQuery(sql);
    //找到总条数
    if(rs.next()){
    totalcount = rs.getInt(1);
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println(totalcount + " == " + perpage + "  :" + ((totalcount / perpage)));
    /**计算总页数**/
    if(totalcount % perpage == 0){
    //如果模是0,则就是总页数/每页多少条
    page = totalcount / perpage;
    }else{
    //如果模不是0,则就是总页数/每页多少条 + 1
    page = (totalcount / perpage) + 1;
    }
    return page; //返回总页数
    }

    public static void main(String[] args) {
    System.out.println(7 / 3);
    boolean bool = false;
    if(7 % 3 == 0){
    bool = true;
    }
    System.out.println(bool);
    }
    }-------------------------------------------------------------------------------------
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <jsp:directive.page import="com.cdjj.dao.TopicDao"/>
    <jsp:directive.page import="com.cdjj.pojo.PatitionPo"/>
    <jsp:directive.page import="com.cdjj.pojo.TopicPo"/>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
      </head>
      
      <body>
        <%
         //获得当前页面应该是第几页
         int cnowpage = 1;
         if(request.getParameter("nowpage") == null){
         cnowpage = 1;
         }else{
         cnowpage = Integer.parseInt(request.getParameter("nowpage"));
         }
         //帖子dao
         TopicDao topicDao = new TopicDao();
         //数据map
         Map datas = topicDao.findAll(cnowpage, 10);
         //帖子合集
         List list = (List)datas.get("list");
         //分页信息
         PatitionPo patitionPo = (PatitionPo)datas.get("pa");
         %>
         <table border="1">
         
          <%
          for(Object obj : list){
          TopicPo topic = (TopicPo)obj;
          %>
          <tr>
          <td width="200px"><%=topic.getTitle() %></td>
          </tr>
          <%
          }
           %>
         </table>
         <%
          //获得当前页和总页数,下面做判断
          int nowpage = patitionPo.getNowpage();
          int totalpage = patitionPo.getTotalpage();
          %>
          <%
           if(nowpage == 1){
           %>
           上一页
           <%
           }else{
           %>
           <a href="index.jsp?nowpage=<%=nowpage - 1 %>">上一页</a>
           <%
           }
           %>
           &nbsp;&nbsp;
          <%
           if(nowpage == totalpage){
           %>
           下一页
           <%
           }else{
           %>
           <a href="index.jsp?nowpage=<%=nowpage + 1 %>">下一页</a>
           <%
           }
           %>       
         
      </body>
    </html>
      

  7.   

    写一个方法,传递参数(当前页,总页数,URL)进去,得到分页的实际数据
    public class PageTest {
    public static final int EACH_PAGE=10;//每页显示的数目
    private int currentPage=1;//当前页,默认1
    private int count=0;//总共多少页
    //获得总的页数
    public int getTotalPage(int count){
    return count%EACH_PAGE==0?count/EACH_PAGE:(count/EACH_PAGE+1);
    }
    public String getPage(int totalPages,int currentPage,String url){
    StringBuffer sb=new StringBuffer();
    int pos=url.indexOf("?");
    String pageparam="";
    if(pos==-1){
    pageparam="?page=";
    }else{
    pageparam="&page=";
    }
    sb.append("<a href='");
    sb.append(url);
    sb.append(pageparam);
    sb.append("1'>首页</a>");
    sb.append("<a href='");
    sb.append(url);
    sb.append(pageparam);
    sb.append(currentPage-1==0?1:(currentPage-1));
    sb.append("'>上一页</a>");
    sb.append("<a href='");
    sb.append(url);
    sb.append(pageparam);
    sb.append(currentPage+1<=totalPages?currentPage+1:totalPages);
    sb.append("'>下一页</a>");
    sb.append("<a href='");
    sb.append(url);
    sb.append(pageparam);
    sb.append(totalPages);
    sb.append("'>尾页</a>");
    return sb.toString();
    }
    public static void main(String [] args){
    PageTest pageTest=new PageTest();
    System.out.println(pageTest.getPage(5, 2, "list.do"));
    }
    可以测试下,好不好用
      

  8.   

    这个值实在是拿不到。。照理是可以拿出来的 
    出这个异常 
    1Exception in thread "main" java.lang.ClassCastException: java.math.BigInteger  这个异常情况我也出现过:
    我是这么解决的,有时候 考略到数据库兼容问题比较麻烦的。如果你是用的是这个 语句
    sqlStr.append("SELECT ").append(" count(*) ").append("FROM ").append(后面的条件省略……“createSQLQuery”《
    SQLQuery query = this.getSession().createSQLQuery(sqlStr.toString());

    // 原有的结果集在Oracle里面好像不兼容
    // BigInteger bigCount = ((BigInteger)query.uniqueResult());
    // Long bigCount = ((Long)query.uniqueResult());
    // return bigCount.intValue();// 后来我就用这种形式的了
    return Integer.parseInt(query.uniqueResult().toString());但是 如果你用的是 hqlStr.append("SELECT ")
      .append(" count(dc) from DataChange dc ")
      .append(" where 1 = 1  ");
    后面的 条件省略……“createQuery”

    Query query = this.getSession().createQuery(hqlStr.toString());
    》查询条件省略了,应为我的查询条件比较详细繁琐。结果集可以这样取
    int total = ((Long)query.uniqueResult()).intValue();
    这个在我项目中暂时没有问题的
    2个查询时不同的
    “createSQLQuery”
    “createQuery”
      

  9.   

    分页查询 前面的已经解释了,说到底 就是 要2个参数 ,你要查询第几页 ,每页显示多少条数目:
    比如方法:
    我用的是dwr+spring+hiber……
    findAllSiteByQueryStr(int num, int size) {
    }
    //这里才是 dao层hql语句查询时候分页的最终效果
    query.setFirstResult((num-1)*size);
    query.setMaxResults(size); 在jsp页面上面 你只要传递这2个参数就行,
    比如说了
    jsp页面时 第 5页  现在 你按 下一页  那么 你通过调用上下页的 方法  调用下一页  那么  num经过计算
    后 变成  6  (num=6)
    那么 你在action 里面 调用dao层 时候 方法findAllSiteByQueryStr(6, int size) 
    就行了。
    query.setFirstResult((6-1)*size);
    query.setMaxResults(size);
    List list = query。list()然后得到的结果集
    PageForm pf = new PageForm()
    你这里最好 在 PageForm  补充 一个结果集的 list 用来传递数据结果集
    pf。setSize(size)
    pf。setNum(6)
    pf。setList(list)最后把 这个 pf 返回到  jsp 页面 在那里取出数据 显示
      

  10.   

    你说下 现在 你的问题出现在什么地方?
    如果是这个错误Configuration cfg = new Configuration().configure();
            SessionFactory factory = cfg.buildSessionFactory();
            Session session = factory.openSession();
            Query query = session.createSQLQuery("select count(*) from student");
            List<Object[]> list = query.list();
    System.out.print(list.size());
            for (int i = 0; i < list.size(); i++) {
                
                Object[] obj = list.get(i);
                
                for (int j = 0; j < obj.length; j++) {
                    System.out.print(obj[j] + "    ");            }            System.out.println();
                System.out.println("---------------------");        }
        }那么 这样子修改Configuration cfg = new Configuration().configure();
            SessionFactory factory = cfg.buildSessionFactory();
            Session session = factory.openSession();
            //select count(*) from student 你的这个语句 中  student  是一个表名? 如果是就对了
            Query query = session.createSQLQuery("select count(*) from student");
            //总记录数
            int totals = Integer.parseInt(query.uniqueResult().toString()); 
        }
      

  11.   

       不太清楚楼主是什么问题  楼主分页程序已经弄出来 直接new一个分页程序放到页面中 在页面里接受显示出来就可以了 
      

  12.   

    两个字母搞定J2EE通用分页:
    http://howsun.blog.sohu.com/90707791.html
      

  13.   

     //我想知道这个构造什么时候调用。必须new这种构造类型才会调用吧?那我怎么传参数比较好。这是比较大的疑问。。请务必告诉我
        public PageForm(int size, int num, int rowCount) {当然是你查完全部数据,就把你查的数据条数放到rowCount里
    你注释也写得很清楚啊
    private int num;   //当前页号, 采用自然数计数 1,2,3,...  //前台传来的
    private int size; //页面大小:一个页面显示多少个数据        //也是前台传来的,或你事先设定的
    private int rowCount;//数据总数:一共有多少个数据          //后台查数据库的执行完这个方法后.你就可以拿到
        private int pageCount; // 页面总数
        private int startRow;//当前页面开始行, 第一行是0行
        private int first = 1;//第一页 页号
        private int last;//最后页 页号
        private int next;//下一页 页号
        private int prev;//前页 页号
        private int start;//页号式导航, 起始页号
        private int end;//页号式导航, 结束页号
        private int numCount = 10;//页号式导航, 最多显示页号数量为numCount+1;这里显示11页。
    这里你就拿到参数,如果是mysql的话用limit
    没搞过oracle....
    如果是sql的话.那就要再写多一个javabean(个人是这样做,通用吧)如果你想你要用的时候在调用,那你可以改成方法.
      

  14.   

    public PageForm(int size, int num, int rowCount) {
            this.num = num;
            this.size=size;
            this.rowCount = rowCount;
            
            this.pageCount = (int) Math.ceil((double)rowCount/size);        this.num = Math.min(this.num, pageCount);
            this.num = Math.max(1, this.num);
            
            this.startRow = (this.num-1) * size ;
            this.last = this.pageCount;
            this.next = Math.min( this.pageCount, this.num+1);
            this.prev = Math.max(1 , this.num-1);
        
            //计算page 控制
            start = Math.max(this.num-numCount/2, first);
            end = Math.min(start+numCount, last);
            if(end-start < numCount){
                start = Math.max(end-numCount, 1);
            }
        }这里是我的分页算法我就是想知道要怎么传参数才可以得到这个值?
    我的意思是如果不初始化这个构造方法的话。我的分页数法是根本没用的
      

  15.   

     
    主要 我还不明白PageForm 
    你的这个类 的作用是什么?
    你用的是struts1  还是 struts2?这个PageForm 只是一个数据封装的javabaen 还是用来做 逻辑调用的?
      

  16.   

    我这就是个分页类。
    不做成form也没问题吧?
      

  17.   


    你的构造器不已经决定如何传参数了吗。我们都是
    页面传给Action/Servlet的是start(query.setFirstResult),size(query.setMaxResults),
    Action传给页面为List和Total,
    分页器根据start,size,total计算相应的分页链接
      

  18.   

    到底是这样的:
    这个PageForm  不参与逻辑调用 
    既然是一个分页类 那么 他里面 只是封装简单数据。用这个类 来做 为 jsp 页面  与 struts 之间交互的  数据传递载体先从后台说起:
    public PageModel findAllDataChange(final int pageNo, final int pageSize) {
    PageModel pageModel = null;
    List datalist = this.getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session Session)
    throws HibernateException, SQLException {
    return Session.createQuery("select dc from DataChange dc order by dc.createTime DESC")
    .setFirstResult((pageNo-1) * pageSize)
    .setMaxResults(pageSize)
    .list();
    }
    });
    //这里把查询完的结果参数设置进去  最后返回到jsp页面
    pageModel = new PageModel();
    pageModel.setList(datalist);
    int toTalRecords = getTotalRecords(pageNo, pageSize);
    pageModel.setToTalRecords(toTalRecords);
    pageModel.setPageNo(pageNo);
    pageModel.setPageSize(pageSize);
    // return this.getHibernateTemplate().find("select dc from DataChange dc");
    return pageModel;
    }效果和我的是一样的,
     你的 PageForm   和我 的 pageModel 一样也是一个分页工具类 他用来封装数据。
    这里是分页查询,
    action 通过调用 这个方法  然后得到  pageModel 这个javabean 里面包含了 查询后的结果数据 action最后返回到 jsp页面
    你在jsp页面取出这个pageModel 这个数据对象。你开始问的 PageForm    这个是在什么地方用到。 其实就是这里用到了  使用来作为载体的。struts1中 public ActionForward list(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    //获取从页面表单中提交过来的值
    ItemActionForm iaf = (ItemActionForm)form;

    //调用业务逻辑操作
    PageModel pageModel = itemManager.findAllItem(iaf.getPageNo(), iaf.getPageSize(), iaf.getClientIdOrName());

    //将查询结果放到request中
    request.setAttribute("pagemodel", pageModel);

    return mapping.findForward("list_success");
    }
    从jsp页面讨论:
    由于你用struts, 所以数据 页面数据都是通过 actionform 获取了  ,所以 没必要吧 jsp页面参数通过封装到PageForm    的bean 里面 进行传递 ,最后总结: 你只用 把 dao 层查询的结果(全部信息包括你 jsp页面想要得到的信息 都可以封装到这个类里面),这个PageForm    传递到jsp页面 取出就行了最后在jsp页面中取出使用jstl    <c:forEach items="${pagemodel.list}" var="item">
          <td width="222" class="rd8" >${ item.itemName }</td>
    ……省略
        </tr>
        </c:forEach>就是这个样子了。 这个工具类的最直接作用了 你的构造方法中的 那些操作 就是要看你想怎么 使用的了
      

  19.   

    楼上的说的很详细...
    基本理解了
           pageModel = new PageModel();
            pageModel.setList(datalist);
            int toTalRecords = getTotalRecords(pageNo, pageSize);
            pageModel.setToTalRecords(toTalRecords);
            pageModel.setPageNo(pageNo);
            pageModel.setPageSize(pageSize);        
    //        return this.getHibernateTemplate().find("select dc from DataChange dc");
            return pageModel;        
        }能不能给点注释..这里不知道你的set方法都是什么用的.比如说setList等等
      

  20.   

    //这里把查询完的结果参数设置进去  最后返回到jsp页面
            pageModel = new PageModel();
            pageModel.setList(datalist);
            int toTalRecords = getTotalRecords(pageNo, pageSize);
            pageModel.setToTalRecords(toTalRecords);
            pageModel.setPageNo(pageNo);
            pageModel.setPageSize(pageSize);        
    //        return this.getHibernateTemplate().find("select dc from DataChange dc");
            return pageModel;        
        }弄完这里就可以结帖了...因为这里的作用的还没搞懂...实在是....
      

  21.   

    PageModel.java
    /**
     * 分页组件
     * @author Administrator
     *
     */
    public class PageModel {

    //总记录数
    private int totalRecords;

    //结果集
    private List list;

    //当前页
    private int pageNo;

        //每页显示多少条
    private int pageSize; 

    public int getTotalRecords() {
    return totalRecords;
    }

    /**
     * 取得总页数
     * @return
     */
    public int getTotalPages() {
    return (totalRecords + pageSize - 1) / pageSize;
    }

    public void setTotalRecords(int totalRecords) {
    this.totalRecords = totalRecords;
    } public List getList() {
    return list;
    } public void setList(List list) {
    this.list = list;
    } public int getPageSize() {
    return pageSize;
    } public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    } public int getPageNo() {
    return pageNo;
    } public void setPageNo(int pageNo) {
    this.pageNo = pageNo;
    }

    /**
     * 取得第一页
     * @return
     */
    public int getTopPageNo() {
    return 1;
    }

    /**
     * 取得上一页
     * @return
     */
    public int getPreviousPageNo() {
    if (pageNo <= 1) {
    return 1;
    }
    return pageNo -1;
    }

    /**
     * 取得下一页
     * @return
     */
    public int getNextPageNo() {
    if (pageNo >= getTotalPages()) {
    return getTotalPages()==0?1:getTotalPages();
    }
    return pageNo + 1;
    }

    /**
     * 取得最后一页
     * @return
     */
    public int getBottomPageNo() {
    return getTotalPages() == 0?1:getTotalPages();
    }
    }