若依管理系统源码分析-分页的实现以及post请求时的分页

场景

官方示例分页实现

前端调用实现

// 一般在查询参数中定义分页变量
queryParams: {
  pageNum: 1,
  pageSize: 10
},

// 页面添加分页组件,传入分页变量
<pagination
  v-show="total>0"
  :total="total"
  :page.sync="queryParams.pageNum"
  :limit.sync="queryParams.pageSize"
  @pagination="getList"
/>

// 调用后台方法,传入参数 获取结果
listUser(this.queryParams).then(response => {
    this.userList = response.rows;
    this.total = response.total;
  }
);

后台逻辑实现

@PostMapping("/list")
@ResponseBody
public TableDataInfo list(User user)
{
    startPage();  // 此方法配合前端完成自动分页
    List<User> list = userService.selectUserList(user);
    return getDataTable(list);
}

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

使用若依自动生成的代码

前端使用pagination控件,基于Bootstrap的轻量级表格插件 BootstrapTable

    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />

其中pageNum代表当前页号,即第几页,pageSize代表每页显示的条数。

将此俩个参数封装进queryParams对象中,此对象也包含前端要传递给后端的查询参数。

首先要对此查询对象进行声明

      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        gh: undefined,
        xm: undefined,
        lxyf: undefined,
      },

并且给pageNum和pageSize设置默认值,其他参数是绑定的查询参数,比如工号、姓名等。

上面分页控件的进行分页时会执行getList方法,此方法是请求后台数据的方法。

在此方法中

    getList() {
      listLxsz(this.queryParams).then((response) => {
        this.lxszList = response.rows;
        this.total = response.total;
      });
    },

调用js接口方法的listLxsz方法并将查询参数对象作为参数传递。

其中就包含分页所需的两个参数。

来到js对应的方法listLxsz中

export function listLxsz(query) {
  return request({
    url: '/kqgl/lxsz/list',
    method: 'get',
    params: query
  })
}

其中request是封装的axios的对象,用来发送请求。

这里是get请求并且传递了查询参数对象。

来到SpringBoot对应的接口中

    @GetMapping("/list")
    public TableDataInfo list(KqLxsz kqLxsz)
    {
        startPage();
        List<KqLxsz> list = kqLxszService.selectKqLxszList(kqLxsz);
        return getDataTable(list);
    }

后台需要调用startPage方法,并且此方法必须放在查询出数据的前一行。

list是后台查询的需要返回前端的数据,此方法必须放在此查询之前。

进入到startPage方法中

    protected void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
        {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.startPage(pageNum, pageSize, orderBy);
        }
    }

分析:

最终是调用的MyBatis的PageHelper来进行分页,只需要给其传递分页所需的两个参数和排序字段即可。

那么这两个分页参数时来自pageDomain这个实体类。

进入到生成这个实体类的方法TableSupport.buildPageRequest中

    public static PageDomain buildPageRequest()
    {
        return getPageDomain();
    }

返回的是getPageDomain这个方法的返回值,进入到该方法

    public static PageDomain getPageDomain()
    {
        PageDomain pageDomain = new PageDomain();
        pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
        pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
        return pageDomain;
    }

可以看到此实体类的分页的参数是从工具类ServletUtils中获取的参数

其中ServletUtils是客户端工具类

package com.ruoyi.common.utils;

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.ruoyi.common.core.text.Convert;

/**
 * 客户端工具类
 * 
 * @author ruoyi
 */
public class ServletUtils
{
    /**
     * 获取String参数
     */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }

    /**
     * 获取String参数
     */
    public static String getParameter(String name, String defaultValue)
    {
        return Convert.toStr(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }

    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name, Integer defaultValue)
    {
        return Convert.toInt(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest()
    {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse()
    {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获取session
     */
    public static HttpSession getSession()
    {
        return getRequest().getSession();
    }

    public static ServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 将字符串渲染到客户端
     * 
     * @param response 渲染对象
     * @param string 待渲染的字符串
     * @return null
     */
    public static String renderString(HttpServletResponse response, String string)
    {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 是否是Ajax异步请求
     * 
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request)
    {
        String accept = request.getHeader("accept");
        if (accept != null && accept.indexOf("application/json") != -1)
        {
            return true;
        }

        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
        {
            return true;
        }

        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
        {
            return true;
        }

        String ajax = request.getParameter("__ajax");
        if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
        {
            return true;
        }
        return false;
    }
}
获取分页参数时调用的getParameterToInt定义如下

    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }

调用了getRequest方法,此方法定义如下

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest()
    {
        return getRequestAttributes().getRequest();
    }

此方法是获取request请求参数

而request请求对象是来自会话session,所以在getRequestAttributes中

    public static ServletRequestAttributes getRequestAttributes()
    {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

所以最终在进行get请求时,直接将分页参数作为参数传递给后台即可。

因为在get请求时会将参数拼接在url中,这样后台就能从请求中获取分页参数并传递给MyBatis的

pageHelper实现分页。

如果是post请求那,post请求时传递的是一个实体,如果将分页参数放在实体中,则后台没法通过请求获取分页参数。

可以通过在post请求的url中添加分页参数实现

比如在如下前端请求时

    getList() {
      listDdjl(this.queryParams).then((response) => {
        this.ddjlList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },

最终调用请求数据的方法

export function listDdjl(query) {
  return request({
    url: '/kqgl/ddjl/getListBySx?pageNum='+query.pageNum+'&pageSize='+query.pageSize,
    method: 'post',
    data: query
  })
}

请求方式是post请求,分页参数存放在实体中,可以通过在url中手动拼接分页参数的方式进行传递分页参数。

博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值