JeeSite数据分页与翻页

  本文章介绍的是JeeSite开源项目二次开发时的一些笔记,对于没有使用过JeeSite的可以不用往下看了,因为下面的代码是跟JeeSite二次开发相关的代码,不做JeeSite的二次开发,以下代码对您无用,在这里友情提醒,避免浪费您宝贵的时间。

  翻页功能在各种项目中都会用到,在JeeSite开源项目中使用翻页也非常的容易,只要在配置文件中进行就可以就可以使用,系统的默认值为30页。

  配置文件在src\main\resources\jeesite.properties文件中,配置如下:

1 page.pageSize=30

  但是这种配置并不能满足所有的分页要求,也就是说在不同的列表中分页的条数是不同的。如果在配置文件中修改分页条数,那么会影响到整个项目的分页,它是一个全局的配置参数,这样就很不方便了。

JeeSite手册的分页

  在做项目的时候,由于使用JeeSite的默认页数无法满足项目的需求,因为不可能每个列表页都以30条记录作为一页,因此只能看手册。看手册又没有具体理解如何使用,JeeSite手册中最分页的描述如下:

1 // 设置分页参数,则分页,如果不设置,则根据条件获取全部
2 user.setPage(page);
3 // 执行分页查询
4 page.setList(userDao.findPage(user));

  按照手册的方法简单的尝试了一下,但是没有效果,因此就只能查看分页的源码了。

分页源码

  在使用开源项目的时候遇到问题,如果又没有手册,或者手册说明不是特别详细的话,除了在网上找资料外,就只剩下阅读开源项目的源代码了。(注:关于分页这个问题在网上还是有很多人问的,大部分都是说修改配置文件,但是同样无法满足提问人的需要,因为大家需要的是不同的列表中有不同的分页条数。)

  在Eclipse下按下Ctrl+Shift+R,输入“page.java”,然后打开该Java文件。看一下Page类的构造方法,代码如下:

 1 /**
 2  * 构造方法
 3  * @param request 传递 repage 参数,来记住页码
 4  * @param response 用于设置 Cookie,记住页码
 5  */
 6 public Page(HttpServletRequest request, HttpServletResponse response){
 7     this(request, response, -2);
 8 }
 9
