`
bendan123812
  • 浏览: 76729 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义分页标签的开发与思考

阅读更多

这两天写了两个用于展示数据的页面,发现分页的代码很繁琐,而且每个页面都一样,自己太懒,所以想把分页的前台代码封装到一个自定义标签中,这样使用起来会很方便。但是在完成之后也发现了一些不足,主要是拼字符串太麻烦,最后再说这个问题,开始吧。

开发一个自定义标签所需要的步骤有四个:

1.创建标签的处理类

标签处理类必须继承TagSupport

 

public class TestPagineTag extends TagSupport{
	
	private static final long serialVersionUID = 1L;

	/**总页数*/
	private int totalPage;
	
	/**当前页*/
	private int nowPage;
	
	/**每页显示条数*/
	private int pageSize;
	
	/**请求地址*/
	private String dataSourceUrl;
	
	@Override
	public int doEndTag() throws JspException {
		try {
			//页面代码
			
			StringBuffer sbuf = new StringBuffer("");
			sbuf.append("<div align='center' style='height:30px;'>")
				.append("<table width='440' cellspacing='0'>")
				.append("<col width='140'/>")
				.append("<col width='20'/>")
				.append("<col width='50'/>")
				.append("<col width='150'/>")
				.append("<col width='50'/>")
				.append("<col width='20'/>")
				.append("<tr height='20' valign='top'>")
				.append("<td valign='top' class='biaobiaoti'>每页 <input name='text' type='text' class='table_edit' id='pageSize' size='3' maxlength='3' onKeyPress='EnterPress(event)' onKeyDown='EnterPress(event)' value='")
				.append(pageSize+"' />条</td>")
				.append("<td class='biaobiaoti' onClick='paging(1)'><img src='/platform/images/shouye.gif'  width='15' height='30' /></td>")
				.append("<td class='biaobiaoti' onClick='paging(2)'><img src='/platform/images/prexFu.gif' width='58' height='30' align='right'  id='previous' /></td>")
				.append("<td align='center' valign='top' class='biaobiaoti'> <input type='text' class='table_edit' id='pageNo'  size='3' maxlength='3'  onKeyPress='EnterPress(event)' onKeyDown='EnterPress(event)' value='")
				.append(nowPage+"' > ")
				.append("/ <input name='text2' type='text' class='table_edit' id='totalPage' size='3' maxlength='3' readonly='true' value='")
				.append(totalPage+"' ></td>")
				.append("<td class='biaobiaoti' onClick='paging(3)'><img src='/platform/images/nextFu.gif' width='58' height='30' align='left' id='next' /></td>")
				.append("<td class='biaobiaoti' onclick='paging(4)'><img src='/platform/images/moye.gif'  width='15' height='30'  /></td>")
				.append("</tr>")
				.append("</table>")
				.append("</div>")
				.append("<script type='text/javascript'>")
				.append("function EnterPress(e){var cue = e||event;var code = cue.keyCode||cue.which||cue.charCode;if(code == 13){ search();}}")
				.append("function search(){var pageNo = document.getElementById('pageNo').value;var totalPage = document.getElementById('totalPage').value;var pageSize = document.getElementById('pageSize').value;pageNo = parseInt(pageNo);totalPage = parseInt(totalPage);pageSize = parseInt(pageSize);if(pageNo < 1){pageNo = 1;}else if(pageNo > totalPage){pageNo = totalPage;}")
				.append("window.location.href ='")
				.append(dataSourceUrl)
				.append("?paginate.pageNo='+pageNo+'&paginate.pageSize='+pageSize;}")
				.append("function paging(flag){var x = parseInt(flag);var pageNow = document.getElementById('pageNo').value;var pageSize = document.getElementById('pageSize').value;var totalPage = document.getElementById('totalPage').value;if(x==1){")
				.append("window.location.href ='")
				.append(dataSourceUrl)
				.append("?paginate.pageNo=1&paginate.pageSize='+pageSize;")
				.append("}else if(x==2){if(pageNow == 1){pageNow = 1}else{pageNow = parseInt(pageNow);pageNow = pageNow-1;}window.location.href ='")
				.append(dataSourceUrl)
				.append("?paginate.pageNo='+pageNow+'&paginate.pageSize='+pageSize;")
				.append("}else if(x==3){if(totalPage == pageNow){pageNow = pageNow;}else{pageNow = parseInt(pageNow);pageNow = pageNow+1;}window.location.href ='")
				.append(dataSourceUrl)
				.append("?paginate.pageNo='+pageNow+'&paginate.pageSize='+pageSize;")
				.append("}else if(x==4){pageNow = totalPage;window.location.href ='")
				.append(dataSourceUrl)
				.append("?paginate.pageNo='+pageNow+'&paginate.pageSize='+pageSize;}}")
				.append("</script>");
			 
			pageContext.getOut().println(sbuf.toString());
		} catch (IOException e) {
			e.printStackTrace();
			throw new JspException("test异常"+e.getMessage());
		}
		return EVAL_PAGE;
	}

	@Override
	public int doStartTag() throws JspException {
		return SKIP_BODY;
	}
//...get(),set();
}

 

 

 

其中的SKIP_BODY表示标签body(即开始标签和结束标签之间的部分)被忽略。如果需要自定义一个有标签体的标签如(<mm:tagtest>body中的部分</mm:tagtest>)那么doStartTag的返回值要设置成EVAL_BODY_INCLUDE

doEndTag方法中的返回值SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上;EVAL_PAGE:表示按照正常的流程继续执行JSP网页。

 

 

2.创建标签库描述文件

标签库描述文件,简称TLD,采用了xml格式,定义了用户的标签库,主要有三类元素:标签库元素,标签元素,标签属性元素。

  

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
	version="2.0">
	<description>testOnly tag</description>
	<display-name>testTag</display-name>
	<tlib-version>2.0</tlib-version>
	<short-name>testTag</short-name>
	<uri>http://www.handlewell.com/adp/testTag</uri>
	
	<!-- 系统信息提示标签 -->
	<tag>
		<!-- 标签库元素 -->
		<name>testPagine</name>
		<tag-class>com.handlewell.testOnly.tag.TestPagineTag</tag-class>
		
		<!-- 标签元素:如果标签需要有标签体(body)那么这里就要定义body中的内容格式,如JSP标明自定义标签的body内是以JSP格式的内容 -->
		<body-content>empty</body-content>
		
		<!-- 标签属性元素 -->
		<attribute>
			<name>totalPage</name>
			<!-- 属性是否必需的,默认为false -->
			<required>true</required>
			<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>nowPage</name>
			<!-- 属性是否必需的,默认为false -->
			<required>true</required>
			<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>pageSize</name>
			<!-- 属性是否必需的,默认为false -->
			<required>true</required>
			<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>dataSourceUrl</name>
			<!-- 属性是否必需的,默认为false -->
			<required>true</required>
			<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>

 

 

 

 

3.web.xml中声明要引用的标签库

 

<jsp-config>
   <taglib>
        <taglib-uri>http://www.handlewell.com/adp/testOnly</taglib-uri>
         <taglib-location>/WEB-INF/taglib/testOnly.tld</taglib-location>
  </taglib>
</jsp-config>

  

 

4.在页面中使用标签

 

  

<%@taglib uri="http://www.handlewell.com/adp/testOnly" prefix="paginate"%>

 

<div align="center" style="position:absolute;bottom:10px;width: 100%;height:30px;">
	<paginate:testPagine dataSourceUrl="/testOnly/tagTest.do" pageSize="${form.paginate.pageSize}" totalPage="${form.paginate.totalPages}" nowPage="${form.paginate.pageNo}"/>
</div>

 

 

 

 问题与思考:

相信大家也发现了,整个过程中最麻烦的是把分页的前台代码拼接成字符串,对于现成的js代码我们要把其格式化成一行,这是相当麻烦的,至少我不想这么弄。当然也可以把js单独放在一个js文件中,给其设置几个参数,然后在标签处理类中把页面传入的参数再传给js。但是如果出现这样的一种情况:我想往页面写xml文件,我有几十个xml文件,它们的格式大体相同,只是有的属性需要动态设置,就像FusionChart里的数据,这时候我们不能把每一个xml文件都这样拼接成串吧。要有什么方式可以满足这种需求呢,请各位大虾们指教。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics