jsp定製分頁標籤

alexanderkenndy發表於2015-01-03

在專案開發過程中需要展示報表,然而一般報表的內容都比較長,需要做分頁處理,手動寫的分頁倒也可以,但是不能每個頁面都寫一套邏輯,即便是用<jsp:include 感覺也是很煩,變動的東西太多,所以索性定製一個分頁的tag 比較方便,下面就給大家講解一下分頁標籤的製作過程。

1.環境準備

製作jsp分頁標籤需要依賴jsp-api的jar,我使用的是jsp-api2.0.jar,當然如果是使用eclipse的動態工程,那麼這個jar也是存在於tomcat裡面的,注意釋出的時候不要衝突就好了

2.分頁bean

每個人所需要的分頁屬性不同,比如pageSize(每頁大小),pageNum (總頁數),totalRows(總記錄數),curPage(當前頁),items(List,存放列表資料)等,使用者可以依據自己的需要進行定製,下面是我的分頁Bean

import java.util.List;

public class PageBean {

	/** 
	* @Fields serialVersionUID : 
	*/ 
	
	private int pageSize; 	//每頁大小
	private int totalRows; 	//總記錄數
	private int pageNum; 	//總頁數
	private int curPage; 	//當前頁碼
	
	private List items; 	//存放資料
	

	public PageBean(int pageSize, int totalRows,
			int curPage, List items) {
		super();
		this.pageSize = pageSize;
		this.totalRows = totalRows;
		this.pageNum = (int) Math.ceil((double)totalRows / pageSize); 
		this.curPage = curPage;
		this.items = items;
	}


	/** 
	 * @return pageSize 
	 */
	public int getPageSize() {
		return pageSize;
	}


	/**
	 * @param pageSize the pageSize to set
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}


	/** 
	 * @return totalRows 
	 */
	public int getTotalRows() {
		return totalRows;
	}


	/**
	 * @param totalRows the totalRows to set
	 */
	public void setTotalRows(int totalRows) {
		this.totalRows = totalRows;
	}


	/** 
	 * @return pageNum 
	 */
	public int getPageNum() {
		return pageNum;
	}


	/**
	 * @param pageNum the pageNum to set
	 */
	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}


	/** 
	 * @return curPage 
	 */
	public int getCurPage() {
		return curPage;
	}


	/**
	 * @param curPage the curPage to set
	 */
	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}


	/** 
	 * @return items 
	 */
	public List getItems() {
		return items;
	}


	/**
	 * @param items the items to set
	 */
	public void setItems(List items) {
		this.items = items;
	}
}


3.有了這個bean,我們分頁的元素內容都依賴他了,寫好了分頁bean之後,還要寫一個類實現jsp的文字標籤類TagSupport,這樣在分頁的jsp標籤解析的時候才能找到對應的實體bean。如下是我的分頁類。這裡繼承了TagSupport後需要重寫doStartTag方法,裡面放入你需要在頁面中動態生成的html標籤,如下是我定製的html顯示標籤,並加了一些樣式控制。


import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.log4j.Logger;


public class PaginationTag extends TagSupport {

	Logger logger = Logger.getLogger(PaginationTag.class);
	/** 
	* @Fields serialVersionUID : 
	*/ 
	private static final long serialVersionUID = 1L;
	
	private String value = "pb"; //存放實體的名字

	/* (非 Javadoc) 
	* <p>Title: doStartTag</p> 
	* <p>Description: </p> 
	* @return
	* @throws JspException 
	* @see javax.servlet.jsp.tagext.TagSupport#doStartTag() 
	*/
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		String jspPageStr = makePageStr();
		try {
			out.write(jspPageStr);
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		return SKIP_BODY;
	}

