`

spring mvc 分页

阅读更多

springmvcstringhibernatesessionlist

分页主要需要两个参数:

1、当前页是第几页

2、每页展示多少条数据

先写一个类来封装处理这两个参数:
[java] view plaincopy

    package com.smvc.annonation.utils; 
     
    import java.io.Serializable; 
    import java.util.List; 
     
    import org.apache.commons.lang.builder.ToStringBuilder; 
    import org.apache.commons.lang.builder.ToStringStyle; 
     
    public class ResultFilter<T> implements Serializable{ 
     
        private static final long serialVersionUID = 5472321653620726832L; 
     
        private final static int DEFAULT_NAVIGATOR_SIZE = 5; 
     
        //当前页 
        private int currentPage = 1; 
        //每页显示数量 
        private int pageSize = 5; 
         
        //总条数 
        private int totalCount; 
     
        private boolean havaNextPage; 
     
        private boolean havePrePage; 
     
        private int navigatorSize; 
         
        //存放查询结果用的list 
        private List<T> items; 
         
        public ResultFilter(){ 
             
        } 
         
        public ResultFilter(int totalCount, int pageSize, int currentPage) { 
            this(totalCount, pageSize, currentPage, DEFAULT_NAVIGATOR_SIZE); 
        } 
     
        public ResultFilter(int totalCount, int pageSize, int currentPage, 
                            int navigatorSize) { 
            this.totalCount = totalCount; 
            this.pageSize = pageSize; 
            this.currentPage = currentPage; 
            this.navigatorSize = navigatorSize; 
        } 
         
        public int getPageCount() { 
            int pageCount = 0; 
            if (pageSize != 0) { 
                pageCount = totalCount / pageSize; 
                if (totalCount % pageSize != 0) 
                    pageCount++; 
            } 
     
            return pageCount; 
        } 
     
        public int getCurrentPage() { 
            currentPage = currentPage < getPageCount() ? currentPage : 
                          getPageCount(); 
            currentPage = currentPage < 1 ? 1 : currentPage; 
     
            return currentPage; 
        } 
     
        public int getPageSize() { 
            return pageSize; 
        } 
     
        public int getTotalCount() { 
            return totalCount; 
        } 
     
     
        public boolean isHaveNextPage() { 
            havaNextPage = false; 
            if ((getPageCount() > 1) && (getPageCount() > getCurrentPage())) 
                havaNextPage = true; 
            return havaNextPage; 
        } 
     
        public boolean isHavePrePage() { 
            havePrePage = false; 
            if ((getPageCount() > 1) && (currentPage > 1)) 
                havePrePage = true; 
            return havePrePage; 
        } 
     
        private int getNavigatorIndex(boolean isBegin) { 
            int beginNavigatorIndex = getCurrentPage() - navigatorSize / 2; 
            int endNavigatorIndex = getCurrentPage() + navigatorSize / 2; 
            beginNavigatorIndex = beginNavigatorIndex < 1 ? 1 : beginNavigatorIndex; 
            endNavigatorIndex = endNavigatorIndex < getPageCount() ? 
                                endNavigatorIndex : 
                                getPageCount(); 
            while ((endNavigatorIndex - beginNavigatorIndex) < navigatorSize && 
                   (beginNavigatorIndex != 1 || endNavigatorIndex != getPageCount())) { 
                if (beginNavigatorIndex > 1) 
                    beginNavigatorIndex--; 
                else if (endNavigatorIndex < getPageCount()) 
                    endNavigatorIndex++; 
            } 
     
            if(isBegin) 
                return beginNavigatorIndex; 
            else 
                return endNavigatorIndex; 
        } 
     
        public int getBeginNavigatorIndex() { 
            return getNavigatorIndex(true); 
        } 
     
        public int getEndNavigatorIndex() { 
            return getNavigatorIndex(false); 
        } 
     
        public List<T> getItems() { 
            return items; 
        } 
     
        public void setItems(List<T> items) { 
            this.items = items; 
        } 
         
        public void setCurrentPage(int currentPage) { 
            this.currentPage = currentPage; 
        } 
     
        public void setPageSize(int pageSize) { 
            this.pageSize = pageSize; 
        } 
     
        public void setTotalCount(int totalCount) { 
            this.totalCount = totalCount; 
        } 
     
        @Override 
        public String toString() { 
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); 
        } 
     
    } 

接着,就要处理如何翻页的问题。解决方法就是在页面间传递参数,传递当前是第几页。

使用自己定义标签实现比较简便(由于现在只做了一个页面,并不能保证翻页功能的通用性,以后会慢慢完善)

自定义标签的配置:

my.tld
[html] view plaincopy

    <?xml version="1.0" encoding="UTF-8"?> 
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
            version="2.0"> 
     
        <description>My Tag Library</description> 
        <tlib-version>1.0</tlib-version> 
        <short-name>my</short-name> 
        <uri>my-taglib</uri> 
     
        <tag> 
            <description>split page</description> 
            <name>paging</name> 
            <tag-class>com.smvc.annonation.tag.PagingTag</tag-class> 
            <body-content>empty</body-content> 
            <attribute> 
                <description>base href</description> 
                <name>href</name> 
                <required>false</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>curr page</description> 
                <name>curr</name> 
                <required>true</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>page size</description> 
                <name>size</name> 
                <required>true</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>total page</description> 
                <name>total</name> 
                <required>true</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>curr parameter name</description> 
                <name>cparam</name> 
                <required>false</required> 
                <rtexprvalue>false</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>page size parameter name</description> 
                <name>sparam</name> 
                <required>false</required> 
                <rtexprvalue>false</rtexprvalue> 
            </attribute> 
            <dynamic-attributes>false</dynamic-attributes> 
        </tag> 
         
         
         
        <tag> 
            <description>front split page</description> 
            <name>frontPaging</name> 
            <tag-class>com.aspire.cms.demo.framework.tag.FrontPagingTag</tag-class> 
            <body-content>empty</body-content> 
            <attribute> 
                <description>base href</description> 
                <name>href</name> 
                <required>false</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <attribute> 
                <description>result filter</description> 
                <name>rf</name> 
                <required>true</required> 
                <rtexprvalue>true</rtexprvalue> 
            </attribute> 
            <dynamic-attributes>false</dynamic-attributes> 
        </tag> 
     
    </taglib> 

对应的java类:
[java] view plaincopy

    package com.smvc.annonation.tag; 
     
    import java.io.IOException; 
     
    import javax.servlet.jsp.JspException; 
    import javax.servlet.jsp.JspWriter; 
    import javax.servlet.jsp.tagext.SimpleTagSupport; 
     
    import org.apache.commons.lang.StringUtils; 
     
    public class PagingTag extends SimpleTagSupport { 
         
        private String href; 
         
        //当前页 
        private String cparam; 
        //每页条数 
        private String sparam; 
     
        private int curr;//当前页 
         
        private int size;//每页条数 
         
        private int total;//总页数 
         
        @Override 
        public void doTag() throws JspException, IOException { 
            JspWriter out = getJspContext().getOut(); 
             
            if(StringUtils.isEmpty(cparam)) { 
                cparam = "currentPage"; 
            } 
            if(StringUtils.isEmpty(sparam)) { 
                sparam = "pageSize"; 
            } 
             
            if(!href.endsWith("?") && !href.endsWith("&")) { 
                if(href.indexOf("?") == -1) { 
                    href = href + "?"; 
                } else { 
                    href = href + "&"; 
                } 
            } 
             
            if (curr <= 0) { 
                curr = 1; 
            } else if (curr > total) { 
                curr = total; 
            } 
             
            out.append("<span>"); 
            // 首页 
            if (curr == 1) { 
                out.append("首页"); 
            } else { 
                href(out, href, 1, "首页"); 
            } 
            out.append(" | "); 
            // 上一页 
            if (curr == 1) { 
                out.append("上一页"); 
            } else { 
                href(out, href, curr - 1, "上一页"); 
            } 
            out.append(" | "); 
            // 下一页 
            if (curr == total) { 
                out.append("下一页"); 
            } else { 
                href(out, href, curr + 1, "下一页"); 
            } 
            out.append(" | "); 
            // 末页 
            if (curr == total) { 
                out.append("末页"); 
            } else { 
                href(out, href, total, "末页"); 
            } 
            out.append("</span>"); 
            out.append("<span>第"); 
            out.append(curr + "/" + total); 
            out.append("页</span>"); 
             
             
            super.doTag(); 
        } 
         
        private void href(JspWriter out, String href, int curr, String title) throws IOException { 
            out.append("<a href=\"").append(href).append(cparam).append("=").append("" + curr).append("&").append(sparam).append("=").append("" + size).append("\">").append(title).append("</a>"); 
        } 
     
        public int getCurr() { 
            return curr; 
        } 
     
        public void setCurr(int curr) { 
            this.curr = curr; 
        } 
     
        public int getTotal() { 
            return total; 
        } 
     
        public void setTotal(int total) { 
            this.total = total; 
        } 
     
        public String getHref() { 
            return href; 
        } 
     
        public void setHref(String href) { 
            this.href = href; 
        } 
     
        public String getCparam() { 
            return cparam; 
        } 
     
        public void setCparam(String cparam) { 
            this.cparam = cparam; 
        } 
     
        public String getSparam() { 
            return sparam; 
        } 
     
        public void setSparam(String sparam) { 
            this.sparam = sparam; 
        } 
     
        public int getSize() { 
            return size; 
        } 
     
        public void setSize(int size) { 
            this.size = size; 
        } 
     
    } 

在jsp中使用自定义的标签库来实现翻页功能:

list.jsp
[javascript] view plaincopy

    <%@ page language="java" contentType="text/html; charset=UTF-8" 
        pageEncoding="UTF-8" %> 
    <%@ page session="false"%> 
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
    <%@ taglib uri="my-taglib" prefix="my"%> 
    <title>学生列表</title> 
    <form action="list" method="post"> 
    <table> 
    <tr> 
        <td width="160">id</td> 
        <td width="160">姓名</td> 
        <td width="160">性别</td> 
        <td width="160">年龄</td> 
        <td width="160">生日</td> 
    </tr> 
    <c:forEach items="${rf.items}" var="student"> 
    <tr> 
        <td><c:out value="${student.id}"/></td> 
        <td><c:out value="${student.name}"/></td> 
        <td><c:out value="${student.gender}"/></td> 
        <td><c:out value="${student.age}"/></td> 
        <td><fmt:formatDate value="${student.birthday}"  type="both" pattern="yyyy-MM-dd"/></td> 
    </tr> 
    </c:forEach> 
    </table> 
    <my:paging curr="${rf.currentPage}" total="${rf.pageCount}" size="${rf.pageSize}" href="list"/> 
    </form> 

controller中根据参数对ResultFilter进行设置:
[java] view plaincopy

    @RequestMapping(value="/list") 
        public ModelAndView listStudent(@ModelAttribute ResultFilter<Student> rf){ 
            studentService.listStudent(rf); 
            return new ModelAndView("list", "rf", rf); 
        } 

service中的方法:
[java] view plaincopy

    public void listStudent(ResultFilter<Student> rf){ 
        rf.setTotalCount(getStudentCount()); 
        rf.setItems(studentDao.getListForPage("from Student", (rf.getCurrentPage() - 1 )* rf.getPageSize(), rf.getPageSize())); 
    } 

这个方法没有使用session,能支持多台服务器共同提供服务的情况。但是这个方法的效率可能有点低,因为每次翻页的时候都会重新创建一个ResultFilter,使用hibernate的缓存应该会使性能有所提高。
分享到:
评论

相关推荐

    Spring MVC 分页组件和JqGrid导出

    在本文中,我们将深入探讨Spring MVC分页组件和JqGrid如何协同工作,实现高效的数据展示和导出功能。Spring MVC作为Java企业级应用的主流框架,提供了强大的MVC架构支持,而JqGrid则是一个功能丰富的jQuery插件,专...

    mysql+spring mvc 实现分页

    总结,MySQL+Spring MVC实现分页涉及数据库分页原理、Spring MVC的分页支持、Spring Data JPA的便捷性、前端分页展示以及性能优化等多个方面。理解并熟练运用这些知识点,可以构建出高效且用户体验良好的Web应用。

    spring mvc 注解 easyui 分页

    1. **Spring MVC分页**: Spring MVC本身并不直接提供分页功能,但可以通过与Spring Data JPA或MyBatis等结合实现。Spring Data JPA中的`Pageable`接口和`Page`对象是分页的核心,它们允许我们在查询时指定分页参数,...

    基于springmvc实现分页查询

    本篇文章将详细探讨如何基于Spring MVC实现分页查询,这对于任何处理大量数据的Web应用都是至关重要的。 首先,理解分页的基本概念。分页是将大型数据集划分为较小、更易管理的部分,以提高用户体验并减少服务器...

    spring分页

    总结,Spring分页涉及到多个层次的配合,包括数据访问层(如Spring Data JPA)、业务逻辑层(如Spring MVC)以及视图层(如Thymeleaf)。理解并熟练掌握这些知识点,能帮助我们构建出高效、用户友好的分页系统。在...

    spring mvc easyui grid 分页

    本项目聚焦于如何在Spring MVC中集成EasyUI的Grid组件实现分页功能,这是一个常见的Web开发场景,对于提高用户体验和减轻服务器压力至关重要。 **Spring MVC** 是一个强大的MVC(Model-View-Controller)框架,它由...

    spring+spring mvc+mybatis+mysql实现的分页源码

    但是,在参考写的同时也发现有很多地方都不解不能直接用的问题,导致实际使用的过程中经常会出错,参考原来做的项目,以及网上的资料,整理了一个比较简单的自己理解的spring+spring mvc+mybatis+mysql实现的分页的...

    mybatis分页例子(spring MVC mybatis 分页)

    mybatis 3.1.1, spring-3.1.3 与 mybatis-spring -1.1.1 集成的 分页程序,以及spring MVC 例子. 没分了,收取一分,如果有和我一样穷的兄弟,你可以到我的博客上去下载,不需要积分:...

    Spring MVC与MYBatis企业应用实战.pdf

    《Spring MVC与MYBatis企业应用实战》是一本深度探讨如何在实际企业环境中集成和运用Spring MVC和MYBatis两大主流技术的书籍。Spring MVC作为Spring框架的重要组成部分,是Java Web开发中的强大控制器,而MYBatis则...

    spring+spring mvc+mybatis框架整合实现超市货物管理系统

    总的来说,"spring+spring mvc+mybatis框架整合实现超市货物管理系统"是一个涵盖后端开发基础技能的项目,涉及了JavaEE的多个层面,从Web层的路由处理,到业务逻辑的实现,再到数据库操作,以及用户认证和分页显示等...

    spring mvc+ajax

    在实际项目中,Spring MVC + Ajax的组合可以应用于各种场景,如分页加载、下拉菜单联动、实时图表更新等。通过合理的架构设计和优化,我们可以构建出高性能、响应式的Web应用程序。 总之,Spring MVC提供了强大的...

    spring mvc+mybatis分页

    在这个特定的场景下,我们讨论的是如何在Spring MVC中结合MyBatis实现分页功能。分页是Web应用中常见的需求,它能够帮助用户更有效地浏览大量数据,提高用户体验。 首先,Spring MVC 是一个轻量级的Java Web框架,...

    Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例.zip

    对于翻页功能,Spring Data JPA提供Pageable接口和Page返回类型,可以方便地实现分页查询。 此外,为了展示数据,开发者会创建视图层的模板,通常是HTML页面,使用Thymeleaf或JSP等技术进行渲染。视图中可以通过...

    jQuery Spring MVC

    **jQuery Spring MVC 整合详解** 在Web开发领域,jQuery 和 Spring MVC 分别是JavaScript库与后端MVC框架的代表。将两者结合使用,可以构建出高效、响应式的前端界面,同时利用Spring MVC的强大功能处理后端业务...

    spring mvc学习+数据分页+数据导入导出

    总的来说,本学习资源涵盖了Spring MVC 3的基础知识,包括注解驱动的控制器、数据库操作、数据分页、数据导入导出以及异常处理等重要概念。通过实践这些内容,你将能够构建出功能完备且健壮的Web应用程序。

    Spring MVC整合Mybatis

    **Spring MVC 整合 Mybatis 知识点详解** 在现代Java Web开发中,Spring MVC 和 Mybatis 是两个非常流行的框架。Spring MVC 提供了强大的MVC架构支持,而Mybatis则是一个轻量级的持久层框架,专注于SQL映射。将两者...

    spring mvc实现Oracle分页

    本项目着重讲解如何在Spring MVC环境中,结合JDBC技术,实现对Oracle数据库的分页查询功能,并通过Ajax进行动态加载,提升用户体验。此外,我们还将涉及LigerUI和jEditable两个前端库,以增强用户界面和交互性。 ...

    基于Spring Mvc的JavaWeb项目

    在JavaWeb中,通常会使用JSP配合Servlet或者Spring MVC的ModelAndView对象来实现分页,同时需要数据库查询支持分页参数,如LIMIT和OFFSET。 3. **删除操作**:项目支持单个和批量删除功能。这需要在后台编写对应的...

    spring-mvc-jquery.zip_jquery_mvc jquery_spring jquery_spring mvc

    4. **Ajax分页**:结合Spring MVC的ModelAndView或ResponseBody,实现无刷新的分页功能。 5. **错误处理**:Spring MVC可以返回错误码或自定义消息,jQuery接收到这些信息后可以显示相应的错误提示。 文件“spring...

    spring mvc、easyui、mybatis 开发网站后台管理系统源代码下载

    Spring MVC、EasyUI和MyBatis是开发企业级Web应用的三大核心技术,广泛应用于网站后台管理系统的构建。这里我们将深入探讨这三个技术栈的核心概念、功能以及它们如何协同工作。 Spring MVC是Spring框架的一个模块,...

Global site tag (gtag.js) - Google Analytics