jsp定制分页标签

来源:互联网 发布:mac os系统好用吗 编辑:程序博客网 时间:2024/06/11 14:31

在项目开发过程中需要展示报表,然而一般报表的内容都比较长,需要做分页处理,手动写的分页倒也可以,但是不能每个页面都写一套逻辑,即便是用<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() */@Overridepublic 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控制过的了。





0 0
原创粉丝点击