用displaytag搞定数据库分页,简单又实用的分页显示方法分享
- 问答
- 2026-01-08 06:23:45
- 10
综合自早期Java Web开发社区分享、博客园及CSDN等技术博客的常见实践方案)
说到在网页上显示数据库里的数据,特别是数据量一大,分页就成了一个绕不开的问题,以前咱们可能会写一大堆代码,又是算总记录数,又是算总页数,还要处理当前页、上一页、下一页的逻辑,SQL语句里还得加上limit和offset,麻烦得很,今天分享一个老牌但非常实用的工具——DisplayTag,用它来搞定分页,你会发现事情原来可以这么简单。
DisplayTag是个啥?
简单说,DisplayTag是一个开源的JSP标签库,它的核心作用就是把我们在后端Java代码里查出来的一个List集合,轻松地在JSP页面上用一个漂亮的表格展示出来,它最厉害的地方在于,内置了分页、排序、导出Excel/PDF等强大功能,我们今天就聚焦在它的分页功能上。
为啥要用DisplayTag?
- 省事: 这是最大的优点,你几乎不需要写任何分页逻辑代码,传统方式下,你得在后台计算总记录数、当前页起始索引、总页数,然后把这些信息传到前台,用DisplayTag,你只需要把完整的
List(或者为了性能,也可以是当前页的数据List)扔给前台,剩下的显示、分页链接、页码信息,它全包了。 - 好看: DisplayTag默认的表格样式就挺规整的,而且也支持自定义CSS,让你的表格看起来不那么“程序员”。
- 功能多: 除了分页,排序、列筛选、数据导出都是一两行配置就能搞定的事情,扩展性很强。
具体怎么用?三步走搞定!
第一步:准备工作(把DisplayTag请进门)
你得把DisplayTag的jar包放到你的Web项目的WEB-INF/lib目录下,现在大家都用Maven或者Gradle了,直接在pom.xml里加一句依赖就更方便了,比如类似这样的依赖配置(具体版本号请根据实际情况选择)。
在你的JSP页面的最上面,引入DisplayTag的标签库,这行代码是固定的:
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
这样,我们就可以在页面里用<display:table>这样的标签了。

第二步:后台代码(你的工作变得极其简单)
传统分页,你需要在后台做大量计算,用DisplayTag,你有两种选择:
-
省心模式(适合数据量不大时): 你直接从数据库里把符合条件的所有数据都查出来,装进一个
List里,比如List<User> userList,然后把这个List放到request或者pageContext等JSP能取到的作用域里就行了,DisplayTag会自动帮你完成分页切割,如果数据量有几万条,这可不行,会卡死。 -
高效模式(推荐,适合任何数据量): DisplayTag支持“按需查询”,后台你只需要接收两个关键参数:
page(当前是第几页)和pagesize(每页显示多少条,DisplayTag叫pagesize),然后用这两个参数去构造你的SQL查询,比如MySQL就是用LIMIT (page-1)*pagesize, pagesize,你还需要单独执行一条COUNT(*)的SQL来获取总记录数。 关键来了:你需要把一个PageList对象(或者一个实现了org.displaytag.pagination.PaginatedList接口的对象)放到作用域里,这个对象里包含了:当前页的数据List、总记录数、当前页码、每页大小,DisplayTag会根据这个对象提供的信息来智能生成分页条。很多博客里会提到用
org.displaytag.tags.TableTagParameters来获取前台传过来的page和pagesize参数,像这样:int page = Integer.parseInt(request.getParameter(TableTagParameters.PARAMETER_PAGE)); int pageSize = Integer.parseInt(request.getParameter(TableTagParameters.PARAMETER_PAGESIZE));
然后你根据这些值去查数据库,最后组装成DisplayTag需要的分页对象,虽然看起来比“省心模式”多写了几行代码,但这才是应对海量数据的正确姿势,性能最好。

第三步:前台JSP页面(神奇的事情发生在这里)
后台把数据准备好之后,前台就非常简单了,假设你在后台放了一个叫userList的对象。
<display:table name="userList" id="user" pagesize="10" requestURI="./userList.do">
<display:column property="id" title="用户ID" sortable="true"/>
<display:column property="username" title="用户名" sortable="true"/>
<display:column property="email" title="电子邮箱"/>
</display:table>
瞧,就这么几行代码,一个功能完整的分页表格就出来了!我们来解释一下这几个属性:
name="userList":这就是你从后台放在作用域里的那个对象的名字。id="user":这个是每个遍历出来的对象的引用名,方便在标签体内做更复杂的操作。pagesize="10":每页显示10条记录。requestURI="./userList.do":这个很重要,它指定了分页、排序等操作时,表单提交到哪个地址,一般就写当前页面响应的那个Action或Servlet的路径。<display:column>:定义每一列。property="username":对应你JavaBean里的属性名,比如user.getUsername()。title="用户名":表格这一列的标题。sortable="true":允许对这一列进行排序,当你点击标题时,DisplayTag会自动在后台参数里加上排序字段和方向,你只需要在后台接收并处理即可。
写完这些,你一刷新页面,就会看到一个带有页码导航(“上一页 1 2 3 ... 下一页”)、显示总记录数、每页条数的表格,所有这些UI元素,你一行JavaScript或者复杂的JSTL代码都没写!
可能会遇到的问题和小技巧
- 中文乱码: 如果导出Excel时中文乱码,可能需要配置一下DisplayTag的导出编码。
- 样式调整: 默认样式可能不符合你的项目风格,没关系,DisplayTag生成的HTML有很清晰的CSS类名,比如
.table,.pagelinks等,你自己写个CSS文件覆盖掉默认样式就行了。 - 自定义分页提示信息: 你觉得它默认的“第X页,共X页”的文字不好看,可以通过设置
display:setProperty标签或者配置文件来自定义这些信息。
总结一下
用DisplayTag做分页,核心思想就是“让专业的工具做专业的事”,你把数据处理的核心逻辑(查数据库)做好,把显示和交互这种重复性、界面性的工作交给DisplayTag,它极大地减少了代码量,提高了开发效率,并且让代码更易维护,虽然现在前端框架层出不穷,但在一些传统的JSP项目中,或者当你需要一个快速、稳定、后端渲染的分页方案时,DisplayTag依然是一个非常“简单又实用”的绝佳选择,你试过一次,可能就再也不想手写分页逻辑了。
本文由芮以莲于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/76653.html
