论坛首页 Java企业应用论坛

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

浏览 6535 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-10  

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

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

1.创建标签的处理类

标签处理类必须继承TagSupport

 

 

 

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

   发表时间:2012-10-10  
自定标标签写好了利国利民啊!
0 请登录后投票
   发表时间:2012-10-10  
标签处理类的代码没贴上,不好意思,怎么修改啊,为什么我一修改原先贴的代码就乱了。
0 请登录后投票
   发表时间:2012-10-10  
确实,分页的前台展现是比较麻烦的事.后台比较简单.
我也写过自己的分页标签,而且在用.前台的展现折腾私人
你的"问题与思考"我看得不太明白。。。xml输出到前台用xml+xslt
0 请登录后投票
   发表时间:2012-10-11  
tjpdj1988 写道
确实,分页的前台展现是比较麻烦的事.后台比较简单.
我也写过自己的分页标签,而且在用.前台的展现折腾私人
你的"问题与思考"我看得不太明白。。。xml输出到前台用xml+xslt

----------------------
我是意思是有段前台的jsp和js的代码,现在要做成自定义标签,但是又不想用StringBuffer这样一行一行拼接,太麻烦。如果直接把代码做成一个模板然后用资源管理的方面读写又不知道如何给代码模板中的变量设置参数。有没有有什么好的方法?
0 请登录后投票
   发表时间:2012-10-11   最后修改:2012-10-11
如果不想太麻烦(封装这种页面展示不是tag的强项,需要动态拼html),而且还想速度快
直接考虑静态导入,如
<%@include file="/common/jsp/page.jsp" %>

效果是一样
1 请登录后投票
   发表时间:2012-10-13   最后修改:2012-10-13
jinnianshilongnian 写道
如果不想太麻烦(封装这种页面展示不是tag的强项,需要动态拼html),而且还想速度快
直接考虑静态导入,如
<%@include file="/common/jsp/page.jsp" %>

效果是一样


jinnianshilongnian, o(∩_∩)o

我封装的

<feilongDisplay:pager count="${pagination.count }" pageSize="${pagination.size}" maxIndexPages="3" vmPath="velocity/pager.vm" pageParamName="pageNo" skin="list-pages"/>


支持 velocity 模板

0 请登录后投票
   发表时间:2012-10-13  
楼主不厚道 没把核心代码贴上来
0 请登录后投票
   发表时间:2012-10-13   最后修改:2012-10-13
飞天奔月 写道
jinnianshilongnian 写道
如果不想太麻烦(封装这种页面展示不是tag的强项,需要动态拼html),而且还想速度快
直接考虑静态导入,如
<%@include file="/common/jsp/page.jsp" %>

效果是一样


jinnianshilongnian, o(∩_∩)o

我封装的

<feilongDisplay:pager count="${pagination.count }" pageSize="${pagination.size}" maxIndexPages="3" vmPath="velocity/pager.vm" pageParamName="pageNo" skin="list-pages"/>


支持 velocity 模板


count pageSize maxIndexPages等 默认可以省略(默认读取pagination 的数据) 这样简化设值
0 请登录后投票
   发表时间:2012-10-14  
jinnianshilongnian 写道
飞天奔月 写道
jinnianshilongnian 写道
如果不想太麻烦(封装这种页面展示不是tag的强项,需要动态拼html),而且还想速度快
直接考虑静态导入,如
<%@include file="/common/jsp/page.jsp" %>

效果是一样


jinnianshilongnian, o(∩_∩)o

我封装的

<feilongDisplay:pager count="${pagination.count }" pageSize="${pagination.size}" maxIndexPages="3" vmPath="velocity/pager.vm" pageParamName="pageNo" skin="list-pages"/>


支持 velocity 模板


count pageSize maxIndexPages等 默认可以省略(默认读取pagination 的数据) 这样简化设值


这样一来就和 pagination 对象绑定了太依赖了

其实 这个 pagination 对象 是我们公司其他同事开发的 http://code.google.com/p/loxia2/

我feilong 这个标签 尽量可以使用自己的数据,但是也有默认值的

pageSize 默认是10
vmPath 默认是 "velocity/pager.vm"

http://code.google.com/p/feilong/
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics