springMVC+velocity实现仿Datatables局部刷新分页方法

因为项目中之前的模块用的分页插件是Datatables,很方便,但是新做的模块表格中的布局有变化,Datatables插件满足不了了。为了风格的统一,同时也不希望查询参数再传递回显在页面上,所以就采用局部刷新分页的实现方案。

实现方案是这样的,将表格部分提取出来,用来作为页面局部刷新的部分,文件名为list-data.vm

<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部分如下:

#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分页条的分页页码显示的逻辑:

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源码的该部分代码如下

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;
 } 
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请求分页的数据做了封装:

/**
 *
 */
//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; 

} 

在主页面调用:

<!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局部刷新分页方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文章:

  • SpringMVC+MyBatis分页(最新)
  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例
  • Java简单实现SpringMVC+MyBatis分页插件
(0)

相关推荐

  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例

    本博客介绍基于Spring Data这款orm框架加上 Jquery.pagination插件实现的分页功能. 本博客是基于一款正在开发中的github开源项目的,项目代码地址:https://github.com/u014427391/jeeplatform 欢迎star(收藏)或者可以下载去学习,还在开发- 介绍一下Spring Data框架 spring Data : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储. 下面给出SpringData 项目所支

  • Java简单实现SpringMVC+MyBatis分页插件

    1.封装分页Page类 package com.framework.common.page.impl; import java.io.Serializable; import com.framework.common.page.IPage; /** * * * */ public abstract class BasePage implements IPage, Serializable { /** * */ private static final long serialVersionUID

  • SpringMVC+MyBatis分页(最新)

    目前主流的Web MVC框架,除了Struts这个主力 外,还有Spring MVC,主要是由于Spring MVC配置比较简单,使用起来也十分明了,非常灵活,与Spring 集成较好,对RESTful API的支持也比struts要好. MyBatis是ibatis的升级版,作为hibernate的老对手,它 是一个可以自定义SQL.存储过程和高级映射的持久层框架. 与hibernate的主要区别就是mybatis是半自动化的,而hibernate是全自动的,所以当应用需求越来越复杂的时候,自

  • springMVC+velocity实现仿Datatables局部刷新分页方法

    因为项目中之前的模块用的分页插件是Datatables,很方便,但是新做的模块表格中的布局有变化,Datatables插件满足不了了.为了风格的统一,同时也不希望查询参数再传递回显在页面上,所以就采用局部刷新分页的实现方案. 实现方案是这样的,将表格部分提取出来,用来作为页面局部刷新的部分,文件名为list-data.vm <table class="table text-center table_acolor"> <thead> <tr> <

  • 基于BootStrap实现局部刷新分页实例代码

    在之前的工作中我用的分页有很多,一直不牢固,所以自己用起来也不是很顺手,这是一个局部刷新的分页,我试了很多,本想用mvcPager来做局部刷新,但是考虑到成本太高,放弃了,先来总结一下基于bootstrap的分页吧,便于自己以后使用 开源地址 https://github.com/lyonlai/bootstrap-paginator 首先引用 Jquery bootstrap.min.js bootstrap-paginator.min.js 控制器代码 [AuthorizationCodeA

  • vue中实现页面刷新以及局部刷新的方法

    目录 一.全页面刷新 二.局部刷新 三.应用场景 总结 一.全页面刷新 1.修改 App.vue,代码如下: <template> <div id="app"> <router-view v-if="isRouterAlive" /> </div> </template> <script> export default { name: 'App', provide() { // 父组件中返回要传

  • .net验证码的刷新或局部刷新的方法实例

    以验证码的刷新为例 复制代码 代码如下: <form method="post" name="login" action="">  验 证 码:<input type="text" name="code" class="text code"  /> <img src="code.php" id="code" />

  • Ajax实现局部刷新的方法实例

    前言 最近复习了一下jQuery的一些内容,特此整理一下一些能用的得到的知识点,以前才学jQuery的时候压根就没有注意到那么多的细节,另外最近一直都在整理前端的一些工作中学到的小经验,大概还会有十篇左右的内容,就会慢慢开始整理后端,框架,以及数据库的一些小知识点 一. Ajax是什么? 概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1.异步和同步:客户端和服务器端相互通信的基础上 -> 客户端必须等待服务器端的响应.在等待的期间

  • JavaScript中iframe实现局部刷新的几种方法汇总

    Iframe是一种嵌入网页的框架形式,Web页面可以通过更改嵌入的部分,达到部分内容刷新. Iframe的用法与普通的标签元素DIV类似,可以指定在页面中嵌入的位置.颜色.界面布局等 一.iframe实现局部刷新方法一 <script type="text/javascript"> $(function(){ $("#a1").click(function(){ var name= $(this).attr("name"); $(&q

  • Flutter StreamBuilder实现局部刷新实例详解

    目录 前言 StreamBuilder 简介 StreamBuilder的实际应用 总结 前言 在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致内部组件被全量刷新,造成不必要的性能消耗.出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作. 包括Provider.ValueNotifier和StatefulBuilder等在内的技术方案,都能够帮助我们实现Flutter局部刷新的需求.有兴趣了解StatefulBuild

  • Flutter StatefulBuilder实现局部刷新实例详解

    目录 前言 页面的全量刷新 StatefulBuilder简介 StatefulBuilder的实际应用 总结 前言 flutter项目中,在页面数据较多的情况下使用全量刷新对性能消耗较大且容易出现短暂白屏的现象,出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新操作. GlobalKey.ValueNotifier和StreamBuilder等技术方案都可以实现Flutter页面的局部刷新,本文主要记录的是通过StatefulBuilder组件来实现局部刷新的方法. 页

  • Flutter StreamBuilder组件实现局部刷新示例讲解

    目录 一.前言 二.StreamBuilder 简介 三.StreamBuilder的实际应用 总结 一.前言 在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致内部组件被全量刷新,造成不必要的性能消耗.出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作.包括Provider.ValueNotifier和StatefulBuilder等在内的技术方案,都能够帮助我们实现Flutter局部刷新的需求. 本文记录的是通过St

  • ASP.NET使用ajax实现分页局部刷新页面功能

    listview列表实现分页是非常容易的.ListView分页是非常简单的,加上一个DataPager控件,把ListView的ID赋予就可以了.最开始我就是这么写的.(网上有人说这样是伪分页?) <asp:ListView ID="newBlogItems" runat="server" DataSourceID="AccessDataSource1" ViewStateMode="Disabled"> <

随机推荐