若依分页的逻辑分析

发布于:2025-03-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

看了一些网上的感觉都是 听君一席话, 如听一席话.

下面开始简单的分析一下, 随便找一个接口, 看一下前端的请求地址:

请求方式: GET

请求地址:
http://localhost/dev-api/system/role/list?pageNum=1&pageSize=10

后端接口:

    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysRole role) {
        startPage();
        List<SysRole> list = roleService.selectRoleList(role);
        return getDataTable(list);
    }

跟一下 startPage();

    public static void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

看一下 buildPageRequest 这个方法做了什么

public static PageDomain getPageDomain()
{
    PageDomain pageDomain = new PageDomain();
    pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
    pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
    pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
    pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
    pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
    return pageDomain;
}

简单处理一下常量:

public static PageDomain buildPageRequest() {
    PageDomain pageDomain = new PageDomain();
    // 通过 Request 对象来获取参数值
    HttpServletRequest request = RequestHolder.getRequest();
    pageDomain.setPageNum(StringUtils.isEmpty(request.getParameter("pageNum")) ? 1 : Integer.parseInt(request.getParameter("pageNum")));
    pageDomain.setPageSize(StringUtils.isEmpty(request.getParameter("pageSize")) ? 10 : Integer.parseInt(request.getParameter("pageSize")));
    pageDomain.setOrderBy(request.getParameter("orderBy"));
    pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
    return pageDomain;
}

到这里其实就明白了. 底层的处理直接从 HttpServletRequest 这个对象中获取 pageNumpageSize.

所以可以猜想如果前端传了分页这两个值后端在接口中没有接收, 也是可以实现分页的效果的. 测试如下: 即

    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/list")
    public TableDataInfo list() { // 请求参数设置为空
        startPage();
        List<SysRole> list = roleService.selectRoleList(new SysRole());
        return getDataTable(list);
    }

注: getDataTable 的作用是封装参数并返回 TableDataInfo对象