首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-28 
自定义分页标签的开发与思考这两天写了两个用于展示数据的页面,发现分页的代码很繁琐,而且每个页面都一样,

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

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

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

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;@Overridepublic 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;}@Overridepublic 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文件都这样拼接成串吧。要有什么方式可以满足这种需求呢,请各位大虾们指教。

热点排行