JSP实现分页,动态生成页码,解决页码显示过多问题

Controller返回分页数据之后,发现页码显示过多,影响美观.


经过处理过后,看着就舒服多了


下面是中间页实现代码

model.addAttribute("page", pageBean);

pageBean的属性看下面

<%--中间页--%>
    <%--显示6页中间页[begin=起始页,end=最大页]--%>
    <%--总页数没有6页--%>
    <c:choose>
        <c:when test="${page.totalPage <= 6}">
            <c:set var="begin" value="1"/>
            <c:set var="end" value="${page.totalPage}"/>
        </c:when>
        <%--页数超过了6页--%>
        <c:otherwise>
            <c:set var="begin" value="${page.currentPage - 1}"/>
            <c:set var="end" value="${page.currentPage + 3}"/>
            <%--如果begin减1后为0,设置起始页为1,最大页为6--%>
            <c:if test="${begin -1 <= 0}">
                <c:set var="begin" value="1"/>
                <c:set var="end" value="6"/>
            </c:if>
            <%--如果end超过最大页,设置起始页=最大页-5--%>
            <c:if test="${end > page.totalPage}">
                <c:set var="begin" value="${page.totalPage - 5}"/>
                <c:set var="end" value="${page.totalPage}"/>
            </c:if>
        </c:otherwise>
    </c:choose>
    <%--遍历--%>
    <c:forEach var="i" begin="${begin}" end="${end}">
        <%--当前页,选中--%>
        <c:choose>
            <c:when test="${i == page.currentPage}">
                <li class="active"><a href="#">${i}</a></li>
            </c:when>
            <%--不是当前页--%>
            <c:otherwise>
                <li><a href="<%=basePath%>customer/findAll.action?currentPage=${i}">${i}</a></li>
            </c:otherwise>
        </c:choose>
    </c:forEach>
逻辑比较简单,多看几遍就能明白.

分页使用的BootStrap,官网就有


下面是一些其他数据和说明教程,不需要的可无视.
个人比较喜欢将分页数据封装到JavaBean里,使用起来比较舒服,看着也不乱.

/**
 * Created with IntelliJ IDEA.
 *
 * @author: ChuRuo Xu
 */
public class PageBean<T> {
    /**
     * 当前页
     */
    private Integer currentPage;
    /**
     * 每页显示条数
     */
    private Integer pageSize;
    /**
     * 总记录数
     */
    private Integer totalCount;
    /**
    * 总页数
    */
    private Integer totalPage;
    /**
     * 每页数据内容
     */
    private List<T> content;

总记录数到数据库查询count即可,使用的Mybatis

<!-- 查询客户总记录数-->
    <select id="findCustomerCount" resultType="Integer">
        SELECT COUNT(*) FROM `customer`
    </select>

有了当前页(起始页面肯定是1),每页显示条数(自己设置),总记录数,然后可以算出总页数.

总页数 = (总记录数 - 1 + 每页显示条数) / 每页显示条数

然后就可以算出[从第几条数据开始查询]

begin = (当前页 - 1) * 每页显示条数

分页查询语句用limit,简单, 传递参数不要忘记使用@Param,建议使用这种方式传参,阅读性好!

<!--分页查询客户信息-->
    <select id="findAll" parameterType="Integer" resultType="com.springmvc.domain.Customer">
        SELECT * FROM `customer` limit #{begin},#{pageSize}
    </select>
/**
     * 分页查询客户信息
     *
     * @param begin    从第几条开始
     * @param pageSize 每页条数
     * @return List<Customer>
     */
    List<Customer> findAll(@Param("begin") Integer begin, @Param("pageSize") Integer pageSize);
到此PageBean的所有数据都有了,返回到页面从域中取出来即可


首页和尾页的判断

<%--如果是第一页,不允许点击--%>
<c:choose>
    <c:when test="${page.currentPage == 1}">
        <li class="disabled">
            <a href="#" aria-label="Previous">
                <span aria-hidden="true">«</span>
            </a>
        </li>
    </c:when>
    <c:otherwise>
        <%-- 点击到首页--%>
        <li>
            <a href="<%=basePath%>customer/findAll.action?currentPage=1" aria-label="Previous">
                <span aria-hidden="true">«</span>
            </a>
        </li>
    </c:otherwise>
</c:choose>

<%--如果是最后一页,不允许点击--%>
<c:choose>
    <c:when test="${page.currentPage == page.totalPage}">
        <li class="disabled">
            <a href="#" aria-label="Previous">
                <span aria-hidden="true">«</span>
            </a>
        </li>
    </c:when>
    <c:otherwise>
        <%-- 点击到尾页--%>
        <li>
            <a href="<%=basePath%>customer/findAll.action?currentPage=${page.totalPage}" aria-label="Next">
                <span aria-hidden="true">»</span>
            </a>
        </li>
    </c:otherwise>
</c:choose>


  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
JSP实现分页显示数据的步骤如下: 1. 在JSP页面中使用JSTL标签库中的<c:forEach>标签或者JSP自带的<% %>标签,遍历数据集合并将数据显示在页面上。 2. 在页面上添加分页导航条,用于用户切换不同页面的数据。可以通过<a>标签或者<button>标签来实现。 3. 在后台代码中,根据用户请求的当前页码以及每页显示数据量,计算出要显示数据的起始位置和结束位置。 4. 从数据源中查询数据,并根据起始位置和结束位置来限制查询结果的数量。 5. 将查询结果封装成JavaBean对象,然后将JavaBean对象放入请求作用域(request)中,以便在JSP页面中遍历和显示。 6. 在JSP页面中根据分页导航条传递的参数,重新查询数据显示在页面上。 示例代码如下: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <h1>用户列表</h1> <table> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> </tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.email}</td> </tr> </c:forEach> </table> <br> <div> <c:if test="${currentPage > 1}"> <a href="list.jsp?page=${currentPage - 1}">上一页</a> </c:if> <c:forEach begin="1" end="${totalPage}" varStatus="status"> <c:choose> <c:when test="${status.index == currentPage}"> <span>${status.index}</span> </c:when> <c:otherwise> <a href="list.jsp?page=${status.index}">${status.index}</a> </c:otherwise> </c:choose> </c:forEach> <c:if test="${currentPage < totalPage}"> <a href="list.jsp?page=${currentPage + 1}">下一页</a> </c:if> </div> </body> </html> ``` 在后台代码中,我们需要根据参数page和pageSize来计算出要查询的数据的起始位置和结束位置,然后从数据源中查询数据,并将查询结果封装成JavaBean对象放入请求作用域中。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="com.example.User" %> <% int currentPage = Integer.parseInt(request.getParameter("page")); int pageSize = 10; int totalCount = 100; int totalPage = (totalCount + pageSize - 1) / pageSize; int startIndex = (currentPage - 1) * pageSize; int endIndex = startIndex + pageSize; List<User> users = new ArrayList<User>(); for (int i = startIndex; i < endIndex && i < totalCount; i++) { User user = new User(); user.setId(i + 1); user.setUsername("user" + (i + 1)); user.setEmail("user" + (i + 1) + "@example.com"); users.add(user); } request.setAttribute("users", users); request.setAttribute("currentPage", currentPage); request.setAttribute("totalPage", totalPage); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <%@ include file="list.jsp" %> </body> </html> ``` 在JSP页面中,我们需要根据请求作用域中的数据来渲染分页导航条和数据列表。 注意:为了防止SQL注入等安全问题,我们在实际开发中应该使用PreparedStatement来查询数据,并对用户输入的参数进行过滤和验证。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值