因为项目中之前的模块用的分页插件是Datatables,很方便,但是新做的模块表格中的布局有变化,Datatables插件满足不了了。为了风格的统一,同时也不希望查询参数再传递回显在页面上,所以就采用局部刷新分页的实现方案。
实现方案是这样的,将表格部分提取出来,用来作为页面局部刷新的部分,文件名为list-data.vm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< table class = "table text-center table_acolor" >
< thead >
< tr >
< th width = "16%" >userName</ th >
< th width = "24%" >age</ th >
</ tr >
</ thead >
< tbody >
#foreach($data in $!{page.list})
< tr >
< td width = "16%" >$!{data.userName}</ td >
< td width = "24%" >$!{data.sex}</ td >
</ tr >
#end
</ tbody >
</ table >
#pageNation($!{page})
|
其中的pageNation是定义的一个宏(macro),用来做底部的分页条和分页条的显示逻辑。page对象是ajax请求返回的分页数据。每一次ajax请求,查询出分页数据,将数据放入list-data.vm所对应的视图的ModelAndView对象,然后返回ModelAndView对象,将这一部分追加到主页面表格所在的部分。
macro部分如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#macro(pageNation $data)
#if(!$data.list.size() or $data.list.size() == 0)
< div class = "row DTTTFooter no-padding" style = "height:40px; line-height:40px; text-align:center; font-size:14px;" >
未查询到记录
</ div >
#end
#if($data.list.size() and $data.list.size() > 0)
< div id = "activityTable_info" class = "dataTables_info" role = "status" aria-live = "polite" >显示第 $!{data.startRow} 至 $!{data.endRow} 项结果,共 $!{data.total}项</ div >
< div id = "pagination" class = "dataTables_paginate paging_full_numbers" >
#set($prevPage = ${data.prePage})
#set($nextnPage = ${data.nextPage})
< a #if($data.pageNum ==1) class = "paginate_button disabled" disabled = "disabled" href = "javascript:void(0)" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow"
#else class = "paginate_button" pageNum = "1" href = "javascript:goPage(1)" rel = "external nofollow"
#end style = "margin-left: 2px;"
>首页</ a >
< a #if($data.pageNum ==1) class = "paginate_button disabled" disabled = "disabled" href = "javascript:void(0)" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow"
#else class = "paginate_button" pageNum = "$prevPage" href = "javascript:goPage($prevPage)" rel = "external nofollow"
#end style = "margin-left: 2px;"
> 上页 </ a >
#set($temp = ${data.pageNum} - 1)
#set($numbers = $!{pageUtil.numbers($temp, $data.pages)})
#foreach($foo in $numbers)
#if($foo == -999)
< span >…</ span >
#else
< a class = "paginate_button #if($foo==${data.pageNum}) current #end" pageNum = "$foo" #if($foo!=${data.pageNum}) href = "javascript:goPage($foo)" rel = "external nofollow" #end style = "margin-left: 2px;"
> $foo </ a >
#end
#end
< a
#if($data.pageNum == $data.pages) class = "paginate_button disabled" disabled = "disabled"
#else class = "paginate_button" pageNum = "$nextnPage" href = "javascript:goPage($nextnPage)" rel = "external nofollow"
#end style = "margin-left: 2px;"
> 下页
< a
#if($data.pageNum == $data.pages)
class = "paginate_button disabled" disabled = "disabled" href = "javascript:void(0)" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow"
#else
class = "paginate_button" pageNum = "$data.pages" href = "javascript:goPage($data.pages)" rel = "external nofollow"
#end
>末页</ a >
到第
< input id = "changePage" class = "margin text-center" type = "text" maxpage = "10" style = "height:28px;line-height:28px;width:40px;" >
页
< a id = "dataTable-btn" class = "btn btn-default shiny" href = "javascript:jumpPage($data.pages);" rel = "external nofollow" style = "margin-bottom:5px" >确认</ a >
#end
</ div >
< div p_sortinfo = "$!{data.orderBy}" p_isFirst=$!{data.isFirst} p_isLast=$!{data.isLast} p_currentpagenum = "$!{data.pageNum}" p_totalsize = "$!{data.total}" p_endrow = "$!{data.endRow}" p_totalpagesnum = "$!{data.pages}" p_pagesize = "$!{data.pageSize}" p_startrow = "$!{data.startRow}" style = "display:none" class = "paginator" ></ div >
#end
|
pageUtil是写的velocity toolbox的一个工具类,用来仿Datatables分页条的分页页码显示的逻辑:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class PageUtil {
public static LinkedList< Integer > range(Integer len,Integer start) {
LinkedList< Integer > out = new LinkedList<>();
Integer end;
if (start == null ) {
start = 0;
end = len;
}
else {
end = start;
start = len;
}
for (int i=start ; i< end ; i++ ) {
out.add(i);
}
return out;
}
public static List<Integer> numbers (Integer page,Integer pages) {
LinkedList< Integer > numbers = new LinkedList<>();
Integer buttons = 7;
Integer half = buttons / 2;
if (pages <= buttons ) {
numbers = range( 0, pages );
}
else if ( page <= half ) {
numbers = range( 0, buttons-2 );
numbers.add(-1000);
numbers.add( pages-1 );
}
else if ( page >= pages - 1 - half ) {
numbers = range( pages-(buttons-2), pages );
numbers.addFirst(-1000 ); //向头放
numbers.addFirst(0 );
}
else {
numbers = range( page-1, page+2 );
numbers.add( -1000 );
numbers.add( pages-1 );
numbers.addFirst(-1000 );
numbers.addFirst(0 );
}
List< Integer > res = new ArrayList<>();
for (Integer integer : numbers) {
res.add(integer+1);
}
return res;
}
}
|
而这段逻辑是从Datatables的js源码中找到的,我将其转化为java代码。Datatables源码的该部分代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
function _numbers ( page, pages ) {
var
numbers = [],
buttons = extPagination.numbers_length,
half = Math.floor( buttons / 2 ),
i = 1;
if ( pages <= buttons ) {
numbers = _range( 0, pages );
}
else if ( page <= half ) {
numbers = _range( 0, buttons-2 );
numbers.push( 'ellipsis' );
numbers.push( pages-1 );
}
else if ( page >= pages - 1 - half ) {
numbers = _range( pages-(buttons-2), pages );
numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
numbers.splice( 0, 0, 0 );
}
else {
numbers = _range( page-1, page+2 );
numbers.push( 'ellipsis' );
numbers.push( pages-1 );
numbers.splice( 0, 0, 'ellipsis' );
numbers.splice( 0, 0, 0 );
}
numbers.DT_el = 'span';
return numbers;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var _range = function ( len, start )
{
var out = [];
var end;
if ( start === undefined ) {
start = 0;
end = len;
}
else {
end = start;
start = len;
}
for ( var i=start ; i<end ; i++ ) {
out.push( i );
}
return out;
};
|
我将页面的ajax请求分页的数据做了封装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/**
*
*/
//macro分页跳页调用方法,调用的页面需要提供goPage(redirectpage)方法
function jumpPage(totalPage) {
var redirectpage = $("#changePage").val();
if(redirectpage == ""){
$("#changePage").focus();
}else{
var rex = /^\d+$/;
if(!rex.test(redirectpage)){
alert("页码输入有误,只能输入不大于总页数的正整数");
}else{
var pageNo = parseInt(redirectpage);
if(pageNo <= 0 || pageNo > totalPage){
alert("页码输入有误,只能输入不大于总页数的正整数");
}else{
goPage(redirectpage)
}
}
}
}
$.fn.pagenation = function(options) {
//默认参数
var defaults={
url:"",
data:{},//参数
pageNo:1,//页码
pageSize:10,//页面大小
pageSuccess:{}//分页数据成功返回的回调函数
}
var _self = $(this);
options = $.extend(defaults,options);
var ajaxData = {
"pageNo":options.pageNo,
"pageSize":options.pageSize
};
this.fnDraw = function(pageNo) {
if (typeof (options.data) == 'function') {
ajaxData = options.data(ajaxData);
} else {
ajaxData = $.extend(ajaxData,options.data);
}
if (pageNo != undefined) {
ajaxData['pageNo'] = pageNo;
}
$.ajax({
url: options.url,
async: false,
type:"post",
data: ajaxData,
success: function(result,code,dd) {
_self.html(result);
if (typeof options.pageSuccess == 'function') {
options.pageSuccess();
}
},
error:function(){
alert("操作失败");
}
});
};
this.init = function() {
this.fnDraw(1);
return this;
}
return this;
}
|
在主页面调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<!DOCTYPE html>
< html >
< head >
< meta charset = "UTF-8" >
< title >Insert title here</ title >
#set($ctx = ${request.getContextPath()})
< link rel = "stylesheet" type = "text/css" href = "$ctx/assets/js/dataTables/jquery.dataTables.min.css" rel = "external nofollow" />
< link rel = "stylesheet" type = "text/css" href = "$ctx/assets/js/dataTables/css/jquery.dataTables_theme.css" rel = "external nofollow" />
< script type = "text/javascript" src = "$ctx/assets/js/jquery-1.11.2.min.js" ></ script >
< script type = "text/javascript" src = "$ctx/assets/js/macro.pagination.js" ></ script >
</ head >
< body >
< div class = "dataTables_wrapper" id = "pageDiv" >
</ div >
< script type = "text/javascript" >
var pagenation = $("#pageDiv").pagenation({
url:"${ctx}/listData.do",
pageSize:20,
data:function (data) {
$("#searchForm [name]").each(function(i, n){
data[$(n).attr('name')] = n.value;
});
return data;
},
pageSuccess:function(){
}
}).init();
function goPage(pageNo) {
pagenation.fnDraw(pageNo);
}
</ script >
</ body >
</ html >
|
其中pageSuccess参数是用来在ajax返回数据成功后,需要做的一些操作。
这里说的也不太明白,附上码云的git地址:http://git.oschina.net/ivwpw/pagenation
其中并没有做从数据库插数据的部分,只是在Controller中模拟了页面需要的数据。
以上这篇springMVC+velocity实现仿Datatables局部刷新分页方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/kusedexingfu/article/details/67641080