`
kong0itey
  • 浏览: 305883 次
社区版块
存档分类
最新评论

struts2的通用分页工具条

阅读更多
java组件
package com.tag;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.UIBean;

import com.opensymphony.xwork2.util.ValueStack;

public class Pagebar extends UIBean {

	protected String totalRecord;
	protected String pageSize;
	protected String pageNo;
	protected String url;
	protected String style;

	public String getTotalRecord() {
		return totalRecord;
	}

	public void setTotalRecord(String totalRecord) {
		this.totalRecord = totalRecord;
	}

	public String getPageSize() {
		return pageSize;
	}

	public void setPageSize(String pageSize) {
		this.pageSize = pageSize;
	}

	public String getPageNo() {
		return pageNo;
	}

	public void setPageNo(String pageNo) {
		this.pageNo = pageNo;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getStyle() {
		return style;
	}

	public void setStyle(String style) {
		this.style = style;
	}

	public Pagebar(ValueStack stack, HttpServletRequest request,
			HttpServletResponse response) {
		super(stack, request, response);
	}

	@Override
	protected String getDefaultTemplate() {
		return "pagebar_" + style.toLowerCase();
	}

	@Override
	protected void evaluateExtraParams() {
		super.evaluateExtraParams();
		addParameter("totalRecord", findString(totalRecord));
		addParameter("pageSize", findString(pageSize));
		// 保证页码必须为数字,防止无效参数
		String pno = findString(pageNo);
		if (pno == null || !pno.matches("^[1-9]+[0-9]*$"))
			pno = "0";
		addParameter("pageNo", pno);
		addParameter("url", findString(url));
		addParameter("style", style);
	}

}


package com.tag;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ui.AbstractUITag;

import com.opensymphony.xwork2.util.ValueStack;

public class PagebarTag extends AbstractUITag {

	private static final long serialVersionUID = 1L;
	protected String totalRecord;
	protected String pageSize;
	protected String pageNo;
	protected String url;
	protected String style = "basic";

	@Override
	public Component getBean(ValueStack stack, HttpServletRequest request,
			HttpServletResponse response) {
		return new Pagebar(stack, request, response);
	}

	protected void populateParams() {
		super.populateParams();
		Pagebar pagebar = (Pagebar) component;
		pagebar.setTotalRecord(totalRecord);
		pagebar.setPageSize(pageSize);
		pagebar.setPageNo(pageNo);
		pagebar.setUrl(url);
		pagebar.setStyle(style);
	}

	public String getTotalRecord() {
		return totalRecord;
	}

	public void setTotalRecord(String totalRecord) {
		this.totalRecord = totalRecord;
	}

	public String getPageSize() {
		return pageSize;
	}

	public void setPageSize(String pageSize) {
		this.pageSize = pageSize;
	}

	public String getPageNo() {
		return pageNo;
	}

	public void setPageNo(String pageNo) {
		this.pageNo = pageNo;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getStyle() {
		return style;
	}

	public void setStyle(String style) {
		this.style = style;
	}

}


标签配置文件,放在 /WebRoot/WEB-INF/ 下,命名为struts-extend.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>l</short-name>
	<uri>/lowca-tags</uri>
	<display-name>自定义的struts标签</display-name>
	
	<tag>
		<name>pagebar</name>
		<tag-class>com.tag.PagebarTag</tag-class>
		<body-content>jsp</body-content>
		<description>分页工具条</description>
		<attribute>
			<name>totalRecord</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>int</type>
			<description>记录数</description>
		</attribute>		
		<attribute>
			<name>pageSize</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>int</type>
			<description>每页显示的条数</description>
		</attribute>		
		<attribute>
			<name>pageNo</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>int</type>
			<description>页码</description>
		</attribute>		
		<attribute>
			<name>url</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.String</type>
			<description>url地址</description>
		</attribute>		
		<attribute>
			<name>style</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.String</type>
			<description>呈现样式</description>
		</attribute>
	</tag>
</taglib>


模板文件,放在 src/template/当前struts2主题/ 目录下,我的是放在 src/template/simple/ 下面。命名为pagebar_basic.ftl,还可以自己写其他的主题来扩展这个分页标签,比如写一个pagebar_ajax.ftl使它支持ajax方式的分页。
<#-- 定义顶层变量并转换 -->
<#assign url=parameters.url />
<#assign pageSize=parameters.pageSize?number />
<#assign totalRecord=parameters.totalRecord?number />
<#if (totalRecord%pageSize=0)>
	<#assign totalPage=totalRecord/pageSize />
<#else>
	<#assign totalPage=totalRecord/pageSize+1 />
</#if>
<#assign pageNo=parameters.pageNo?number />
<#if (pageNo<1)>
	<#assign pageNo=1 />
</#if>
<#if (pageNo>totalPage)>
	<#assign pageNo=totalPage />
</#if>
<#-- 模板逻辑 -->
<#if (totalRecord>0) && (totalPage>1) && (pageNo>0) && (pageNo<=totalPage)>
	<#--计算开始位置和结束位置-->
	<#if (pageNo<=5)>
		<#assign leftNo=1 />   
		<#if (totalPage<10)>
			<#assign rightNo=totalPage />
		<#else>
			<#assign rightNo=10 />
		</#if>
	<#elseif (pageNo>5) && (pageNo<=totalPage-5)>
		<#if (pageNo-4>0)>
			<#assign leftNo=pageNo-4 />
		<#else>
			<#assign leftNo=1 />
		</#if>
		<#if (pageNo+5<=totalPage)>
			<#assign rightNo=pageNo+5 />
		<#else>
			<#assign rightNo=totalPage />
		</#if>
	<#else>
		<#if (totalPage-10+1>0)>
			<#assign leftNo=totalPage-10+1 />
		<#else>
			<#assign leftNo=1 />
		</#if>
		<#assign rightNo=totalPage />
	</#if>
	<#--输出内容-->
	<#lt/><!--================分页工具条开始================-->
	<style>
	/*page*/
	.pagebar_warpper li { display:inline; margin:0 1px; left center no-repeat;}
	.pagebar_warpper{ width:auto; margin:0 auto; height:22px; line-height:22px; text-align:center; margin-top:20px;}
	.pagebar_desc,.pagebar_plist,.pagebar_gp{ float:left;}
	.pagebar_plist a{ border:1px solid #ccc; padding:5px; margin-right:3px; background:#fff; text-decoration:none;}
	.pagebar_plist a.pagebar_curr{ background:#72b003; color:#fff; border:1px solid #72b003;}
	.green{ font-weight:bold; margin-right:5px; color:#75bf0d;}
	.pagebar_gp_textbox{ width:30px; height:18px; border:1px solid #ccc; margin-right:1px;}
	.pagebar_gp_button{ background-color:#75bf0d; color:#fff; padding:2px; text-align:center; cursor:pointer; font-weight:bold;}
	</style>
	<div class="pagebar_warpper">
		<ul class="pagebar_ul">
			<li class="pagebar_desc">总条数<span class="pagebar_desc_num">${totalRecord?c}</span>&nbsp;&nbsp;总页数<span class="pagebar_desc_num">${totalPage?c}</span></li>
			<li class="pagebar_plist">
				<a href="<@getURL text=url page=1 />">首页</a>
				<#if (pageNo-1>=1)>
				<a href="<@getURL text=url page=pageNo-1 />">上一页</a>
				</#if>
				<#list leftNo..rightNo as p>   
        			<#if (p==pageNo)>   
            			<a class="pagebar_curr" href="#">${p}</a>
        			<#else>   
            			<a href="<@getURL text=url page=p />">${p}</a>
        			</#if>
    			</#list> 
    			<#if (pageNo+1<=totalPage)>
				<a href="<@getURL text=url page=pageNo+1 />">下一页</a>
				</#if>
				<a href="<@getURL text=url page=totalPage />">尾页</a>
			</li>
			<li class="pagebar_gp"><input type="text" value="" class="pagebar_gp_textbox" /><input type="button" value="go" class="pagebar_gp_button" onclick="pagebar_gotoPage(this)"/></li>
		</ul>
	</div>
	<script type="text/javascript">
		function pagebar_gotoPage(btn) {
			if(!btn || !btn.previousSibling)
				return;
			var pno = btn.previousSibling.value;
			if(!pno || !/^[1-9]+[0-9]*$/.test(pno))
				pno = 1;
			else
				pno = parseInt(pno);
			if(pno>${totalPage})
				pno = ${totalPage};
			var currUrl = window.location.href;
			if(!currUrl)
				return;
			var pos = currUrl.indexOf("?");
			if(pos<=0) {
				var forwardUrl = currUrl+"?pageNo="+pno;
				window.location.href = forwardUrl;
				return;
			}
			var params = currUrl.substring(pos+1);
			var realUrl = currUrl.substring(0,pos);
			var paramArray = params.split("&");
			for(var i=0;i<paramArray.length;i++) {
				if(/^pageNo=.*$/i.test(paramArray[i])) {
					paramArray[i] = "pageNo="+pno;
					break;
				}
			}
			window.location.href = realUrl+"?"+paramArray.join("&");
		}
	</script>
	<!--================分页工具条结束================--><#rt/>
</#if>

<#--产生动态URL的宏-->
<#macro getURL text page>   
    <#if (text?index_of("?")>0)>   
        <#lt/>${text?replace("?","?pageNo="+page)}<#rt/>
    <#else>   
        <#lt/>${text}?pageNo=${page}<#rt/>
    </#if>      
</#macro>


在JSP中引用这个标签,其中pageNo是分页参数的名字,pageSize是每页显示的条目数量,totalRecord是总记录数,这些参数是从action传过来的。另外还接受一个可选的参数style,这个参数用来指出使用哪个模板,style缺省时会使用pagebar_basic.ftl这个模板。
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="l" uri="/lowca-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE-EmulateIE7" />
	<title>分页工具条模板</title>
</head>
<body>
	<l:pagebar pageNo="${param.pageNo}" url="${webroot }/test.jsp" pageSize="10" totalRecord="4000"></l:pagebar>
</body>
</html>




缺点和不足:

点击跳页功能存在不足,当一个页面有多个分页工具条时候,可能会出问题。
分享到:
评论

相关推荐

    Struts+Hibernate+Sprign 通用分页

    具有实现了数字分页工具栏的分页的功能 可以通过多种方式分页 1,普通的上一页,下一页 2,下拉框 3,比较复杂的数字分页工具栏的分页 通用Hibernate Dao 最后真心话! 力行 一个星期完成! 第一次 心血之作 ...

    struts+hibernate的通用分页程序

    ### Struts + Hibernate 的通用分页程序 #### 一、背景与概述 在现代Web开发中,分页是一项常见的功能需求。特别是在展示大量数据时,为了提高用户体验和系统性能,通常会采用分页技术来逐步加载数据。Struts 和 ...

    struts+spring+hibernate通用分页方法

    这个“struts+spring+hibernate通用分页方法”是关于如何在整合这三大框架的项目中实现高效且可复用的分页功能的知识点。 首先,让我们了解分页的基本概念。在Web应用中,特别是在处理大数据量时,分页是一种提高...

    SSH 通用分页插件

    SSH 通用分页插件是一种在Java开发中用于处理数据分页显示的工具,尤其在基于Struts2、Spring和Hibernate(SSH)的Web应用程序中非常常见。SSH框架结合了Struts2的MVC设计模式、Spring的依赖注入以及Hibernate的对象...

    关于Struts+Hibernate分页的例子

    对于分页的文本(如“上一页”、“下一页”等),可以使用Struts2的资源包(Resource Bundle)进行国际化处理,使应用更具通用性。 7. **测试和优化**: 完成以上步骤后,进行单元测试和集成测试,确保分页功能...

    基于hibernate_mysql分页通用源码

    【描述】中提到的"通用分页工具",通常会包含一个工具类或服务,用于处理数据的分页查询。开发者只需要传入必要的参数(如当前页、每页记录数等),就可以获取到分页结果,同时工具可能还会提供动态生成分页链接等...

    jsp页面数据分页通用组件

    `jsp页面数据分页通用组件`就是这样一个工具,它为开发者提供了便捷的方式来实现这一功能。这个组件适用于所有基于Struts或者纯JSP+JavaBean的项目,具有高度的可复用性和可扩展性。 1. **分页原理** 数据分页主要...

    Struts1 增删改查+分页

    在本项目"Struts1 增删改查+分页"中,我们将深入探讨如何利用Struts1实现对数据的基本操作以及分页显示。 1. **Struts1基础**: - **Action类**:是Struts1的核心,用于接收用户请求并执行业务逻辑。每个Action类...

    ssh分页经典代码

    SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架,它整合了Struts的MVC模式、Spring的依赖注入以及Hibernate的对象关系映射,为开发者提供了强大的开发工具。在SSH框架中实现分页功能是一项常见的...

    ssh三大框架通用配置

    Struts配置中,Action需要接收并处理分页参数(如当前页和每页条数),并将这些参数传递给Service层。 **总结** SSH通用配置的核心在于理解这三个框架如何协作,以及如何在XML配置文件中定义和连接它们的各个组件。...

    ssh.zip_SSH分页_ssh的分页实现

    5. **Struts2的拦截器**:Struts2的拦截器可以用来处理通用逻辑,比如分页的参数校验、预处理和后处理。你可以自定义一个拦截器,专门处理分页相关的逻辑,比如计算总页数、设置默认值等。 6. **JSP视图展示**:...

    围绕分页的练习(2)(ssh+freemarker)

    在这个“围绕分页的练习(2)(ssh+freemarker)”中,我们将探讨如何在SSH(Struts2、Spring、Hibernate)框架下结合FreeMarker模板引擎实现分页功能。SSH是一个流行的企业级Java开发框架,它提供了模型-视图-控制器...

    SSH分页

    在实际项目中,为了提高代码复用性和易维护性,我们还可以创建一个通用的分页工具类或者服务,封装分页逻辑,使其可以在不同的Action和模型中重复使用。此外,考虑性能优化,我们还可以实现缓存策略,如使用Spring的...

    基于java的分页技术

    - **Spring**:负责管理Bean,可以创建一个通用的分页Service,供其他业务Service调用。 - **Hibernate**:作为ORM工具,支持Criteria、HQL等查询方式实现分页。 **5. Spring Boot中的分页** Spring Boot简化了配置...

    java 数字分页很好用的呀

    2. **Java分页实现**: - **SQL查询**:在数据库层面,可以通过SQL的`LIMIT`(MySQL)或`OFFSET`(PostgreSQL, Oracle等)来实现分页。例如,`SELECT * FROM table LIMIT 10 OFFSET 20`会获取第21到30条记录。 - *...

    extjs做的增删改查

    - 分页工具栏(Paging Toolbar):用于分页显示大量数据。 - 按钮(Button):触发操作,如新增、删除、保存和取消。 2. **Struts2框架**: - 动作类(Action Class):处理用户请求,执行业务逻辑。 - 结果...

    J2EE电子商务系统开发从入门到精通--基于Struts和Hibernate技术实现

    - hbm2java工具可以将Hibernate映射文件转换为对应的Java实体类。 **3.8 分页显示的实现** - **3.8 分页显示的实现** - Hibernate提供了分页查询的支持,可以通过设置查询参数来实现分页。 #### 第四章 企业...

    javaweb通用组件

    JavaWeb通用组件是开发者在构建Web应用程序时经常会用到的一类工具,它们能够极大地提高开发效率,简化代码,提供友好的用户体验。以下是一些常见的JavaWeb组件及其详细说明: 1. **Calendar控件**: Calendar控件...

    newxy(新坐标)web快速开发包

    newxy是hibernate的替代者,是web快速开发...2.《web开发:通用持久类代替hibernate的持久类、通用动态formBean类代替struts的formBean类》http://dev.csdn.net/author/nlhlx/d4343e375a9d42e2b3402eaa549d225f.html

Global site tag (gtag.js) - Google Analytics