場景
官方示例分頁實現
前端調用實現
// 一般在查詢參數中定義分頁變量 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); }
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
使用若依自動生成的代碼
前端使用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中手動拼接分頁參數的方式進行傳遞分頁參數。