10 /**
11  * 构造方法
12  * @param request 传递 repage 参数,来记住页码
13  * @param response 用于设置 Cookie,记住页码
14  * @param defaultPageSize 默认分页大小,如果传递 -1 则为不分页,返回所有数据
15  */
16 public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){
17     // 设置页码参数(传递repage参数,来记住页码)
18     String no = request.getParameter("pageNo");
19     if (StringUtils.isNumeric(no)){
20         CookieUtils.setCookie(response, "pageNo", no);
21         this.setPageNo(Integer.parseInt(no));
22     }else if (request.getParameter("repage")!=null){
23         no = CookieUtils.getCookie(request, "pageNo");
24         if (StringUtils.isNumeric(no)){
25             this.setPageNo(Integer.parseInt(no));
26         }
27     }
28     // 设置页面大小参数(传递repage参数,来记住页码大小)
29     String size = request.getParameter("pageSize");
30     if (StringUtils.isNumeric(size)){
31         CookieUtils.setCookie(response, "pageSize", size);
32         this.setPageSize(Integer.parseInt(size));
33     }else if (request.getParameter("repage")!=null){
34         size = CookieUtils.getCookie(request, "pageSize");
35         if (StringUtils.isNumeric(size)){
36             this.setPageSize(Integer.parseInt(size));
37         }
38     }else if (defaultPageSize != -2){
39         this.pageSize = defaultPageSize;
40     }
41     // 设置页面分页函数
42     String funcName = request.getParameter("funcName");
43     if (StringUtils.isNotBlank(funcName)){
44         CookieUtils.setCookie(response, "funcName", funcName);
45         this.setFuncName(funcName);
46     }else if (request.getParameter("repage")!=null){
47         funcName = CookieUtils.getCookie(request, "funcName");
48         if (StringUtils.isNotBlank(funcName)){
49             this.setFuncName(funcName);
50         }
51     }
52     // 设置排序参数
53     String orderBy = request.getParameter("orderBy");
54     if (StringUtils.isNotBlank(orderBy)){
55         this.setOrderBy(orderBy);
56     }
57 }
58
59 /**
60  * 构造方法
61  * @param pageNo 当前页码
62  * @param pageSize 分页大小
63  */
64 public Page(int pageNo, int pageSize) {
65     this(pageNo, pageSize, 0);
66 }
67
68 /**
69  * 构造方法
70  * @param pageNo 当前页码
71  * @param pageSize 分页大小
72  * @param count 数据条数
73  */
74 public Page(int pageNo, int pageSize, long count) {
75     this(pageNo, pageSize, count, new ArrayList<T>());
76 }
77
78 /**
79  * 构造方法
80  * @param pageNo 当前页码
81  * @param pageSize 分页大小
82  * @param count 数据条数
83  * @param list 本页数据对象列表
84  */
85 public Page(int pageNo, int pageSize, long count, List<T> list) {
86     this.setCount(count);
87     this.setPageNo(pageNo);
88     this.pageSize = pageSize;
89     this.list = list;
90 }

  从源码中可以看出Page类有很多的构造方法,如果需要自定义每页有多少条记录,那么需要使用的构造方法是第二个构造方法,代码如下:

 1 /**
 2  * 构造方法
 3  * @param request 传递 repage 参数,来记住页码
 4  * @param response 用于设置 Cookie,记住页码
 5  * @param defaultPageSize 默认分页大小,如果传递 -1 则为不分页,返回所有数据
 6  */
 7 public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){
 8     // 设置页码参数(传递repage参数,来记住页码)
 9     String no = request.getParameter("pageNo");
10     if (StringUtils.isNumeric(no)){
11         CookieUtils.setCookie(response, "pageNo", no);
12         this.setPageNo(Integer.parseInt(no));
13     }else if (request.getParameter("repage")!=null){
14         no = CookieUtils.getCookie(request, "pageNo");
15         if (StringUtils.isNumeric(no)){
16             this.setPageNo(Integer.parseInt(no));
17         }
18     }

  这个构造方法比系统默认生成代码使用的构造函数多了一个参数——defaultPageSize,这个参数可以用来设置每页的记录数,调用方法如下:

1 Page<Xxx> p = new Page<Xxx>(request, response, 10);
2 Page<Xxx> page = xxxService.findPage(p, xxx);

  JeeSite生成的代码中调用的方法如下(JeeSite有一个代码生成的功能,代码生成中对分页的使用如下):

1 Page<Xxx> page = xxxService.findPage(new Page<Xxx>(request, response), xxx);

  在该源码上下断点,发现这里在实例化Page类时,调用的构造方法如下:

1 /**
2  * 构造方法
3  * @param request 传递 repage 参数,来记住页码
4  * @param response 用于设置 Cookie,记住页码
5  */
6 public Page(HttpServletRequest request, HttpServletResponse response){
7     this(request, response, -2);
8 }

  在该构造方法中同样调用的是Page.java中第二个构造方法。

JS翻页

  在JeeSite中使用了BootStrap的前端库,使用这个前端库可以很容易的使用“弹出的模态对话框”。使用模态对话框,可能会是一个表单提交一些数据,也可能是其他表单数据列表。使用模态对话框时,如果是数据列表的话,那么也会涉及到列表分页的问题。调用的代码如下:

 1 <div class="control-group">
 2     <label class="control-label">个人信息:</label>
 3     <div class="controls">
 4         <input type="text" name="personName" />
 5         <form:hidden path="personId" />
 6         <span class="help-inline"><font color="red">*</font> </span><a
 7             href="url/Controller..."
 8             role="button" class="btn" data-target="#PersonModal"
 9             data-toggle="modal">选择</a>
10     </div>
11 </div>
12 ……
13 <div id="PersonModal" class="modal hide fade" tabindex="-1" role="dialog"
14     aria-labelledby="myModalLabel" aria-hidden="true">
15     <div class="modal-header">
16         <button type="button" class="close" data-dismiss="modal"
17             aria-hidden="true">×</button>
18         <h3 id="PersonModalLabel">选择人员</h3>
19     </div>
20     <div class="modal-body" id="PersonBody"></div>
21     <div class="modal-footer">
22         <button class="btn" data-dismiss="modal" aria-hidden="true">取消</button>
23         <button class="btn btn-primary" id="selectPerson">确定</button>
24     </div>
25 </div>

  当点击上半段代码的“选择”按钮时,通过href指定的URL地址可以将另外一个页面显示到该页面中,然后获取到的数据会在下半段代码的具有属性“modal-body”的div中显示出来。这时,显示的是另外一个页面的内容的,而显示页面的JS代码是无法带过来的。那么,翻页默认调用的JS代码就不能使用了。翻页的代码如下:

1 function page(n,s){
2     $("#pageNo").val(n);
3     $("#pageSize").val(s);
4     $("#searchForm").submit();
5     return false;
6 }

  这段代码是就无法调用了,那么要翻页就需要重新定义了,并且,重新定义后的JS代码要在完成分页的情况下将数据仍然显示到“modal-body”中。但是重新定义一个翻页的JS函数如何让页码列表调用呢?

  在Page类中,提供了一个非常实用的方法,它可以指定翻页的JS函数,方法如下:

1 /**
2  * 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。
3  * @param funcName 默认为page
4  */
5 public void setFuncName(String funcName) {
6     this.funcName = funcName;
7 }

  有了这个函数就可以完成翻页了,甚至在多个模态对话框中都使用到需要翻页的列表,也可以解决了。调用方法如下:

1 Page<Xxx> p = new Page<Xxx>(request, response, 10);
2 p.setFuncName("ctPage");
3 Page<Xxx> page = xxxService.findPage(p, xxx);

  这样,生成的分页页码中在调用翻页函数时,就可以调用自定义的翻页函数ctPage()了。定义的翻页方法如下:

 1 function hrPage(n, s) {
 2     $.ajax({
 3         type: "POST",
 4         url:"${ctx}/...",   // 具体的地址省略
 5         data:{pageNo:n, pageSize:s},
 6         async: false,
 7         error: function(request) {
 8
 9         },
10         success: function(data) {
11             $(‘#PersonBody‘).empty();
12             $(‘#PersonBody‘).append(data);
13         }
14     });
15 }

  函数体就是自定义的翻页方法了。

  这些都是我在实际使用JeeSite时所遇到的问题的解决方法。有问题欢迎讨论!!

  关于JeeSite的另一篇笔记是:JeeSite中Excel导入导出

原文地址:https://www.cnblogs.com/tosser/p/9011578.html

时间: 2024-10-13 07:22:28

JeeSite数据分页与翻页的相关文章

bootstrap分页与翻页

bootstrap分页在ul中添加pagination可显示如下效果: bootstrap翻页在ul中添加pager类可显示如下效果: 结合分页与翻页可显示如下效果: 因此,需要3个块元素xian显示在同一列,解决办法: 为第一个和最后一个ul设置float分别为left和right 代码如下: 1 <div class="col-sm-offset-4 col-sm-3"> 2 <ul id="previous" class="page

bootstrap(5)分页,翻页,徽章效果

一 : 分页效果 我们可以看到在网站上的翻页效果如下: 使用bootstrap如何实现的呢? 代码如下: <nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="#" aria-label="Previous"> <span aria-hidden="true"&g

前嗅ForeSpider教程:采集表格/列表页中的数据(不翻页)

第一步:新建任务 ① 击左上角"加号"新建任务,如图1: [图1] ②在弹窗里填写采集地址,任务名称如图2: [图2] ③点击下一步,选择进行数据抽取还是链接抽取,本次采集需要采集当前页面列表中的所有内容,所以只需抽取列表数据即可,点击"抽取数据",如图3: [图3] 第二步:创建/选择表单 在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单.此处使用的是的前嗅的表单,如图4 方法一

织梦DEDECMS网站首页如何实现分页翻页

织梦DEDECMS模板网站首页如何实现首页分页和翻页 方法如下:(三种方法,自己选择一种来实现分页吧) 第一种:调用ajax和参数的(不推荐)1.必须在DEDE首页模板中的<head></head>中引入(详细看你的默认模板) <script language="javascript" type="text/javascript" src="{dede:global.cfg_cmsurl/}/include/dedeajax2

PHP.26-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序

商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现翻页.搜索.排序 * */ public function search($perPage = 5) //$perPage控制显示条数 { /***********翻页***********/ //取出总的记录数 $count = $this->count(); //生成翻页类的对象 $pageOb

Atitit.pagging &#160;翻页功能解决方案专题 与 目录大纲 v3 r44.docx

Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx 1.1. 翻页的重要意义1 1.2. Dep废弃文档   paip.js翻页分页pageing组件.txt1 1.3. ---原理1 1.4. -------lib1 1.1.   翻页的重要意义 技术上,商业上,翻页都是一个非常高频率的功能.. 提升高频功能的效率,可以大力提升项目整体效率.. 效率优化的重要原则就是高频功能效率优化 1.2. Dep废弃文档   paip.js翻页分页pageing组件

数据分页 THINKPHP3.2 分页 三种分页方法

数据分页 复制本页链接 opensns 通常在数据查询后都会对数据集进行分页操作,ThinkPHP也提供了分页类来对数据分页提供支持. 下面是数据分页的两种示例. 第一种:利用Page类和limit方法 $User = M('User'); // 实例化User对象 $count = $User->where('status=1')->count();// 查询满足要求的总记录数 $Page = new \Think\Page($count,25);// 实例化分页类 传入总记录数和每页显示的

关于数据源翻页

最近项目要对采集的数据图谱进行翻页,然而数据源类型不一致,不过其本质都是集合. 1 public class MyPage<T> 2 { 3 /// <summary> 4 /// 当前显示页 5 /// </summary> 6 private int _currentIndex; 7 8 public int CurrentIndex 9 { 10 get 11 { 12 return _currentIndex; 13 } 14 } 15 16 /// <s

Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php

Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php 1. 关于翻页有关的几大控件::搜索框控件,显示表格控件,翻页器,数据源控件.. 1 2. 翻页的显示格式:: 1 2.1. 通常ui--"首页"."上页"."下页"."末页",还要有Goto到指定页 1 2.2. 百度式::...<上一页567891011121314下一页 2 2.3. 综合的页面 首