希望大家帮帮忙。谁有简单的分页框架。希望大家给发个,谢谢了。我的邮箱是chianfsb@163.com

解决方案 »

  1.   

    哥们,这习惯可不好,我稍微说下吧。定义一个Pages类,包括totalPages(总页数)、currentPage(当前页)、totalItems(总记录)和count(每一页显示多少条记录)等。你可以在该类中定义一个方法
    getPageBar(String url),该方法返回一个HTML的字符串,它就是你分页栏中的HTML,
    在JSP页面中<s:property value="pages.getPageBar('http://....')"/>DAO层:public List<TbTopic> findTop(final int firstResult, final int maxResults) {
    final String sql = "...";
    List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session s) throws HibernateException {
    Query query = s.createQuery(sql);
    query.setFirstResult(firstResult);
    query.setMaxResults(maxResults);
    return query.list();
    }
    });
    if(list != null && !list.isEmpty()) {
    return list;
    } else {
    return null;
    }
    }
      

  2.   

    有专门的jar包用于分页   也有可拖动的javascript分页  ^_^
      

  3.   

    还需要查到total总的页数 select count(*) as total from tbl_dish
      

  4.   

    说起分页,建议用存储过程,可以提高效率。 
    建议楼主自己琢磨琢磨。 分页其实就是依靠 当前页pageIndex 每页行数pageSize 总行数count 来搞定的
    每次传递不同的pageIndex值来获得分页数据 并输出到页面上显示出来~~~~
    自己写一个 封装一下。 以后永远就会了。 用别人的 不好!
      

  5.   

    谢谢大家。我是不明白怎么设计分页类和逻辑层,DAO层的关系。及接口的制定。
      

  6.   

    public class Page {
    private int pageSize; //一页显示的记录数
    private int pageCount;  //总页数
    private boolean isLastPage; //是否是最后一页
    private boolean hasNextPage; //是否有下一页
    private boolean hasPreviousPage; //是否有上一页
    private List showList; //待显示的数据集合
    private int pageShowNumber; //待显示的页面
    private static List resultList; //总记录
    private int resultListCount; //总记录数量


    /**
     * 构造方法
     */
    public Page(int pageSize){
    this.pageSize=pageSize; //设置一页的记录数
    showList=new ArrayList(); //初始
    this.hasNextPage=true; //初始
    this.hasPreviousPage=true; //初始
    this.pageShowNumber=1;
    }

    /**
     * 设置记录集
     * @return void
     */
    private void setResultList(List resultList){
    if(resultList!=null){
    this.resultList=resultList;
    }
    }

    /**
     * 设置总页数
     * @return void
     */
    private void setResultListCount(){
    this.pageCount=this.resultList.size()/this.pageSize;
    if(this.resultList.size()%this.pageSize!=0){
    this.pageCount+=1;
    }
    }

    /**
     * 设置显示页面信息
     * @return void
     */
    private void setShowInfo(List resultList,String pageShow,HttpServletRequest request){
    HttpSession session=request.getSession();
    if(this.pageCount<=1){ //如果只有一页
    this.hasNextPage=false;
    this.hasPreviousPage=false;
    }
    if(pageShow==null||pageShow.equals("")){
    this.pageShowNumber=1; //如果是第一次
    if(session.getAttribute("page")!=null){
    this.pageShowNumber=Integer.parseInt(session.getAttribute("page").toString());
    }
    this.hasPreviousPage=false;
    }else{
    this.pageShowNumber=Integer.parseInt(pageShow);
    if(this.pageShowNumber<=1){ //如果为首页
    this.pageShowNumber=1;
    this.hasPreviousPage=false;
    }else if(this.pageShowNumber>=this.pageCount){ //如果为尾页
    this.pageShowNumber=this.pageCount;
    this.hasNextPage=false;
    }else{
    this.hasNextPage=true;
    this.hasPreviousPage=true;
    }
    }
    session.setAttribute("page", this.pageShowNumber);
    }

    /**
     * 设置要显示的记录集
     * @return 要显示的记录集List
     */
    private List getResultList(){
    int pageFirst=pageShowNumber*pageSize-pageSize;
    if(this.resultList.size()!=0){
    for(int i=pageFirst;i<pageFirst+pageSize&&i<this.resultList.size();i++){
    showList.add(this.resultList.get(i));
    }
    return showList;
    }
    return null;
    }

    /**
     * 返回待显示的记录集
     * @return 待显示的记录集List
     */
    public List getPageList(List resultList,String pageShow,HttpServletRequest request){
    this.setResultList(resultList);
    this.setResultListCount();
    this.setShowInfo(resultList,pageShow,request);
    return this.getResultList();
    }
    /**
     * 返回是否有下一页
     * @return 是否有下一页boolean
     */
    public boolean getHasNextPage(){
    return this.hasNextPage;
    }
    /**
     * 返回是否有上一页
     * @return 是否有上一页boolean
     */
    public boolean getHasPreviousPage(){
    return this.hasPreviousPage;
    }
    /**
     * 返回总页数
     * @return 总页数int
     */
    public int getPageCount(){
    return this.pageCount;
    }
    /**
     * 返回正显示的页面
     * @return 正显示的页面int
     */
    public int getPageShowNumber(){
    return this.pageShowNumber;
    }
    /**
     * 返回总记录数量
     * @return 总记录数量int
     */
    public int getResultListCount(){
    return this.resultList.size();
    }
      

  7.   

    public class PageTag extends TagSupport { Page page; //分页对象
    String url; //显示路径
    public void setObjPage(Page objPage){
    this.page=objPage;
    }
    public void setUrl(String url){
    this.url=url;
    }

    public int doAfterBody() throws JspException {
    // TODO Auto-generated method stub
    return super.doAfterBody();
    } public int doEndTag() throws JspException {
    // TODO Auto-generated method stub
    return super.doEndTag();
    } public int doStartTag() throws JspException {
    JspWriter out=pageContext.getOut();
    try {
    out.print("<form method='POST' action='"+this.url+"' align='center'>");
    out.print("记录总数:<font color='#FF0000'>"+page.getResultListCount()+"</font>&nbsp &nbsp总页数:<font color='#FF0000'>"+page.getPageCount()+"</font>&nbsp &nbsp");
    out.print("当前页数:<font color='#FF0000'>"+page.getPageShowNumber()+"</font>&nbsp &nbsp");
    out.print("<a href='"+this.url+"?page=1'>【首页】</a>&nbsp &nbsp"); if(page.getHasPreviousPage()){
    out.print("<a href='"+this.url+"?page="+(page.getPageShowNumber()-1)+"'>【上一页】</a>&nbsp &nbsp");
    }
    // else{
    // out.print("【上一页】");
    // }
    if(page.getHasNextPage()){
    out.print("<a href='"+this.url+"?page="+(page.getPageShowNumber()+1)+"'>【下一页】</a>&nbsp &nbsp");
    }
    // else{
    // out.print("【下一页】");
    // }
    out.print("<a href='"+this.url+"?page="+page.getPageCount()+"'>【末页】</a>&nbsp &nbsp");
    // out.print("转到第:<input type='text' name='page' size='6'> 页");
    // out.print("<input type=submit value=GO name=cndok>");
    out.print("</form>");
    } catch (IOException e) {
    e.printStackTrace();
    }
    return super.doStartTag();
    }
    这个两个类可以参考下
      

  8.   

    1  首先新建一个PageModel类 Java代码 
    package com.dengmin.oa.utils;import java.util.List;public class PageModel { /**
     * 总记录数
     */
    private int total;
    /**
     * 当前页的记录集
     */
    private List datas; public List getDatas() {
    return datas;
    } public void setDatas(List datas) {
    this.datas = datas;
    } public int getTotal() {
    return total;
    } public void setTotal(int total) {
    this.total = total;
    }
    }2  底层是基于Spring+Hibernate来做的。在DAO这一层,为其增加两个方法,底层的分页查询用的是Hibernate提供的分页查询。 
    Java代码 
    public interface UserDao {   
      
        public void addUser(User user);   
      
        /**  
         *   
         * @param offset  从第几条记录开始查询  
         * @param pagesize  每页显示多少条记录  
         * @return  
         */  
        public PageModel findAllUser(int offset, int pagesize);   
    }  public interface UserDao { public void addUser(User user); /**
     * 
     * @param offset  从第几条记录开始查询
     * @param pagesize  每页显示多少条记录
     * @return
     */
    public PageModel findAllUser(int offset, int pagesize);
    }3  UserDao的实现类 
    Java代码 
    public class UserDaoImpl extends HibernateDaoSupport implements UserDao {   
      
        public void addUser(User user) {   
            this.getHibernateTemplate().save(user);   
        }   
           
        public PageModel findAllUser(int offset, int pagesize) {   
               
            //得到总记录数   
            String queryCountHql = "select count(*) from User";   
               
            Query query = getSession().createQuery(queryCountHql);   
            int total = ((Long)query.uniqueResult()).intValue();   
               
            List datas = getSession().createQuery("from User")   
                        .setFirstResult(offset)   
                        .setMaxResults(pagesize)   
                        .list();   
            //得到结果集   
            PageModel pm = new PageModel();   
            pm.setTotal(total);   
            pm.setDatas(datas);   
               
            return pm;   
        }   
      
    }  
    ok!底层的实现工作就做好了 在控制层中UserAction从DispatchAction继承重写它的unspecified方法 
    通过spring注入UserDao 代码如下: 
    Java代码 
    public class UserAction extends DispatchAction {   
      
        private UserDao userDao;   
        @Override  
        protected ActionForward unspecified(ActionMapping mapping, ActionForm form,   
                HttpServletRequest request, HttpServletResponse response) throws Exception {   
               
            int offset = 0;    
               
            try {   
                offset = Integer.parseInt(request.getParameter("pager.offset"));   
            } catch (Exception e) {   
            }   
            //这里我按照每页显示10条   
            PageModel pm = userDao.findAllUser(offset, 10);   
            request.setAttribute("pm", pm);   
               
            return mapping.findForward("success");   
        }   
           
        public void setUserDao(UserDao userDao) {   
            this.userDao = userDao;   
        }   
           
    }  spring中的配置如下 
    Java代码 
    <!-- 配置sessionFactory -->   
        <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
            <property name="configLocation">   
                <value>classpath:hibernate.cfg.xml</value>   
            </property>   
        </bean>   
        <!-- 配置事务管理器 -->   
        <bean id="transactionManager"  
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
            <property name="sessionFactory">   
                <ref bean="sessionFactory" />   
            </property>   
        </bean>   
      
        <!-- 配置事务的传播特性 -->   
        <tx:advice id="txAdvice" transaction-manager="transactionManager">   
            <tx:attributes>   
                <tx:method name="*" propagation="REQUIRED" />   
            </tx:attributes>   
        </tx:advice>   
      
      
    <bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl">   
            <property name="sessionFactory" ref="sessionFactory" />   
        </bean>   
      
        <bean name="/userManager"  
            class="com.dengmin.pager.actions.UserAction" scope="prototype">   
            <property name="userDao" ref="userDao" />   
        </bean>  <!-- 配置sessionFactory -->
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean> <!-- 配置事务的传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>
    <bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean> <bean name="/userManager"
    class="com.dengmin.pager.actions.UserAction" scope="prototype">
    <property name="userDao" ref="userDao" />
    </bean>
    最后是jsp页面做数据显示 
    这里采用了jstl和pager-taglib的标签库 
    首先将其引入: 
    Java代码 
    <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>   
    <%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>  <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
    Html代码 
      <body>  
        <h1>User Manager</h1>  
        <hr/>  
           
        <table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6">  
        <tr bgcolor="#EFF3F7">  
            <TD align="center">ID</TD>  
            <TD align="center">名称</TD>  
            <TD align="center">密码</TD>  
            <TD align="center">地址</TD>  
            <TD align="center">创建时间</TD>  
            <TD align="center">相关操作</TD>  
               
        </tr>  
        <c:if test="${!empty pm.datas}">  
            <c:forEach items="${pm.datas}" var="user">  
                <tr bgcolor="#EFF3F7">  
                    <td align="center">${user.id }</td>  
                    <td align="center">${user.username }</td>  
                    <td align="center">${user.password}</td>  
                    <td align="center">${user.address}</td>  
                    <td align="center">${user.createTime }</td>  
                    <td align="center">  
                        修改   
                        &nbsp;    
                        删除</td>  
                </tr>  
            </c:forEach>  
            </c:if>  
             <c:if test="${empty pm.datas}">  
            <tr>  
                <td colspan="5" align="center" bgcolor="#EFF3F7">  
                没有找到相应的记录   
                </td>  
            </tr>  
            </c:if>  
        </table>  
        <pg:pager url="userManager.do" items="${pm.total}" export="currentPageNumber=pageNumber">  
        <pg:first>  
            <a href="${pageUrl}">首页</a>  
        </pg:first>  
        <pg:prev>  
            <a href="${pageUrl }">上一页</a>  
        </pg:prev>  
        <pg:pages>  
            <c:choose>  
                <c:when test="${currentPageNumber eq pageNumber}">  
                    <font color="red">${pageNumber }</font>  
                </c:when>  
                <c:otherwise>  
                    <a href="${pageUrl }">${pageNumber }</a>  
                </c:otherwise>  
            </c:choose>  
        </pg:pages>  
        <pg:next>  
            <a href="${pageUrl }">下一页</a>  
        </pg:next>  
        <pg:last>  
            <a href="${pageUrl }">尾页</a>  
        </pg:last>  
    </pg:pager>  
      </body>  预览效果: 
     最后附上pager-taglib的使用方法 pg:pager【这个标签用来设置分页的总体参数】重要参数说明: 
    url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数 
    items:总记录数,pager标签正是根据这个值来计算分页参数的 
    maxPageItems:每页显示的行数,默认为10 
    maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10 pg:first【第一页的标签】重要参数说明: 
    export变量的意义: 
    pageUrl - 分页链接URL地址(最重要的export参数) 
    pageNumber - 页码 
    firstItem - 首页第一行的索引值 
    lastItem - 首页最后一行的索引值 pg:pre【上一页标签】重要参数说明: 
    export变量的意义: 
    pageUrl - 分页链接URL地址(最重要的export参数) 
    pageNumber - 页码 
    firstItem - 前页第一行的索引值 
    lastItem - 前页最后一行的索引值 pg:next【下一页标签】重要参数说明: 
    export变量的意义: 
    pageUrl - 分页链接URL地址(最重要的export参数) 
    pageNumber - 页码 
    firstItem - 下页第一行的索引值 
    lastItem - 下页最后一行的索引值 pg:last重要参数说明: 
    export变量的意义: 
    pageUrl - 分页链接URL地址(最重要的export参数) 
    pageNumber - 页码 
    firstItem - 尾页第一行的索引值 
    lastItem - 尾页最后一行的索引值 pg:pages【这个标签用来循环输出页码信息】重要参数说明: 
    export变量的意义: 
    pageUrl - 分页链接URL地址(最重要的export参数) 
    pageNumber - 页码 
    firstItem - pageNumber这个页码指定的那一页的第一行的索引值 
    lastItem - pageNumber这个页码指定的那一页的最后一行的索引值 
      

  9.   

    我写了个方法可以试一下。public static String pageTool(int pageNo,int pageSize,int size,String href)
    {
    if(pageNo<=0) pageNo=1;
    StringBuffer sb=new StringBuffer();
    int pageNum=size%pageSize==0?size/pageSize:size/pageSize+1;

    if(pageNo==pageNum)//页码为最后一页时
    {   
     if(pageNum==1)
     {
     
     sb.append("<a href='"+href+"?pageNo="+1+"'>"+1+"</a>");
     return sb.toString();
     
     }
     
     
     if(pageNum>1)
     {
    if(pageSize<pageNum) 
    {
     sb.append("<a href='"+href+"?pageNo="+1+"'>首页</a>");
     sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");
     for(int i=pageNum-pageSize+1;i<=pageNum;i++)
     {
       sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
     }
     return sb.toString();

    }

    if(pageSize>=pageNum)
    {


     for(int i=1;i<=pageNum;i++)
     {
       sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
     }

     return sb.toString();
    }
     

     
     }

     

     
    }
    if(pageNo<pageNum&&pageNo>1)//页码为第pageNo页时
    {   
         
    if(pageNo+pageSize<pageNum)
    {   

     sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");

    for(int i=pageNo;i<=pageNo+pageSize;i++)
     {
       sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");

     }
     sb.append("<a href='"+href+"?pageNo="+(pageNo+1)+"'>下页</a>");
     sb.append("<a href='"+href+"?pageNo="+pageNum+"'>尾页</a>");
     return sb.toString();
    }


     if(pageNo+pageSize>=pageNum)
     {
        sb.append("<a href='"+href+"?pageNo="+1+"'>首页</a>");
        sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");
        sb.append("<a href='"+href+"?pageNo="+(pageNo-pageSize)+"' class='along'>前"+pageSize+"页</a>");
     for(int i=pageNo;i<=pageNum;i++)
     {
       sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
      
     }
     return sb.toString();
     

     
     } 

     
     
    }


    if(pageNo==1)//页码为第1页时
    {   


    if(pageNum==1)
    {

     sb.append("<a href='"+href+"?pageNo="+1+"'>"+1+"</a>");
     return sb.toString();
    }

    if(pageNum>1)
    {
    if(pageNum<=pageSize)
    {
    for(int i=1;i<=pageNum;i++)
     {
      sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
     }
     
     return sb.toString();

    }
     if(pageNum>pageSize)
     {
      
     
     for(int i=1;i<=pageSize;i++)
     {
      sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
       
     }
     sb.append("<a href='"+href+"?pageNo="+(pageNo+pageSize)+"' class='along'>后"+pageSize+"页</a>");
     sb.append("<a href='"+href+"?pageNo="+(pageNo+1)+"'>下页</a>");
     sb.append("<a href='"+href+"?pageNo="+pageNum+"'>尾页</a>");
     return sb.toString();
     }


    }
     
     
       

    }


     return sb.toString();


    }这个方法用于前端显示页码。比如:总条数为:size,每页显示:pageSize,当前页码:pageNo,链接地址:href