一站式分頁解決方案:後臺分頁PageHelper使用,頁面分頁,非同步ajax分頁pageutils.js
之前做分頁功能一直都沒有找到一個比較合適的完整的方式,現整理下完整的流程.給大家展示一個完整的流程
專案:springMVC+mybatis+mysql
我們需要使用到的外掛主要有:
PageHelper:主要用於後臺分頁
以及pageUtils.js指令碼,用於前臺分頁
---------------------------------------------------------------------
首先說一下後臺的分頁,有關於pagehelper的使用以及原始碼,請自行百度,
https://github.com/pagehelper/Mybatis-PageHelper
pageUtils.js原始碼
/** * * * 呼叫:$(".nav.page").initPage(10,1,10); 或 $(".nav.page").initPage(10,1,10,targetForm); * * 備註:第一個引數是總頁數,第二個引數是當前頁數,第三個引數是每頁條數,第四個引數是提交的目標form * */ $.fn.extend({ targetForm:null, totalPage : 0, _totalPage:0, _callback:null, _objPage:null, initPage : function(totalPage,currentPage,pageSize,targetForm) { var limitSize = 10;//最多展示10個分頁的按鈕顯示 var tips_html = $(this).html(); if (totalPage == null || totalPage == undefined || totalPage == "" || totalPage=="null" || totalPage == 0) { $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } $.fn.totalPage = parseInt(totalPage); $.fn.targetForm = $("#"+targetForm); if (currentPage == null || currentPage == undefined || currentPage == "" || currentPage == "null" || currentPage == 0) { $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } currentPage = parseInt(currentPage); if (pageSize == null || pageSize == undefined || pageSize == "" || pageSize == "null" || pageSize == 0){ $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } pageSize = parseInt(pageSize); var pageHtml = "每頁"+pageSize+"條 ,共"+totalPage+"頁 "; /** * 當前是第一頁,上一頁則是灰的 */ if (currentPage <= 1) { pageHtml += '<a class="no" href="javascript:;">上一頁</a>'; } else { pageHtml += '<a href="javascript:$.fn.goPage('+(currentPage-1)+');">上一頁</a>'; } if (totalPage <= limitSize) { for (var i = 1; i <= totalPage; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goPage('+i+');">' + i + '</a>'; } }else if(currentPage <= limitSize / 2 + 1){ for (var i = 1; i <= limitSize; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goPage('+i+');">' + i + '</a>'; } }else if(currentPage+limitSize / 2 >totalPage){ for (var i = totalPage-9; i <= totalPage; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goPage('+i+');">' + i + '</a>'; } }else if (currentPage > limitSize / 2 + 1) { for (var i = currentPage - limitSize / 2; i <= currentPage + (limitSize / 2 - 1); i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goPage('+i+');">' + i + '</a>'; } } /** * 當前是最後一頁,下一頁則是灰的 */ if (currentPage == totalPage) { pageHtml += '<a class="no" href="javascript:;">下一頁</a>'; } else { pageHtml += '<a href="javascript:$.fn.goPage('+(currentPage+1)+');">下一頁</a>'; } pageHtml += ' 轉到:<cite class="wsc-form-cite a text"><input type="text" id="page" name="page" value="" inited="true" ></cite> 頁'; pageHtml += '<a href="javascript:;" class="_jump_page_link">確定</a>'; $(this).html(pageHtml); $("._jump_page_link").on("click",function(){ //var _page = $(this).prev().val(); var _page = $("#page").val(); $.fn.goPage(_page); }); }, /** * 跳轉到第幾頁 */ goPage:function(nextPage){ if(!(/^\d+$/.test(nextPage)) || parseInt(nextPage)<=0 || parseInt(nextPage)>$.fn.totalPage){ alert("非法的跳轉頁數"); return; } if($.fn.targetForm.length){ if($('[name="pageNum"]').length==0){ $("<input type='hidden' name='pageNum' value='"+nextPage+"' />").appendTo($.fn.targetForm); }else{ $('[name="pageNum"]').eq(0).attr("value",nextPage); } $.fn.targetForm.submit(); }else{ var _pageUrl = window.location.href; var params = _pageUrl.split("?"); window.location.href = params[0]+"?pageNum="+nextPage; } }, /** * ajax分頁回撥 */ initAjaxPage : function(callback) { $.fn._callback = callback; $.fn._objPage = $(this); callback(1,$(this)); }, /** * 渲染分頁 */ buildPage:function(pageNum,pageSize,total){ var limitSize = 10;//最多展示10個分頁的按鈕顯示 var tips_html = $(this).html(); if (total == null || total == undefined || total == "" || total=="null" || total == 0) { $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } $.fn._totalPage = parseInt(total); var totalPage = parseInt(total); if (pageNum == null || pageNum == undefined || pageNum == "" || pageNum == "null" || pageNum == 0) { $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } var currentPage = parseInt(pageNum); if (pageSize == null || pageSize == undefined || pageSize == "" || pageSize == "null" || pageSize == 0){ $(this).html("暫無分頁記錄"); if(tips_html!=""){ $(this).html(tips_html).css({'float':'none','text-align':'center','height':'auto'}); } return; } var pageSize = parseInt(pageSize); var pageHtml = "每頁"+pageSize+"條 ,共"+total+"頁 "; /** * 當前是第一頁,上一頁則是灰的 */ if (currentPage <= 1) { pageHtml += '<a class="no" href="javascript:;">上一頁</a>'; } else { pageHtml += '<a href="javascript:$.fn.goAjaxPage('+(currentPage-1)+');">上一頁</a>'; } if (totalPage <= limitSize) { for (var i = 1; i <= totalPage; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goAjaxPage('+i+');">' + i + '</a>'; } }else if(currentPage <= limitSize / 2 + 1){ for (var i = 1; i <= limitSize; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goAjaxPage('+i+');">' + i + '</a>'; } }else if(currentPage+limitSize / 2 >totalPage){ for (var i = totalPage-9; i <= totalPage; i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goAjaxPage('+i+');">' + i + '</a>'; } }else if (currentPage > limitSize / 2 + 1) { for (var i = currentPage - limitSize / 2; i <= currentPage + (limitSize / 2 - 1); i++) { pageHtml += '<a '; /** *選中當前頁** */ if (currentPage == i) { pageHtml += ' class="active" '; } pageHtml += ' href="javascript:$.fn.goAjaxPage('+i+');">' + i + '</a>'; } } /** * 當前是最後一頁,下一頁則是灰的 */ if (currentPage == totalPage) { pageHtml += '<a class="no" href="javascript:;">下一頁</a>'; } else { pageHtml += '<a href="javascript:$.fn.goAjaxPage('+(currentPage+1)+');">下一頁</a>'; } pageHtml += ' 轉到:<input type="text" name="page" value="" inited="true"> 頁'; pageHtml += '<a href="javascript:;" class="_jump_page_link">確定</a>'; $(this).html(pageHtml); $("._jump_page_link").on("click",function(){ var _page = $(this).prev().val(); $.fn.goAjaxPage(_page); }); }, /** * 以ajax的方式跳轉到第幾頁 */ goAjaxPage:function(nextPage){ if(!(/^\d+$/.test(nextPage)) || parseInt(nextPage)<=0 || parseInt(nextPage)>$.fn._totalPage){ alert("非法的跳轉頁數"); return; } $.fn._callback(parseInt(nextPage),$.fn._objPage); } });
使用pagehelper需要配置檔案配置
(datasource是資料庫連線的一些配置)
<!-- myBatis檔案 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自動掃描對映檔案 --> <property name="mapperLocations"> <array> <value>classpath:mapping/**/*.xml</value> </array> </property> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageHelper"> <property name="properties"> <value> dialect=mysql </value> </property> </bean> </array> </property> </bean>
也可以參考作者提供的mybatis配置檔案例項,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="isea533.mybatis.model"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="hsqldb"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:basetest" />
<property name="username" value="sa" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/CountryMapper.xml" />
</mappers>
</configuration
在確保專案的確可以正確引入pagehelper外掛,以及js檔案之後,我們開始整體的介紹
後臺的分頁使用:
只需要在呼叫前執行startPage方法,他會處理緊接下來的第一條執行sql語句的方法
說白了,就是不管是mapper介面還是service方法,只要他是執行sql功能的方法,緊跟著startPage就可以實現分頁(其實就是執行sql語句的攔截時候加了一個limit用以返回結果)
PageHelper.startPage(pageNum, Constant.PAGE_FIVE_NUM);
courseList =courseService.selectParticCourse(courseEntity);
PageInfo<CourseEntity> participantCoursePageInfo = new PageInfo<CourseEntity>(courseList);
pageInfo可以用來封裝頁面的資訊,頁面大小,每頁個數
只需要把list以及pageInfo資訊傳送到頁面即可
後臺的分頁已經搞定了,只要配置好,使用起來很簡單.
此時,你應該已經確保java後臺可以正確獲取到你查詢到的列表了,接下來看頁面的操作
1,如果是單頁面的分頁,就是不需要非同步載入的
你需要引入js也就是上面那一段,直接copy即可使用,無需修改
而且,你的頁面應該有有關分頁資訊的div,如:
<!--分頁-->
<div class="nav page text align-right margin-top-25 margin-bottom-30">
</div>
沒有請自行新增
同時你還需要一個空的div用於存放生成的拼接後的html
<div id="browerCourseDiv">
</div>
換句話說,你的頁面至少要有
<div id="browerCourseDiv">
</div>
<!-- 瀏覽的 -->
<div class="nav page browerNav text align-right padding-top-25 padding-bottom-30" id="browerNavigation">
</div>
這幾行程式碼,就已經具備了可以承載分頁資訊的基礎程式碼
$(document).ready(function(){
//分頁
$(function(){
$(".nav.page").initPage('${result.pages }','${result.pageNum}','${result.pageSize}','');
});
});
你需要在頁面開始的時候初始化分頁資訊,這樣在頁面載入後,就會執行方法向後臺請求資料,請求到的資料,就會非同步載入到這個指定id的div內
result就是你後臺通過request.setAttribute或者map.put到頁面的分頁資訊資料,具體請檢視pageInfo類
這樣子就可以直接具備分頁資訊了
非常的簡單就可以做到了
2,如果是需要非同步載入的
可以再頁面載入後,就自動呼叫function
..........
<script>
$(function(){
initCourseList();
})
</script>
</head>
函式的框架如下
//初始化tab頁面列表
function initCourseList(tabId){//tabId是引數,你可以傳遞也可以不傳遞,也可以在此處傳遞多個引數
//自定義的一些引數,如果需要的話
function initPage(pageNum,obj){
var loadPageCount = 0;//載入頁面次數
var _pageNum = 1;
_pageNum = pageNum;//這個一定要有的,向後臺請求的時候需要帶著頁碼
var _html='';
$.ajax({
type: "POST",
url: root+"/web/userCenter/xxxxxxx.do",
data: {
"pageNum" : _pageNum,
"tabId":tabId,
"userId":userId
},
async:false,
success: function(result){
loadPageCount++;
if(result.courseList.length>0){
$.each(result.courseList, function(index, Item){
_html += '<div class="fabu_a list">'
+'<ul>'
+'<li class="fabu_a_title">'
<span style="white-space:pre"> </span>...........
<span style="white-space:pre"> </span>//此處根據你的返回列表資料,動態的拼接成一段html<span style="white-space:pre"> </span>..........
});
if(result.pageInfo.pageNum){
$(obj).buildPage(result.pageInfo.pageNum,result.pageInfo.pageSize,result.pageInfo.pages);
};
}else{
_html='';
//如果沒有返回資料,或者列表為空,你可能需要有一些提示資訊,在此處拼接
$(obj).html("");
$(obj).buildPage(0,10,0);
}
<span style="white-space:pre"> </span>//這個是把生成的html動態的載入到這個空的div內
<span style="white-space:pre"> </span>$("#browerCourseDiv").html(_html);
},
error:function()
{
alert("出錯");
}
});
};
}
後臺在處理這個請求的時候,如果有頁碼資訊,設定成頁碼指定的值,如果沒有的話,就是預設第一頁了
PageHelper.startPage(pageNum, Constant.PAGE_FIVE_NUM);
這樣子就完成了這樣一個過程
簡單的說就是:
後臺有根據pagehelper處理分頁,把列表以及頁面的資訊(頁面大小,當前頁碼等)返回到頁面
頁面只需要
引入js檔案
有一個分頁div以及一個用於存放拼接後的html的空的div
頁面載入後就執行方法,用於載入資料
這樣就可以了