翻页在各种项目中都会用到,在JeeSite开源项目中使用翻页也非常的容易,只要在配置文件中进行就可以就可以使用,系统的默认值为30页。
配置文件在src\main\resources\jeesite.properties文件中,配置如下:
page.pageSize=30
但是这种配置并不能满足所有的分页要求,也就是说在不同的列表中每页的条数是不同的。如果在配置文件中修改分页条数,那么会影响到整个项目的分页,它是一个全局的配置参数,这样就很不方便了。
JeeSite手册的分页
在做项目的时候,由于使用JeeSite的默认页数无法满足项目的需求,因为不可能每个列表页都以30条记录作为一页,因此只能看手册。看手册又没有具体理解如何使用,JeeSite手册中最分页的描述如下:
// 设置分页参数,则分页,如果不设置,则根据条件获取全部user.setPage(page);// 执行分页查询page.setList(userDao.findPage(user));
按照手册的方法简单的尝试了一下,但是没有效果,因此就只能查看分页的源码了。
分页源码
在使用开源项目的时候遇到问题,如果又没有手册,或者手册说明不是特别详细的话,除了在网上找资料外,就只剩下阅读开源项目的源代码了。
在Eclipse下按下Ctrl+Shift+R,输入“page.java”,然后打开该Java文件。看一下Page类的构造方法,代码如下:
/** * 构造方法 * @param request 传递 repage 参数,来记住页码 * @param response 用于设置 Cookie,记住页码 */public Page(HttpServletRequest request, HttpServletResponse response){ this(request, response, -2);}/** * 构造方法 * @param request 传递 repage 参数,来记住页码 * @param response 用于设置 Cookie,记住页码 * @param defaultPageSize 默认分页大小,如果传递 -1 则为不分页,返回所有数据 */public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){ // 设置页码参数(传递repage参数,来记住页码) String no = request.getParameter("pageNo"); if (StringUtils.isNumeric(no)){ CookieUtils.setCookie(response, "pageNo", no); this.setPageNo(Integer.parseInt(no)); }else if (request.getParameter("repage")!=null){ no = CookieUtils.getCookie(request, "pageNo"); if (StringUtils.isNumeric(no)){ this.setPageNo(Integer.parseInt(no)); } } // 设置页面大小参数(传递repage参数,来记住页码大小) String size = request.getParameter("pageSize"); if (StringUtils.isNumeric(size)){ CookieUtils.setCookie(response, "pageSize", size); this.setPageSize(Integer.parseInt(size)); }else if (request.getParameter("repage")!=null){ size = CookieUtils.getCookie(request, "pageSize"); if (StringUtils.isNumeric(size)){ this.setPageSize(Integer.parseInt(size)); } }else if (defaultPageSize != -2){ this.pageSize = defaultPageSize; } // 设置页面分页函数 String funcName = request.getParameter("funcName"); if (StringUtils.isNotBlank(funcName)){ CookieUtils.setCookie(response, "funcName", funcName); this.setFuncName(funcName); }else if (request.getParameter("repage")!=null){ funcName = CookieUtils.getCookie(request, "funcName"); if (StringUtils.isNotBlank(funcName)){ this.setFuncName(funcName); } } // 设置排序参数 String orderBy = request.getParameter("orderBy"); if (StringUtils.isNotBlank(orderBy)){ this.setOrderBy(orderBy); }}/** * 构造方法 * @param pageNo 当前页码 * @param pageSize 分页大小 */public Page(int pageNo, int pageSize) { this(pageNo, pageSize, 0);}/** * 构造方法 * @param pageNo 当前页码 * @param pageSize 分页大小 * @param count 数据条数 */public Page(int pageNo, int pageSize, long count) { this(pageNo, pageSize, count, new ArrayList<T>());}/** * 构造方法 * @param pageNo 当前页码 * @param pageSize 分页大小 * @param count 数据条数 * @param list 本页数据对象列表 */public Page(int pageNo, int pageSize, long count, List<T> list) { this.setCount(count); this.setPageNo(pageNo); this.pageSize = pageSize; this.list = list;}
从源码中可以看出Page类有很多的构造方法,如果需要自定义每页有多少条记录,那么需要使用的构造方法是第二个构造方法,代码如下:
/** * 构造方法 * @param request 传递 repage 参数,来记住页码 * @param response 用于设置 Cookie,记住页码 * @param defaultPageSize 默认分页大小,如果传递 -1 则为不分页,返回所有数据 */public Page(HttpServletRequest request, HttpServletResponse response, int defaultPageSize){ // 设置页码参数(传递repage参数,来记住页码) String no = request.getParameter("pageNo"); if (StringUtils.isNumeric(no)){ CookieUtils.setCookie(response, "pageNo", no); this.setPageNo(Integer.parseInt(no)); }else if (request.getParameter("repage")!=null){ no = CookieUtils.getCookie(request, "pageNo"); if (StringUtils.isNumeric(no)){ this.setPageNo(Integer.parseInt(no)); } }
这个构造方法比系统默认生成代码使用的构造函数多了一个参数——defaultPageSize,这个参数可以用来设置每页的记录数,调用方法如下:
Page<Xxx> p = new Page<Xxx>(request, response, 10);Page<Xxx> page = xxxService.findPage(p, xxx);
JeeSite生成的代码中调用的方法如下:
Page<Xxx> page = xxxService.findPage(new Page<Xxx>(request, response), xxx);
在该源码上下断点,发现这里在实例化Page类时,调用的构造方法如下:
/** * 构造方法 * @param request 传递 repage 参数,来记住页码 * @param response 用于设置 Cookie,记住页码 */public Page(HttpServletRequest request, HttpServletResponse response){ this(request, response, -2);}
在该构造方法中同样调用的是我们刚才的构造方法。
JS翻页
在JeeSite中使用了BootStrap的前端库,使用这个前端库可以很容易的使用“弹出的模态对话框”。使用模态对话框,可能会是一个表单提交一些数据,也可能是其他表单数据列表。使用模态对话框时,如果是数据列表的话,那么也会涉及到列表分页的问题。调用的代码如下:
<div class="control-group"> <label class="control-label">房源信息:</label> <div class="controls"> <input type="text" name="housingName" /> <form:hidden path="housingResourceId" /> <span class="help-inline"><font color="red">*</font> </span><a href="url/Controller..." role="button" class="btn" data-target="#HousingModal" data-toggle="modal">选择</a> </div></div>……<div id="HousingModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h3 id="HousingModalLabel">房源选择</h3> </div> <div class="modal-body" id="HousingBody"></div> <div class="modal-footer"> <button class="btn" data-dismiss="modal" aria-hidden="true">取消</button> <button class="btn btn-primary" id="selectHousingResource">确定</button> </div></div>
当点击上半段代码的“选择”按钮时,通过href指定的URL地址可以将另外一个页面显示到该页面中,然后获取到的数据会在下半段代码的具有属性“modal-body”的div中显示出来。这时,显示的是另外一个页面的内容的,而显示页面的JS代码是无法带过来的。那么,翻页默认调用的JS代码就不能使用了。翻页的代码如下:
function page(n,s){ $("#pageNo").val(n); $("#pageSize").val(s); $("#searchForm").submit(); return false;}
这段代码是就无法调用了,那么要翻页就需要重新定义了,并且,重新定义后的JS代码要在完成分页的情况下将数据仍然显示到“modal-body”中。但是重新定义一个翻页的JS函数如何让页码列表调用呢?
在Page类中,提供了一个非常实用的方法,它可以指定翻页的JS函数,方法如下:
/** * 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。 * @param funcName 默认为page */public void setFuncName(String funcName) { this.funcName = funcName;}
有了这个函数就可以完成翻页了,甚至在多个模态对话框中都使用到需要翻页的列表,也可以解决了。调用方法如下:
Page<Xxx> p = new Page<Xxx>(request, response, 10);p.setFuncName("ctPage");Page<Xxx> page = xxxService.findPage(p, xxx);
这样,生成的分页页码中在调用翻页函数时,就可以调用自定义的翻页函数ctPage()了。定义的翻页方法如下:
function ctPage(n, s) {}
函数体就是自定义的翻页方法了。
我是一个不会Java的JeeSite二次开发者,这些都是我在实际使用JeeSite时所遇到的问题的解决方法。有问题欢迎讨论!!
关于JeeSite相关的其他文章还有:
JeeSite|数据权限应用 - 简书
JeeSite|保存信息修改记录 - 简书
JeeSite|保存信息修改记录续 - 简书
JeeSite|保存信息修改记录封装 - 简书
JeeSite|Excel导入导出 - 简书
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。