这两天写了两个用于展示数据的页面,发现分页的代码很繁琐,而且每个页面都一样,自己太懒,所以想把分页的前台代码封装到一个自定义标签中,这样使用起来会很方便。但是在完成之后也发现了一些不足,主要是拼字符串太麻烦,最后再说这个问题,开始吧。
开发一个自定义标签所需要的步骤有四个:
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文件都这样拼接成串吧。要有什么方式可以满足这种需求呢,请各位大虾们指教。
分享到:
相关推荐
自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签...
自定义分页标签自定义分页标签自定义分页标签自定义分页标签 多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加
自定义分页标签3套,淘宝购物分页标签样式,分为多套风格不一的分页标签
自定义页面分页标签自定义页面分页标签自定义页面分页标签自定义页面分页标签自定义页面分页标签
JSP自定义分页标签,mysql数据库,通过导入jar包,使用标签的方式实现分页的功能。
jsp自定义分页标签,参考http://blog.csdn.net/fastthinking/article/details/12849065
自定义分页标签 自 定 义 分 页 标 签
Struts2自定义分页标签很详细了,新手可以少走弯路,节约时间 资源包括了后台如何操作。
基于struts2的自定义分页标签实现的一个demo,连接数据库为Oracle
JSP自定义分页标签 extends TagSupport 多种分页风格无需额外资源,使用简单易懂:WebRoot/WEB-INF/tms-tags.tld 文件路径
利用自定义jstl标签,实现mybatis分页查询
自定义分页控件开发实例 自定义分页控件开发实例 自定义分页控件开发实例 自定义分页控件开发实例
jsp 对List的自定义分页标签 很好用的
WinForm自定义分页控件完整实例,导入可用
自定义的漂亮分页标签,支持上下翻页,直接跳转指定页
自己写的一个很不错的自定义分页标签,分享给大家