这两天写了两个用于展示数据的页面,发现分页的代码很繁琐,而且每个页面都一样,自己太懒,所以想把分页的前台代码封装到一个自定义标签中,这样使用起来会很方便。但是在完成之后也发现了一些不足,主要是拼字符串太麻烦,最后再说这个问题,开始吧。
开发一个自定义标签所需要的步骤有四个:
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文件都这样拼接成串吧。要有什么方式可以满足这种需求呢,请各位大虾们指教。
分享到:
相关推荐
自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签...
在JavaServer Pages (JSP) 开发中,为了提高代码...通过自定义标签,你可以根据项目需求定制分页行为,使其与整体应用更好地融合。在实际开发中,结合TLD和Tag Handler类的使用,可以轻松实现高效、可扩展的分页功能。
在Java开发中,自定义分页标签是一种常见的需求,它能帮助我们构建用户友好的界面,使得大量数据的展示变得更加高效和便捷。本教程将详细讲解如何创建和使用自定义分页标签,以及如何实现淘宝购物分页标签的样式。 ...
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
自定义分页标签是指开发者根据项目需求创建的个性化分页组件,它能够灵活地与后端数据库交互,实现数据的分页展示。本文将深入探讨如何在Java环境中自定义分页标签,以及涉及到的相关技术点。 首先,我们需要理解...
JSP自定义分页标签,mysql数据库,通过导入jar包,使用标签的方式实现分页的功能。
在IT行业中,分页是一种常见的数据展示...总的来说,自定义分页标签是一个集前端UI设计、交互逻辑、数据处理和性能优化于一体的开发任务。开发者需要结合业务需求,综合运用多种技术,创造出既美观又实用的分页组件。
"一个功能强大的自定义分页标签"实例提供了一种高效且灵活的方式来处理分页问题,特别是对于那些希望通过自定义逻辑来增强其应用程序分页功能的开发者而言。 自定义标签是JSP(JavaServer Pages)技术的一部分,它...
在IT行业中,自定义分页标签是Web应用开发中常用的一种技术,特别是在Java Web开发领域。自定义标签(Custom Tags)允许开发者创建自己的HTML标签,这些标签可以封装复杂的逻辑,提高代码的可读性和可维护性。在这个...
开发者可能结合Struts1标签库与自定义分页标签一起使用,实现更复杂的业务逻辑。 4. **实例化分页类**: 分页标签可能需要一个分页类的实例,这个类通常会包含当前页数、总页数、每页大小等属性,以及相关的计算...
在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...
自定义页面分页标签是指开发者根据项目需求,创建个性化的分页组件,以实现更加灵活、符合界面设计风格的分页功能。下面将详细探讨如何实现自定义页面分页标签及其相关的知识点。 1. **基础概念**: - 分页:将...
在Windows Forms(WinForm)开发中,我们常常需要实现数据的分页显示,以提高用户界面的可操作性和性能。自定义分页控件能够帮助我们更好地管理大量数据,提供流畅的用户体验。本文将深入探讨如何在WinForm应用中...
本项目以SSH(Struts2、Spring、Hibernate)经典框架为基础,通过自定义分页标签实现了这一功能。下面将详细介绍自定义分页标签在项目中的应用及其核心知识点。 首先,SSH框架是Java Web开发中广泛使用的三大组件。...