`
ybyonline
  • 浏览: 40935 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java标签分页实现

阅读更多

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

  • 大小: 17.8 KB
分享到:
评论
2 楼 ybyonline 2013-04-15  
zhang_sun 写道
Constants.MAX_PAGE_INDEX值是多少?可以贴出来吗楼主?

这个参数,看字面你自己也应该猜出什么意思。代码我上传了。
1 楼 zhang_sun 2013-03-02  
Constants.MAX_PAGE_INDEX值是多少?可以贴出来吗楼主?

相关推荐

    java自定义标签分页

    在这个“java自定义标签分页”主题中,我们将深入探讨如何利用自定义标签来实现高效且易于维护的分页功能。 首先,自定义标签的定义通常涉及以下组件: 1. TLD(Tag Library Descriptor)文件:这是定义自定义标签...

    java自定义分页标签实现带条件的分页查询

    本话题主要探讨如何使用自定义的Java分页标签来实现带条件的分页查询,这将帮助开发者更好地控制和优化数据检索。 首先,我们需要了解分页的基本原理。分页查询是通过限制数据库查询返回的结果数量,每次只获取一...

    JAVA分页实现JAVA+JS+HTML

    在实际项目中,分页实现可能更为复杂,例如需要考虑性能优化,比如预加载相邻页数据,或者使用懒加载来减少初始加载时间。同时,现代前端框架如React、Vue或Angular提供了更高级的分页组件和状态管理工具,简化了...

    实用java分页标签

    在Java Web开发中,有两种主要的分页实现方式:一种是通过Java后端代码实现,另一种是通过前端标签库(如JSTL)来实现。本话题主要关注后者的应用,即使用Java分页标签进行前端显示。 1. **JSTL分页**:JavaServer ...

    java自定义分页标签

    本教程将深入讲解如何在Java环境中实现自定义分页标签。 首先,我们需要了解Java自定义标签的基础。在Java Servlet规范中,JSP标准标签库(JSTL)提供了许多预定义的标签,但有时这些标签无法满足我们的特定需求。...

    jsp java自定义标签 分页 当前位置 循环遍历数据

    本文将深入探讨如何使用Java自定义标签来实现分页功能,当前位置的显示以及数据的循环遍历。 首先,让我们了解一下Java自定义标签的基本概念。自定义标签是JSP的一种扩展机制,它允许开发者创建自己的标签库,这些...

    java采用标签实现分页

    首先,我们要理解什么是Java标签(Tag)。在Java Servlet JSP(JavaServer Pages)中,标签是用于扩展HTML或XML的一种机制,它可以封装特定的功能或逻辑,使得视图层的代码更加清晰和易于维护。自定义标签(Custom ...

    最好最好的java万能分页标签

    对于熟悉Java和Struts的开发者来说,通过这个分页标签可以在短时间内高效地实现分页功能,提升开发效率。 总结来说,"最好最好的java万能分页标签"是一个为Java Web开发者提供便利的分页解决方案,特别适合Struts...

    Java实现真分页.自己领悟.

    总结起来,这个项目展示了如何在Java Web环境中通过自定义标签库实现真分页,即根据用户请求动态计算并加载相应的数据页。`GenPage.java`、`BaseAction.java`、`AreaAction.java`、`AccNodes.java`等文件共同构成了...

    java分页标签

    总之,"java分页标签"是一个自定义的JSP标签库,旨在简化Java Web应用中的分页实现,提高开发效率,并提供良好的用户体验。通过理解上述核心概念,开发者可以更好地利用这样的分页工具,优化他们的Web应用。

    java分页web实现

    本教程将详细讲解如何在Java环境下实现Web应用的分页功能,并提供一个测试数据库供学习者参考。 首先,我们要了解分页的基本概念。分页是一种数据展示方式,它将大量的数据分成若干个小块(页),每次只加载一部分...

    java通用分页含使用文档

    本资源提供的"java通用分页含使用文档"是一个jar包,旨在简化Java Web开发中的分页实现过程,避免开发者手动编写繁琐的分页代码。 首先,我们要理解什么是分页。在Web应用中,当数据量过大时,一次性加载所有数据会...

    JAVA分页标签-简单的分页标签

    本文将深入探讨“JAVA分页标签”,这是一种简化分页实现的机制。 一、什么是分页标签? 分页标签是Java服务器页面(JSP)中的一个组件,它允许开发者在JSP页面上方便地实现分页功能,而无需编写大量的HTML和...

    jsp java自定义标签 实现分页 当前位置标签

    在本案例中,"jsp java自定义标签 实现分页 当前位置标签"的标题揭示了我们要探讨的核心内容:如何利用JSP和Java来创建一个自定义标签,这个标签不仅能够处理分页功能,还能显示当前位置信息。下面将详细解释这一...

    分页功能实现java

    在Java Web开发中,实现分页功能通常涉及前端页面(JSP)和后端代码(Java)的协同工作。而这里提到的Eclipse、Struts、Hibernate则是Java开发中常用的工具和框架,分别用于集成开发环境、MVC模式的Web层框架和对象...

    java万能分页代码

    Java万能分页代码是Java开发中常用的工具,尤其在处理大数据量的Web应用时,分页技术能够显著提升用户体验并优化服务器性能。这个3.0版本的分页代码库通常包含了一些经过优化的分页算法和接口,适用于各种场景,如...

    java万能分页标签

    Java万能分页标签是一种强大的、可复用的组件,专为Java项目设计,旨在简化在Web应用中实现数据分页的过程。它属于Java自定义标签(JSP Custom Tags)的范畴,允许开发者通过简单的XML样式的标签语法来实现复杂的...

    java分页实现大全

    Java 分页实现是Java开发中常见的一种技术,用于在大量数据中进行高效的查询和展示,以提高用户体验并减轻服务器负载。在处理大数据集时,分页尤为重要,因为它允许用户逐步加载和浏览信息,而不是一次性加载所有...

Global site tag (gtag.js) - Google Analytics