	private String makePageStr() {
		
		// 獲取到存放在request中的資料實體  
		PageBean pageBean = (PageBean) pageContext.getRequest().getAttribute(value);  
          
        StringBuffer sb = new StringBuffer();  
          
        if (pageBean != null && pageBean.getItems() != null  
                && pageBean.getItems().size() > 0) {  
        	sb.append("<div class='dataTables_paginate paging_bootstrap' style='padding:10px 0;'><ul class='pagination'>");
        	
  
            //首頁 上一頁  
            if (pageBean.getCurPage() > 1) {  
                sb.append("<li><a href='?page=1'>首頁 </a></li>");  
                sb.append("<li><a href='?page=" + (pageBean.getCurPage()-1) + "'>上一頁</a></li>");  
            }  
              
            //迴圈顯示中間頁碼,這裡也可控制最大隻顯示多少頁碼  
            for (int i = 1; i < pageBean.getPageNum() + 1; i++) {  
  
                if (i == pageBean.getCurPage()) {  
                    sb.append("<li class='active'><a href='#'>" + i + "</a></li>");  
                } else if (Math.abs(pageBean.getCurPage() - i )< 5) {  
                    sb.append("<li><a href='?page=" + i + "'> " + i + " </a></li>");  
                } 
            }  
            
            
            
            //下一頁 末頁  
            if(pageBean.getCurPage() != pageBean.getPageNum()){  
                sb.append("<li><a href='?page=" + (pageBean.getCurPage() + 1) + "'>下一頁 </a></li>");  
                sb.append("<li><a href='?page=" + pageBean.getPageNum() + "'>末頁</a></li>");  
            }  
          	sb.append("<li><a href='#' style='border:none;'>共" + pageBean.getTotalRows() + "條記錄 ");
            sb.append("第" + pageBean.getCurPage() + " / "  
                    + pageBean.getPageNum() + "頁</a></li>");  
            sb.append("</ul></div>");
        }  
        return sb.toString();
	}

	/** 
	 * @return value 
	 */
	public String getValue() {
		return value;
	}

	/**
	 * @param value the value to set
	 */
	public void setValue(String value) {
		this.value = value;
	}
	
	
}

4.這個分頁類寫好之後,基本上工作已經完成一大半了,剩下的工作是編寫jsp的tag檔案,供jsp來引入,struts的tag也是類似的定製方法,如下是我的tld檔案內容

page-tags.tld

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">  
<taglib>  
    <tlibversion>1.0.0</tlibversion>  
    <jspversion>1.1</jspversion>  
    <shortname>page</shortname>  
    <uri>/page-tags</uri>  
    <tag> 
        <name>pager</name>  
        <tagclass>com.test.PaginationTag</tagclass>  
        <bodycontent>empty</bodycontent>  
        <attribute>  
            <name>value</name>  
            <required>true</required>  
            <rtexprvalue>false</rtexprvalue>  
        </attribute>  
    </tag>  
</taglib>

這個xml檔案裡面我們主要關注的有3個地方,一個是taglib節點下的url屬性值,這個是jsp在引入這個標籤時方便找到對應的標籤檔案,不然知道是哪個嘛

另一個是tag 節點下的name屬性,這個就是在jsp引入的時候定義名稱空間後的內容,還有一個attribute屬性下的,name 這個就是表現內的屬性,屬性名為value,required指定為true為必須要有的屬性

這三步下來之後,我們的標籤就定義完了,可以在jsp檔案中使用它了,

在jsp檔案的頂部加上如下程式碼引入外部標籤

<%@ taglib prefix="tag" uri="/page-tags" %>


taglib 是固定的引入外部標籤的屬性,prefix 指定的值就是你要在頁面當中使用的字首,後面的url就是在tld檔案中指定的url,方便找到對應的庫。

在jsp檔案中使用就比較方便了,直接加入如下程式碼,在你的頁面中

<tag:pager value="pb" />

這個value值為pb其實就是最上面定義的分頁實體PageBean.java 將裡面的值通過set方法或者構造方法填充就好了

附上我的分頁效果圖,當然是用css控制過的了。





相關文章