Java實(shí)現(xiàn)標(biāo)簽分頁
最近為了開發(fā)一個(gè)網(wǎng)站,里面要用分頁功能,但是之前很少自己寫分頁標(biāo)簽,又不想用現(xiàn)成框架。所以自己參考了些資料,寫了個(gè)分頁例子測試了一下。
代碼主要分為三個(gè)類:
- PageTag 分頁標(biāo)簽類
- Page 分頁bean
- Constant 設(shè)置常量
Page代碼:
現(xiàn)在我們要實(shí)現(xiàn)PageTag標(biāo)簽類,自定義標(biāo)簽有兩種實(shí)現(xiàn)TagSupport和SimpleTagSupport,兩個(gè)都能實(shí)現(xiàn)這個(gè)功能,這個(gè)看個(gè)人選擇了。
- import java.io.IOException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.TagSupport;
-
- import com.byyang.util.Constants;
- /**
- * doStartTag()和doEndTag()返回值處理:
- * SKIP_BODY (0) :跳過了開始和結(jié)束標(biāo)簽之間的代碼。
- * EVAL_BODY_INCLUDE(1):將body的內(nèi)容輸出到存在的輸出流中
- * SKIP_PAGE(5): 忽略剩下的頁面。
- * EVAL_PAGE隱含(6):繼續(xù)執(zhí)行下面的頁
- * @author yangby
- *
- */
- public class PageTag extends TagSupport{
-
- private String url;
-
- public String getUrl(){
- return this.url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public int doEndTag()throws JspException{
- return EVAL_PAGE;
- }
-
-
- public int doStartTag() throws JspException{
- HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
- //獲取分頁bean
- Page page = (Page)request.getAttribute("pager");
-
- JspWriter out = this.pageContext.getOut();
- //拼接分頁信息
- StringBuilder s = new StringBuilder();
- s.append("共 " + ((page.getSize() - 1) / page.getLength() + 1) + " 頁 ");
-
- //設(shè)置當(dāng)前頁第一條記錄索引
- String current = request.getParameter("current");
- if(current != null && !"".equals(current)){
- page.setOffset(Integer.parseInt(current));
- }
- if (page.getSize() > page.getLength()){
- //獲取連接符pref
- String pref;
- if (this.url.indexOf("?") > -1){
- pref = "&";
- }else {
- pref = "?";
- }
- this.doStart(s, page, pref);
- this.doBody(s, page, pref);
- this.doEnd(s,page,pref);
- }else{
- s.append(" ");
- }
- s.append(" 共 " + page.getSize() + " 條記錄");
- try{
- out.println(s.toString());
- }catch (IOException e){
- e.printStackTrace();
- }
-
- return SKIP_BODY;
- }
-
- /**
- * //拼接"首頁"和"<"
- * @param s
- * @param page
- * @param pref
- */
- public void doStart(StringBuilder s,Page page,String pref){
- if (page.getOffset() > 0){
- s.append("<a href='" + this.url + pref +
- "current=0'>[首頁]</a>\n" + "<a href='" + this.url + pref +
- "current=" + page.getLastOffset() + "'>[<]</a>\n");
- }else{
- s.append("<a href='" + this.url + pref + "current=0'>[首頁]</a>\n" );
- }
- }
-
- /**
- * 拼接"尾頁"和">"
- * @param s
- * @param page
- * @param pref
- */
- public void doEnd(StringBuilder s,Page page,String pref){
- if (page.getOffset() < page.getSize() - page.getLength()) {
- s.append("<a href='" + this.url + pref + "current=" + page.getNextOffset() + "'>[>]</a>\n" + "<a href='" +
- this.url + pref + "current=" + page.lastPageOffset() +
- "'>[尾頁]</a>\n");
- }else{
- s.append("\n"+ "<a href='" + this.url + pref + "current=" + page.lastPageOffset() + "'>[尾頁]</a>\n");
- }
- }
-
- /**
- * 數(shù)字連接
- * @param s
- * @param page
- * @param pref
- */
- public void doBody(StringBuilder s,Page page,String pref){
- //顯示半徑
- int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();
-
- //顯示數(shù)字的連接從第幾條開始
- int startOffset;
- if ((page.getOffset() < radius) || (page.pageCount() <= Constants.MAX_PAGE_INDEX)){
- startOffset = 0;
- }else{
- if (page.getOffset() < page.getSize() - radius){
- startOffset = page.getOffset() - radius;
- }else{
- startOffset = (page.getSize() / page.getLength() - Constants.MAX_PAGE_INDEX) *
- page.getLength();
- }
- }
- for (int i = startOffset; (i < page.getSize()) && (i < startOffset + Constants.MAX_PAGE_INDEX * page.getLength()); ){
- if (i == page.getOffset()){
- s.append("<b>" + (i / page.getLength() + 1) + "</b>\n");
- }else{
- s.append("<a href='" + this.url + pref + "current=" + i +
- "'>" + (i / page.getLength() + 1) + "</a>\n");
- }
- i += page.getLength();
- }
- }
- }
靜態(tài)參數(shù)類:
- public class Constants {
-
- public static int PAGE_SIZE = 5; //每頁大小
- public static int MAX_PAGE_INDEX = 5;//最多顯示5個(gè)數(shù)字連接
-
- }
編寫tld文件mypage.tld:
- <?xml version="1.0" encoding="utf-8" ?>
- <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java./dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>2.5</tlib-version>
- <jsp-version>1.2</jsp-version>
- <short-name>mypage</short-name>
- <uri>\tag-page</uri>
- <tag>
- <name>page</name>
- <tag-class>com.byyang.tag.PageTag</tag-class>
- <body-content>pg</body-content>
- <attribute>
- <name>url</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
配置web.xml
- <!-- 自定義標(biāo)簽 -->
- <jsp-config>
- <taglib>
- <taglib-uri>/tag-page</taglib-uri>
- <taglib-location>/WEB-INF/mypage.tld</taglib-location>
- </taglib>
- </jsp-config>
在jsp頁面中添加如下代碼:
- <%@ taglib uri="/tag-page" prefix="pg"%>
你可以放到一個(gè)公共jsp里面一塊引。
現(xiàn)在咱們可以測試一下了:
在jsp頁面代碼:
- <div align="center">
- <h2>圖書列表</h2>
- <table border=1>
- <s:iterator var="book" status="index" value="books">
- <s:if test="#index.odd == true">
- <tr style="background-color: yellow">
- </s:if>
- <s:else>
- <tr>
- </s:else>
- <td align="right">圖書名稱:</td>
- <td align="left"><s:property value="book"/></td>
- </tr>
- </s:iterator>
- </table>
- <pg:page url="getBookList.action"></pg:page>
- </div>
Action中咱們設(shè)一個(gè)測試數(shù)據(jù):
- public class BookAction extends BaseAction {
-
- private String[] books;
- private BookService bookService = new BookService();
-
- public String execute() throws Exception {
-
- setBooks(bookService.getBookList());
- Page page = new Page(1,65,5);
- request.setAttribute("pager", page);
-
- return SUCCESS;
-
- }
- public String[] getBooks() {
- return books;
- }
-
- public void setBooks(String[] books) {
- this.books = books;
- }
-
- }
好的,接下來啟動(dòng)tomcat,查看頁面效果:
![]()
|