zoukankan      html  css  js  c++  java
  • 若依管理系统源码分析-分页的实现以及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);
    }

    注:

    博客:
    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中手动拼接分页参数的方式进行传递分页参数。

  • 相关阅读:
    各种贴图
    d3d11devicecontext
    小记2
    Tom Ryaboi
    Tessellation
    关于图形学
    第一章实验
    控制输入框只接收数字及小数点
    JQuery控制文本框是否可以输入
    SQLSERVER中查询一个存储过程使用到的地方
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/13507493.html
Copyright © 2011-2022 走看看