使用struts2开发通用分页组件

由于在使用struts2中经常碰到分页的场景,因此这里讲述一个如何使用通用jsp分页组件的界面,其中包括可使用代码和相应的原理。

这个组件写于5年前,不过现在还是可以使用的,简而言之,它使用了struts2中标签的url标签。简单介绍一下url标签的作用,附如下所示:

名称 必填 缺省 类型 描述
value false   Object/String value如果不提供就用当前action
action false   Object/String 用来生成url的action,如果没有则使用value
namespace false   Object/String 命名空间
id false   Object/String 该元素标识

仔细看url的介绍,其中有几个值值得注意,一是action及namespace和value值,如果不传就使用当前界面的请求值;另一个则是param属性,如果不写就使用当前界面的所有参数值,如果写了,就将设置了的进行覆盖。这里我们将这两个特性应用到我们的分页当中,就会发现这实际上就是专门为分页准备的,分页中,只需要变化分页参数,其它一切不变。

通过上面我们可以看出其中一个关键的参数,id值,文档上为如果id值不为null,而将相应的路径信息传递给id值,并将id值保存在上下文中。那么,我们在分页组件中就可以先定义这个id值,即某一页的链接,然后再将这个链接值传递到某一个a链接即可。

具体在实现上,我们肯定需要一个page对象,里面的属性大家都懂的,第几页,一页多少条,总记录数,然后就是根据这些参数处理是否有上一页,是否有下一页等。

那么,正式的代码即可如下所示,即如何输出首页:

<s:url id="goto"><s:param name="page.currentPage" value="1"/></s:url>
<s:a href="%{goto}" title="首页"></s:a>

如何输出中间的页码数,这里采用的输出方式是以6条为界,即始终界面1-6,7-12这种记录数,当然,都是可定制的。如下所示:

			<s:bean name="org.apache.struts2.util.Counter" id="counter">
				<s:param name="first"
						 value="%{page.currentPage % 6 == 0 ? page.currentPage - 5 : page.currentPage / 6 * 6 + 1}"/>
				<s:param name="last"
						 value="%{page.currentPage % 6 == 0 ? page.currentPage : (page.currentPage / 6 * 6 + 6) < page.totalPage ? (page.currentPage / 6 * 6 + 6) : page.totalPage}"/>
			</s:bean>
			<s:iterator value="#counter">
				<s:url id="goto"><s:param name="page.currentPage" value="top"/></s:url>
				<s:if test="top == page.currentPage"><a class="cur"><span><s:property/></span></a></s:if>
				<s:else><s:a href="%{goto}"><span><s:property/></span></s:a></s:else>
			</s:iterator>

其实都是很简单的,只需要处理好界面数,保存当前页没有链接而其它页有链接即可以了。
最后,附:整个jsp代码:开箱即用,直接在需要的地方 <%@ include url="page.jsp" %>即可。

<!--
Created by Fly_m at 2008-5-16
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!-- 分页组件 -->
<s:if test="page.hasPreviousPage || page.hasNextPage">
	<div class="turnpage">
			<%-- 开头两个 --%>
		<s:url id="goto"><s:param name="page.currentPage" value="1"/></s:url>
		<s:a href="%{goto}" title="首页"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></s:a>
		<s:if test="page.hasPreviousPage">
			<s:url id="goto">
				<s:param name="page.currentPage" value="%{page.currentPage - 1}"/>
			</s:url>
		</s:if>
		<s:a href="%{goto}" title="上一页"><span class="ui-icon ui-icon-triangle-1-w"></span></s:a>
			<%-- 页面显示 --%>

		<s:if test="page.totalPage <= 6">
			<s:bean name="org.apache.struts2.util.Counter" id="counter">
				<s:param name="first" value="1"/>
				<s:param name="last" value="page.totalPage"/>
			</s:bean>
			<s:iterator value="#counter">
				<s:url id="goto"><s:param name="page.currentPage" value="top"/></s:url>
				<s:if test="top == page.currentPage"><a class="cur"><span><s:property/></span></a></s:if>
				<s:else><s:a href="%{goto}"><span><s:property/></span></s:a></s:else>
			</s:iterator>
		</s:if>
		<s:else>
			<s:bean name="org.apache.struts2.util.Counter" id="counter">
				<s:param name="first"
						 value="%{page.currentPage % 6 == 0 ? page.currentPage - 5 : page.currentPage / 6 * 6 + 1}"/>
				<s:param name="last"
						 value="%{page.currentPage % 6 == 0 ? page.currentPage : (page.currentPage / 6 * 6 + 6) < page.totalPage ? (page.currentPage / 6 * 6 + 6) : page.totalPage}"/>
			</s:bean>
			<s:iterator value="#counter">
				<s:url id="goto"><s:param name="page.currentPage" value="top"/></s:url>
				<s:if test="top == page.currentPage"><a class="cur"><span><s:property/></span></a></s:if>
				<s:else><s:a href="%{goto}"><span><s:property/></span></s:a></s:else>
			</s:iterator>
		</s:else>
			<%-- 结尾两个 --%>
		<s:url id="goto"><s:param name="page.currentPage" value="page.totalPage"/></s:url>
		<s:if test="page.hasNextPage">
			<s:url id="goto"><s:param name="page.currentPage" value="%{page.currentPage + 1}"/></s:url>
		</s:if>
		<s:a href="%{goto}" title="下一页"><span class="ui-icon ui-icon-triangle-1-e"></span></s:a>
		<s:url id="goto"><s:param name="page.currentPage" value="page.totalPage"/></s:url>
		<s:a href="%{goto}" title="尾页"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></s:a>&nbsp;&nbsp;
		页次:<s:property value="page.currentPage"/>/<s:property value="page.totalPage"/>&nbsp;&nbsp;
		每页:<s:property value="page.pageSize"/>条&nbsp;&nbsp;
		共计:<s:property value="page.totalCount"/>条&nbsp;&nbsp;
		
		<%--如果总页数少于100页,输出一个select跳转框 --%>
		<s:if test="page.totalPage <= 100">
			<s:bean name="org.apache.struts2.util.Counter" id="counter">
				<s:param name="first" value="1"/>
				<s:param name="last" value="page.totalPage"/>
			</s:bean>
			<select onchange="window.location.href = this.options[this.selectedIndex].value;" size="1">
				<s:iterator value="#counter">
					<s:url id="goto"><s:param name="page.currentPage" value="top"/></s:url>
					<s:if test="top == page.currentPage">
						<option value="<s:property value="%{goto}"/>" selected="selected">第<s:property/>页</option>
					</s:if>
					<s:else>
						<option value="<s:property value="%{goto}"/>">第<s:property/>页</option>
					</s:else>
				</s:iterator>
			</select>
		</s:if>
	</div>
</s:if>

转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/201303110001.html

相关文章:

作者: flym

I am flym,the master of the site:)

《使用struts2开发通用分页组件》有一个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注