读书人

Java标签分页兑现

发布时间: 2012-12-15 15:16:03 作者: rapoo

Java标签分页实现

Java实现标签分页

?

????? 最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。

????? 代码主要分为三个类:

    PageTag 分页标签类Page 分页beanConstant 设置常量

???? Page代码:

/** *  * @author byyang *  */public class Page{private int current = 0;  //当前页,默认为第一页private int size;     //记录总数private int length;   //每页的长度private String url;   //访问路径public Page(int offset, int size, int length) {super();this.current = offset;this.size = size;this.length = length;}/** * 获取总页数 * @return */public int pageCount(){int pagecount = 0;if(this.size % this.length == 0){pagecount = this.size / this.length;}else{pagecount = this.size / this.length + 1;}return pagecount;}//最后一页开始条数public int lastPageOffset(){return this.size - lastPageSize();}//最后一页页大小public int lastPageSize(){int lastpagesize = 0;if(this.size % this.length == 0){lastpagesize = this.length;}else{lastpagesize = this.size % this.length;}return lastpagesize;}//获取起始页public int getOffset() {return current;}//总记录数public int getSize() {return size;}//每页大小public int getLength() {return length;}//获取访问路径public String getUrl() {return url;}//上一页public int getLastOffset(){int offset = this.getOffset() - this.getLength();if(offset > 0){return offset;}else{return 0;}}//下一页public int getNextOffset(){int offset =  this.getOffset() + this.getLength();if(offset > this.getSize()){return getLastOffset();}else{return offset;}}public String getPageNavigation(){String pageNavigation = "";return pageNavigation;}public void setOffset(int offset) {this.current = offset;}public void setSize(int size) {this.size = size;}public void setLength(int length) {this.length = length;}public void setUrl(String url) {this.url = url;}}

?

?

?? 现在我们要实现PageTag标签类,自定义标签有两种实现TagSupport和SimpleTagSupport,两个都能实现这个功能,这个看个人选择了。

?

?

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) :跳过了开始和结束标签之间的代码。 * EVAL_BODY_INCLUDE(1):将body的内容输出到存在的输出流中 * SKIP_PAGE(5): 忽略剩下的页面。 * EVAL_PAGE隐含(6):继续执行下面的页 * @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) + " 页   ");      //设置当前页第一条记录索引     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");       } }  /**  * 数字连接  * @param s  * @param page  * @param pref  */ public void doBody(StringBuilder s,Page page,String pref){   //显示半径       int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();             //显示数字的连接从第几条开始       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();       } }}

?

编写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.sun.com/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

?

 <!-- 自定义标签 --> <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"%>

?

你可以放到一个公共jsp里面一块引。

?

现在咱们可以测试一下了:

在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中咱们设一个测试数据:

?

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; }}

?好的,接下来启动tomcat,查看页面效果:

Java标签分页兑现

读书人网 >Web前端

热点推荐