若依管理系统源码分析-分页的实现以及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中手动拼接分页参数的方式进行传递分页参数。

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
DownPlus是基于B/S结构,采用微软ASP技术构建的下载管理系统. 最新版本:2.2.0[GB2312/UTF-8] (2009.04.25) 主要的功能如下: 无限级分类,分类可自由移动,排序. 自定义字段功能,可设置字段表单的形式,如单行、多行文本,单选、多选按钮,单行、多行下拉,隐藏等,可指定默认值,值为空是否用默认值代替,可设置字段是否可采集,是否在编辑界面隐藏等. 前台全部生成静态页面,前台运行和后台管理完全分离,后台管理目录可任意改名. 支持软件和文章的动态列表页,可使用URLRewrite实现伪静态的列表页 自定义静态文件存放目录,自定义文件名的前缀和后缀(htm,shtml,asp).自定义生成静态文件的模式(ASCII,Unicode). 后台管理员多级权限管理,允许您灵活的控制权限. 无组件上传功能,自定义允许上传的文件类型和大小.上传和本地化的图片可增加文字和图片水印. 模板功能:模板以htm文件形式存放,可在线创建、修改、加载模板,方便的修改页面任一细节. 强大的模板标签:所有页面区块的内容调用由模板标签实现,可自定义显示的分类,数量,排列,等等. 自定义标签功能:用来组织某些需要特别显示的软件,可实现类似于“广告”和“专集”的功能.系统提供了多达22种的标签显示样式组合,支持图片和flash显示,可选生成JS文件调用或直接写入静态页面. 广告功能:系统内置5种广告.分别为文字 、图片(可轮播)、Flash、弹出窗口以及模态窗口(网页对话框).支持自定义广告内容.可选生成JS文件调用或直接写入静态页面. 自定义页面功能:利用系统定义的模板标签,配合模板,可组合出任意的页面. 会员功能:自定义会员的等级,可选会员注册是否开放,可选会员功能是否开启,会员资格间限制.可选注册默认超期天数;可选注册立刻激活帐号;可选注册用户默认的等级. 用户有积分(虚拟货币)属性,下载软件可扣除一定积分,会员可以查询详细的消费记录. 会员收藏夹功能,可设置最大收藏数目,可设置提醒. 下载服务器功能:有效的分割下载地址,方便更改目录或ftp密码等.可直接输出文件真实地址,可选下载地址的会员等级限制.本地预定地址可映射物理目录,可在删除软件同删除软件文件.可设置输出迅雷或快车联盟专用下载地址. 下载地址可随机排序,可在显示文件真实地址的模式下统计下载次数. 软件下载限制功能:可为软件设置密码.为每个软件、每个下载地址设置会员等级限制.所有限制可选开启或关闭. 软件/文章评分功能. IP限制功能:自定义IP限制范围. 前台搜索防刷新:设置限制搜索的间间隔. 前台搜索可选模板化. 搜索可统计热门关键字,并在静态页面中生成热门搜索链接. 自定义软件的多种属性:软件语言,软件性质,软件运行系统,软件授权等. 防盗链设置:可选检查用户来路,可选强制使用POST方式提交下载请求. 批量生成:批量生成软件页面和分类页面,在生成过程中可暂停和保存正在进行的任务,保存的任务可在以后继续执行. 提供多个系统工具:批量修改下载地址,空间占用查看,备份、恢复、压缩数据库. 软件/文章标题支持自定义样式. 插件管理功能,方便的管理各种插件. 软件采集插件:可采集特定软件站点的最新软件信息,更新站点轻松方便. 友情链接插件,分logo和文字链接2种,分开显示,支持模板. 媒体播放器插件(自动检测地址的结尾后缀,调用相应的播放器,方便播放媒体,Flash/wmv/rm等) 文章系统:无限级分类,分类可自由移动. 文章分类和文章内容页面均支持多模板. 文章图片本地化:自动识别相对链接. 文章分页功能:自动分页或手动插入标记分页,支持段落标题,支持上下篇链接 文章专题功能:自定义专题首页. 站内链接功能:自动替换文章内容中的站内链接,可选禁用此项 自定义文章显示功能:显示特定的多个文章,支持自定义内容区块模板,轻松实现图片,Flash,视频显示 文章分级浏览功能:自定义文章的用户浏览等级. 文章采集插件:自定义采集源,无需学习正则表达式,支持防重复采集,支持内容分页采集.支持分类映射,轻松采集一、二层结构文章. 软件采集插件:自定义采集源,无需正则表达式知识,支持防重复采集,支持分类映射,支持下载文件列表导出,便于实现本地化. 采集任务列表功能:可将多个采集源加入采集任务一并执行采集. 评论插件:支持多模板,可选使用评论验证码,可选是否审核评论.可选脏字过滤.可以使用表情图片. 投稿插件:软件/文章投稿插件.可轻松审核和取消稿件. 支持迅雷和快车联盟 支持RSS订
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 JavaEE+JDBC+Servlet+EL表达式的员工信息管理系统源码+数据库+项目说明(高分课设).zip # :heart: JavaEE+JDBC+Servlet+EL表达式的员工信息管理系统 ## 介绍 简易的员工管理系统,包括信息的增删改查,新增员工图像 前端:`HTML`,`CSS`,`JavaScript`,`jQuery`,`EL表达式`,`jsp` <br> 后端:`JavaEE`,`servlet`(创建servlet,使用get和post请求处理数据;使用Request,Response,session存储数据),`JDBC`(德鲁伊数据库连接池,使用QueryRunner处理数据)<br> 和上一次系统[bootstrap+JavaEE+JDBC+JSP的信息管理系统](https://gitee.com/LovelyHzz/Info-management-system)相比 1. 使用了servlet把业务处理代码放在后台处理,删除了不必要的jsp页面 2. 使用El表达式展示数据,不用在前台获取一遍session数据 **2021/9/27 更新** 1. 新增分页功能,包括所有用户和部门用户分页;使用PageUtils分页工具类 **2021/10/8 更新** 1. dao层和service层部分采用单例模式(懒汉式-不支持多线程) 2. service层部门采用工厂模式 ## 源码 [v1.0 - servlet-v1.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v1.0)<br> [v2.0 - servlet-v2.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v2.0)<br> [v3.0 - servlet-v3.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v3.0)<br> [v4.0 - servlet-v4.0](https://gitee.com/LovelyHzz/java-ee-jdbc-servlet/tree/master/servlet-v4.0)<br> ## 项目展示效果 <hr> ### 主页 ![主页](https://images.gitee.com/uploads/images/2021/0925/104935_f4123936_8254421.png "主页.png") ### 注册 ![注册页面](https://images.gitee.com/uploads/images/2021/0925/104049_736a293e_8254421.png "注册.png") ### 员工列表 ![用户列表-第一次注册无须添加头像](https://images.gitee.com/uploads/images/2021/0925/104127_4d423d7c_8254421.png "用户列表-注册无须添加头像.png") ![用户列表-展示工资样式{大于8000:绿色;6000~8000之间:红色}](https://images.gitee.com/uploads/images/2021/0925/104208_ab42ad8c_8254421.png "用户列表-展示工资样式.png") ![员工列表-筛选部门](https://images.gitee.com/uploads/images/2021/0925/110316_d9957fdf_8254421.png "员工列表-筛选部门.png") ### 修改 ![修改页面](https://images.gitee.com/uploads/images/2021/0925/104408_5e4c5bc2_8254421.png "修改页面.png") ![修改一下工资](https://images.gitee.com/uploads/images/2021/0925/104433_895255a2_8254421.png "修改一下工资.png") ![修改完成](https://images.gitee.
好的,以下是一个Java Spring Boot的Controller示例,用于使用若依框架实现分页查询: ```java @RestController @RequestMapping("/api") public class UserController { @Autowired private UserService userService; @PostMapping("/users") @RequiresPermissions("user:list") public R getUsers(@RequestBody UserSearchCriteria criteria, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> userList = userService.getUsers(criteria); PageInfo<User> pageInfo = new PageInfo<>(userList); return R.ok().put("data", pageInfo); } } ``` 在上述示例中,我们定义了一个POST请求的`/api/users`接口,用于查询用户列表。接口的请求体中包含一个`UserSearchCriteria`对象,该对象用于指定查询条件。接口还包含两个分页参数:`pageNum`和`pageSize`,用于指定要返回的结果集的页数和每页的大小。 在实现方面,我们使用了若依框架提供的分页功能。我们调用了`PageHelper.startPage()`方法,该方法用于设置分页信息。我们还调用了`userService.getUsers()`方法,该方法接受一个`UserSearchCriteria`对象作为参数,并返回一个`User`对象列表。最后,我们使用`PageInfo`类包装查询结果,并使用`R`类返回结果。 需要注意的是,`UserSearchCriteria`和`User`对象需要根据具体业务需求来定义。此外,我们还需要在`UserService`中实现`getUsers()`方法,用于实现具体的查询逻辑。 希望这个示例能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值