JeeSite数据分页与翻页
本文章介绍的是JeeSite开源项目二次开发时的一些笔记,对于没有使用过JeeSite的可以不用往下看了,因为下面的代码是跟JeeSite二次开发相关的代码,不做JeeSite的二次开发,以下代码对您无用,在这里友情提醒,避免浪费您宝贵的时间。
翻页功能在各种项目中都会用到,在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生成的代码中调用的方法如下(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);
}
在该构造方法中同样调用的是Page.java中第二个构造方法。
JS翻页
在JeeSite中使用了BootStrap的前端库,使用这个前端库可以很容易的使用“弹出的模态对话框”。使用模态对话框,可能会是一个表单提交一些数据,也可能是其他表单数据列表。使用模态对话框时,如果是数据列表的话,那么也会涉及到列表分页的问题。调用的代码如下:
<div class="control-group">
<label class="control-label">个人信息:</label>
<div class="controls">
<input type="text" name="personName" />
<form:hidden path="personId" />
<span class="help-inline"><font color="red">*</font> </span><a
href="url/Controller..."
role="button" class="btn" data-target="#PersonModal"
data-toggle="modal">选择</a>
</div>
</div>
……
<div id="PersonModal" 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="PersonModalLabel">选择人员</h3>
</div>
<div class="modal-body" id="PersonBody"></div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">取消</button>
<button class="btn btn-primary" id="selectPerson">确定</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 hrPage(n, s) {
$.ajax({
type: "POST",
url:"${ctx}/...", // 具体的地址省略
data:{pageNo:n, pageSize:s},
async: false,
error: function(request) { },
success: function(data) {
$('#PersonBody').empty();
$('#PersonBody').append(data);
}
});
}
函数体就是自定义的翻页方法了。
这些都是我在实际使用JeeSite时所遇到的问题的解决方法。有问题欢迎讨论!!
关于JeeSite的另一篇笔记是:JeeSite中Excel导入导出
我的微信公众号:“码农UP2U”
JeeSite数据分页与翻页的更多相关文章
- js + jquery 实现分页区翻页
简单来说,情况是这样的,假如做好了对动漫每一集进行分页,如下图: 但当分页太多就会变得不能看,而且前后箭头也不能只是摆设. 想要得到类似这样效果: 网上搜了一会翻页相关的库没什么效果,也不太合适自己的 ...
- vue2.X简单翻页/分页
由于业务需要 公司把后台所有数据一次性给前端,数据过多,所以前端需要做一些分页的处理,比较简单的翻页. html代码 <table class="three_td"> ...
- 织梦DEDECMS网站首页如何实现分页翻页
织梦DEDECMS模板网站首页如何实现首页分页和翻页 方法如下:(三种方法,自己选择一种来实现分页吧) 第一种:调用ajax和参数的(不推荐)1.必须在DEDE首页模板中的<head>&l ...
- PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序
商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...
- 数据分页 THINKPHP3.2 分页 三种分页方法
数据分页 复制本页链接 opensns 通常在数据查询后都会对数据集进行分页操作,ThinkPHP也提供了分页类来对数据分页提供支持. 下面是数据分页的两种示例. 第一种:利用Page类和limit方 ...
- post表单翻页保存搜索条件
问题:搜索条件下的数据,进行翻页行为后,搜索条件丢失 1.搜索表单 2.翻页 解决:既然点击页面跳转的a标签使用的方法是GET,而点击“搜索”按钮使用的方法是POST,那么可以让点击a标签实际上就是提 ...
- Atitit.pagging 翻页功能解决方案专题 与 目录大纲 v3 r44.docx
Atitit.pagging 翻页功能解决方案专题 与 目录大纲 v3 r44.docx 1.1. 翻页的重要意义1 1.2. Dep废弃文档 paip.js翻页分页pageing组件.txt1 ...
- iOS:UIPageViewController翻页控制器控件详细介绍
翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页 ...
- 翻页组件page-flip调用问题
翻页组件重新调用解决方案 翻页组件:page-flip import { PageFlip } from 'page-flip' pagefile() { //绘制翻页 this.pageFlip = ...
随机推荐
- UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数, ...
- 自己动手写hibernate
这篇文章 可作为北京尚学堂 hibernate的学习笔记 再学习hibernate之前 得有一点反射的基础知识 package com.bjsxt.hibernate; public class St ...
- Oracle PL/SQL Articles
我是搬运工....http://www.oracle-base.com/articles/plsql/articles-plsql.php Oracle 8i Oracle 9i Oracle 10g ...
- oracle的rownum与having用法 去除重复 在重复情况用rownum
一般来说,大家会用rownum,也就是伪列来指定要显示多条数据, 比如 select linename from aced where rownum<3 但是,大家注意,如果取出来的数据有重复数 ...
- git简介及使用方法
一.git简介及安装1.git简介 Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持, ...
- Html5的学习之旅-Html5的web Storage概述(16)
在html5中除了canvas,另外一个非常重要的功能是客户端本地存储web storage,之前可以在用户端Cookies存贮用户名等信息,后来发现Cookies存储存在以下问题: 大小:Cooki ...
- CSDN_投票评选_JS_分析脚本
作者: 铁锚 日期: 2013年12月31日 如题, 使用说明如下: 1. 原创图书 http://special.csdn.net/book2013/yc.html 2. 引进图书 http://s ...
- 解决Plugin is too old,please update to a more recent version,or set ANDROID_DAILY_OVERRIDE..
今天遇到了很诡异的事情. 昨天晚上还好好的工程今天就挂了,提示如下错误: Plugin is too old,please update to a more recent version,or set ...
- 《java入门第一季》之面向对象(抽象类到底多抽象)
/* 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须被称为是抽象类. 抽象类的特点: ...
- Unity3D学习笔记(三)Unity的C#基础
在C#脚本中,必须显式的继承MonoBehaviour类需要注意的是,在创建C#脚本时,脚本名应尽量符合C#命名规则,以字母或下划线开头,因为类名的默认跟随脚本名.C#声明变量的方式和C++和Java ...