• JeeSite | 数据分页与翻页


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

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

      配置文件在srcmain esourcesjeesite.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导入导出


    我的微信公众号:“码农UP2U”

  • 相关阅读:
    JavaScript定时器及相关面试题
    单线程JavaScript
    webpack基础入门
    SQL Server 服务器器信息备份(二)--权限备份
    SQL Server 服务器器信息备份(一)--login新建脚本备份
    Raid与DAN、SAN、NAS基础
    AlwaysOn可用性组功能测试(三)--其他测试
    AlwaysOn可用性组功能测试(二)--SQL Server群集故障转移对AlwaysOn可用性组的影响
    AlwaysOn可用性组功能测试(一)--AlwaysOn故障转移测试
    AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建
  • 原文地址:https://www.cnblogs.com/tosser/p/9011578.html
Copyright © 2020-2023  润新知