场景
官方示例分页实现
前端调用实现
// 一般在查询参数中定义分页变量 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/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。