Java标签分页实现

3 篇文章 0 订阅

Java实现标签分页

 

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

      代码主要分为三个类:

  1. PageTag 分页标签类
  2. Page 分页bean
  3. Constant 设置常量

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

 静态参数类:

public class Constants {
	
	public static int PAGE_SIZE = 5; //每页大小
	public static int MAX_PAGE_INDEX = 5;//最多显示5个数字连接
	
}

 

编写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,查看页面效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值