分頁模板
1、首先建立一個工具包msq.utils
新建兩個類
NavigationTag.java
package msq.utils;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/**
* 顯示格式:首頁 上一頁 1 2 3 4 5下一頁 尾頁
*/
public class NavigationTag extends TagSupport {
static final long serialVersionUID = 2372405317744358833L;
private String bean = "page";//request 中用於保存Page<E> 對象的變量名,默認爲“page”
private String url = null;//分頁跳轉的url地址,此屬性必須
private int number = 5;//顯示頁碼數量
private int goPage = 1;//顯示要跳轉到的頁碼
@Override
public int doStartTag() throws JspException {
JspWriter writer = pageContext.getOut();
HttpServletRequest request =(HttpServletRequest) pageContext.getRequest();
Page page = (Page) request.getAttribute(bean);
if (page == null)return SKIP_BODY;
url = resolveUrl(url, pageContext);
try {
// 計算總頁數
int pageCount = page.getTotalRecordCount() / page.getPageSize();
if (page.getTotalRecordCount() % page.getPageSize() > 0) {
pageCount++;
}
writer.print("<nav><ul class=\"pagination\">");
//首頁鏈接路徑
String homeUrl = append(url, "currentPage", 1);
homeUrl = append(homeUrl, "pageSize", page.getPageSize());
//末頁鏈接路徑
String backUrl = append(url, "currentPage", pageCount);
backUrl = append(backUrl, "pageSize", page.getPageSize());
// 顯示“首頁 上一頁”按鈕
if (page.getCurrentPage() > 1) {
String preUrl = append(url, "currentPage", page.getCurrentPage() - 1);
preUrl = append(preUrl, "pageSize", page.getPageSize());
writer.print("<li><a href=\"" + homeUrl + "\">" + "首頁</a></li>");
writer.print("<li><a href=\"" + preUrl + "\">" + "上一頁</a></li>");
}
else {
writer.print("<li class=\"disabled\"><a href=\"#\">" + "首頁 </a></li>");
writer.print("<li class=\"disabled\"><a href=\"#\">" + "上一頁 </a></li>");
}
// 顯示當前頁碼的前2頁碼和後兩頁碼
// 若1 則 1 2 3 4 5, 若2 則 1 2 3 4 5, 若3 則1 2 3 4 5,
// 若4 則 2 3 4 5 6 ,若10 則 8 9 10 11 12
int number2=number/2; //總共顯示number頁,分爲前後各一半
int indexPage =1;
if(page.getCurrentPage() - number2 <=0){ //處理前幾頁
indexPage=1; //起始頁碼位置
}else if(pageCount-page.getCurrentPage() <=number2){ //處理尾幾頁
indexPage=pageCount-number+1;//從最後向前number-1頁
if(indexPage<=0)indexPage=1; //防止出現負數頁碼
}else{
indexPage= page.getCurrentPage() - number2; //中間頁碼
}
for (int i= 1;i <= number && indexPage <= pageCount;indexPage++,i++){
if (indexPage == page.getCurrentPage()) {
writer.print("<li class=\"active\"><a href=\"#\">" + indexPage+"<span class=\"sr-only\"></span></a></li>");
continue;
}
String pageUrl = append(url, "currentPage", indexPage);
pageUrl = append(pageUrl, "pageSize", page.getPageSize());
writer.print("<li><a href=\"" + pageUrl + "\">" + indexPage + "</a></li>");
}
// 顯示“下一頁”按鈕
if (page.getCurrentPage() < pageCount) {
String nextUrl = append(url, "currentPage", page.getCurrentPage() + 1);
nextUrl = append(nextUrl, "pageSize", page.getPageSize());
writer.print("<li><a href=\"" + nextUrl + "\">" + "下一頁</a></li>");
writer.print("<li><a href=\"" + backUrl + "\">" + "尾頁</a></li>");
} else {
writer.print("<li class=\"disabled\"><a href=\"#\">" + "下一頁</a></li>");
writer.print("<li class=\"disabled\"><a href=\"#\">" + "尾頁</a></li>");
}
writer.print("<li class=\"disabled\"><a href='javascript:void(0)'>共" + pageCount + "頁" + page.getTotalRecordCount() + "條記錄</a></li>");
writer.print("</nav>");
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
private String append(String url, String key, int value) {
return append(url, key, String.valueOf(value));
}
/**
* 爲url 添加參數對兒
*/
private String append(String url, String key, String value) {
if (url == null || url.trim().length() == 0) {
return "";
}
if (url.indexOf("?") == -1) {
url = url + "?" + key + "=" + value;
} else {
if (url.endsWith("?")) {
url = url + key + "=" + value;
} else {
url = url + "&" + key + "=" + value;
}
}
return url;
}
/**
* 爲url 添加翻頁請求參數
*/
private String resolveUrl(String url,
javax.servlet.jsp.PageContext pageContext) throws JspException {
Map params = pageContext.getRequest().getParameterMap();
for (Object key : params.keySet()) {
if ("currentPage".equals(key) || "pageSize".equals(key)){
continue;
}
Object value = params.get(key);
if (value == null){
continue;
}
if (value.getClass().isArray()) {
url = append(url, key.toString(), ((String[]) value)[0]);
} else if (value instanceof String) {
url = append(url, key.toString(), value.toString());
}
}
return url;
}
public void setUrl(String url) {
this.url = url;
}
public void setNumber(int number) {
this.number = number;
}
}
Page.java
package msq.utils;
import java.util.List;
public class Page<T> {
private Integer totalRecordCount;//總記錄數
private Integer pageSize;//一頁幾條記錄
private Integer currentPage; //當前頁號
private List<T> list;//當前頁的記錄list,傳遞給頁面
public Integer getTotalRecordCount() {
return totalRecordCount;
}
public void setTotalRecordCount(Integer total) {
this.totalRecordCount = total;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer size) {
this.pageSize = size;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer page) {
this.currentPage = page;
}
public List<T> getList() {
return list;
}
public void setList(List<T> rows) {
this.list = rows;
}
}
2、在工程的WebRoot/WEB-INF下新建標籤文件tle
新建標籤commons.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 指定標籤庫的版本號 -->
<tlib-version>1.0</tlib-version>
<!-- 指定JSP的版本號 -->
<jsp-version>1.2</jsp-version>
<!-- 指定標籤庫的名稱 -->
<short-name>common</short-name>
<!-- 指定標籤庫的URI -->
<uri>http://www.nynu.edu.cn/page</uri>
<!-- 指定標籤庫的顯示名稱 -->
<display-name>Common Tag</display-name>
<!-- 指定標籤庫的描述 -->
<description>Common Tag library</description>
<!-- 註冊一個自定義標籤 -->
<tag>
<!-- 指定註冊的自定義標籤名稱 -->
<name>page</name>
<!-- 指定自定義標籤的標籤處理器類 -->
<tag-class>msq.utils.NavigationTag</tag-class>
<!-- 指定標籤體類型 -->
<body-content>JSP</body-content>
<!-- 描述 -->
<description>create navigation for paging</description>
<!-- 指定標籤中的屬性 -->
<attribute>
<!-- 指定屬性名稱 -->
<name>url</name>
<!-- 該屬性爲true時表示其指定是屬性爲必須屬性 -->
<required>true</required>
<!-- 該屬性用於指定能不能使用表達式來動態指定數據,爲true時表示可以 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>number</name>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、在需要加分頁效果的頁面前加標籤註解
<%@ taglib prefix="mypage" uri="http://www.nynu.edu.cn/page" %>
4、在合適的位置放上分頁效果圖
url="與後臺連接到頁面地址"
<mypage:page url="#" ></mypage:page>
5、新建一個類CustomPo,當前類繼承CustomPo類
package msq.po;
public class CustomPo {
Integer start;
Integer pageSize;
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
6、在後臺的查找類中依次加上兩個參數
controller包
@RequestParam(name="currentPage",defaultValue="1")Integer currentPage,//起始頁
@RequestParam(name="PageSize",defaultValue="10")Integer PageSize,//頁大小
將原先用來儲存數據的List<T> 改成 Page<T>
在查詢的基礎上分頁只需要再加一個參數即可
7、更改對應的sql語句 ,加上限制條件
<!-- 查找的分頁 -->
<sql id="sqlLimit">
<if test="start!=null and pageSize!=null">
limit #{start},#{pageSize}
</if>
</sql>