`
minzaipiao
  • 浏览: 148710 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SSH pager-taglib分页的实现

阅读更多
前两天只是把这个分页的代码传了上去,每页写太多的东西
况且本人文笔不是很好,误怪!

这个是我个人对分页的解决方案,其实就是在数据库底层做了分页查询
这套解决方案,是按照MVC的模式来做的,基于STRUTS框架。分为三个部分,表现层用的是JSP,其中用了JSTL和pager taglib做分页;控制层就是用的很传统的Action;底层就用的是Spring+Hibernate。下面分三个部分慢慢说:

说到分页:
1  首先新建一个PageModel类

package com.dengmin.oa.utils;

import java.util.List;

public class PageModel {

	/**
	 * 总记录数
	 */
	private int total;
	/**
	 * 当前页的记录集
	 */
	private List datas;

	public List getDatas() {
		return datas;
	}

	public void setDatas(List datas) {
		this.datas = datas;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}
}

2  底层是基于Spring+Hibernate来做的。在DAO这一层,为其增加两个方法,底层的分页查询用的是Hibernate提供的分页查询。
public interface UserDao {

	public void addUser(User user);

	/**
	 * 
	 * @param offset  从第几条记录开始查询
	 * @param pagesize  每页显示多少条记录
	 * @return
	 */
	public PageModel findAllUser(int offset, int pagesize);
}

3  UserDao的实现类
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

	public void addUser(User user) {
		this.getHibernateTemplate().save(user);
	}
	
	public PageModel findAllUser(int offset, int pagesize) {
		
		//得到总记录数
		String queryCountHql = "select count(*) from User";
		
		Query query = getSession().createQuery(queryCountHql);
		int total = ((Long)query.uniqueResult()).intValue();
		
		List datas = getSession().createQuery("from User")
					.setFirstResult(offset)
					.setMaxResults(pagesize)
					.list();
		//得到结果集
		PageModel pm = new PageModel();
		pm.setTotal(total);
		pm.setDatas(datas);
		
		return pm;
	}

}


ok!底层的实现工作就做好了

在控制层中UserAction从DispatchAction继承重写它的unspecified方法
通过spring注入UserDao 代码如下:
public class UserAction extends DispatchAction {

	private UserDao userDao;
	@Override
	protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		int offset = 0; 
		
		try {
			offset = Integer.parseInt(request.getParameter("pager.offset"));
		} catch (Exception e) {
		}
		//这里我按照每页显示10条
		PageModel pm = userDao.findAllUser(offset, 10);
		request.setAttribute("pm", pm);
		
		return mapping.findForward("success");
	}
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
}


spring中的配置如下
<!-- 配置sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
	</bean>
	<!-- 配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

	<!-- 配置事务的传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>


<bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<bean name="/userManager"
		class="com.dengmin.pager.actions.UserAction" scope="prototype">
		<property name="userDao" ref="userDao" />
	</bean>


最后是jsp页面做数据显示
这里采用了jstl和pager-taglib的标签库
首先将其引入:
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>


  <body>
    <h1>User Manager</h1>
    <hr/>
    
    <table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6">
    <tr bgcolor="#EFF3F7">
    	<TD align="center">ID</TD>
    	<TD align="center">名称</TD>
    	<TD align="center">密码</TD>
    	<TD align="center">地址</TD>
    	<TD align="center">创建时间</TD>
    	<TD align="center">相关操作</TD>
    	
    </tr>
    <c:if test="${!empty pm.datas}">
    	<c:forEach items="${pm.datas}" var="user">
    		<tr bgcolor="#EFF3F7">
    			<td align="center">${user.id }</td>
    			<td align="center">${user.username }</td>
    			<td align="center">${user.password}</td>
    			<td align="center">${user.address}</td>
    			<td align="center">${user.createTime }</td>
    			<td align="center">
    				修改
    				&nbsp; 
    				删除</td>
    		</tr>
    	</c:forEach>
    	</c:if>
    	 <c:if test="${empty pm.datas}">
	    <tr>
	    	<td colspan="5" align="center" bgcolor="#EFF3F7">
	    	没有找到相应的记录
	    	</td>
	    </tr>
	    </c:if>
    </table>
    <pg:pager url="userManager.do" items="${pm.total}" export="currentPageNumber=pageNumber">
	<pg:first>
		<a href="${pageUrl}">首页</a>
	</pg:first>
	<pg:prev>
		<a href="${pageUrl }">上一页</a>
	</pg:prev>
	<pg:pages>
		<c:choose>
			<c:when test="${currentPageNumber eq pageNumber}">
				<font color="red">${pageNumber }</font>
			</c:when>
			<c:otherwise>
				<a href="${pageUrl }">${pageNumber }</a>
			</c:otherwise>
		</c:choose>
	</pg:pages>
	<pg:next>
		<a href="${pageUrl }">下一页</a>
	</pg:next>
	<pg:last>
		<a href="${pageUrl }">尾页</a>
	</pg:last>
</pg:pager>
  </body>

预览效果:


最后附上pager-taglib的使用方法

pg:pager【这个标签用来设置分页的总体参数】重要参数说明:
url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数
items:总记录数,pager标签正是根据这个值来计算分页参数的
maxPageItems:每页显示的行数,默认为10
maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10

pg:first【第一页的标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 首页第一行的索引值
lastItem - 首页最后一行的索引值

pg:pre【上一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 前页第一行的索引值
lastItem - 前页最后一行的索引值

pg:next【下一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 下页第一行的索引值
lastItem - 下页最后一行的索引值

pg:last重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 尾页第一行的索引值
lastItem - 尾页最后一行的索引值

pg:pages【这个标签用来循环输出页码信息】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - pageNumber这个页码指定的那一页的第一行的索引值
lastItem - pageNumber这个页码指定的那一页的最后一行的索引值


源代码前两天已经上传过了需要的到这里下载http://minzaipiao.iteye.com/blog/293480
分享到:
评论
11 楼 aa00aa00 2009-11-20  
myreligion 写道
挺不错的,不过分页楼主的配置太复杂了,想象一下每个页面都弄那么大量的代码是没有必要的。

分页我也设计过,感觉要更简洁一些,看看这种方法思路是否有用:http://www.guzz.org/wiki/TagLib#%E7%BF%BB%E9%A1%B5%E6%9F%A5%E8%AF%A2


看了一下您的提供的这个,分页,也是一个标签,没有怎么用过,能不能提供一个详细的例子,谢谢.
10 楼 myreligion 2009-11-20  
挺不错的,不过分页楼主的配置太复杂了,想象一下每个页面都弄那么大量的代码是没有必要的。

分页我也设计过,感觉要更简洁一些,看看这种方法思路是否有用:http://www.guzz.org/wiki/TagLib#%E7%BF%BB%E9%A1%B5%E6%9F%A5%E8%AF%A2
9 楼 aa00aa00 2009-11-19  
这贴我收藏了,谢谢了!!
8 楼 aa00aa00 2009-11-19  
楼主的代码,我已经成功运行了,写的不错,谢谢了.
7 楼 minzaipiao 2009-06-11  
wussrc 写道

谢谢楼主分享,代码下载过了,也运行过了,虽然代码不多,不过还是学到了不少的新东西,给楼主提个问题,我下载了该代码在运行实例时,出现了一点问题,如果将pagesize参数设置为10,则能够正常分页,但是如果将pagesize参数设置为其他的值(除了10以外的任何值)分页会有问题,不知道楼主是否做过测试? 该控件的&lt;pg:pager&gt;中有一个属性maxPageItems,默认值为10,楼主已经贴出来了,所以当你的pagesize参数的值不是10的时候,而该控件中的maxPageItems属性默认还是10,这时的分页显示就会出现问题,所以当改变每页显示条数的时候需要更改maxPageItems属性!~请楼主测试一下!


是的
你设置了maxPageItems=10
但是在后台的UserAction里我指设置我每夜显示10条

//这里我按照每页显示10条  
        PageModel pm = userDao.findAllUser(offset, 10);  
6 楼 li445970924 2009-06-09  
楼主是不是把那个 自定义的.tld文件 做成jar包了
5 楼 Blithe 2009-06-07  
这个好像只能设置为10
设置其他的要出问题
楼主是怎么解决的
4 楼 wussrc 2009-06-06  
谢谢楼主分享,代码下载过了,也运行过了,虽然代码不多,不过还是学到了不少的新东西,给楼主提个问题,我下载了该代码在运行实例时,出现了一点问题,如果将pagesize参数设置为10,则能够正常分页,但是如果将pagesize参数设置为其他的值(除了10以外的任何值)分页会有问题,不知道楼主是否做过测试?
该控件的<pg:pager>中有一个属性maxPageItems,默认值为10,楼主已经贴出来了,所以当你的pagesize参数的值不是10的时候,而该控件中的maxPageItems属性默认还是10,这时的分页显示就会出现问题,所以当改变每页显示条数的时候需要更改maxPageItems属性!~请楼主测试一下!
3 楼 苏茂林 2009-03-05  
来踩踩
2 楼 qq6518980 2009-01-21  
能理解,不过可以做成通用的分页吗?
1 楼 kevin-qingzhan 2009-01-04  
哇,正是我想要的,内容详细,通俗易懂。真是太谢谢兄弟了!

相关推荐

    ssh2+pager-taglib实现自动分页

    Pager-taglib,支持多种风格的分页显示。实际上她是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合,会形成多种不一样的分页页面,风格各异,她自带的DEMO就有七种左右的分页风格...

    使用pager-taglib实现分页显示的详细步骤

    本文将详细介绍如何利用`pager-taglib`结合SSH(Struts、Spring、Hibernate)框架实现从前端到后端的分页功能。 #### 一、准备工作 在开始之前,确保项目环境中已经引入了Struts、Spring、Hibernate以及`pager-...

    ssh+分页(pager-taglib)

    本资源融合了struts+spring+hibernate的集成,并充分运用jsp开源分页标签(pager-taglib)进行了分页。支持多条件的分页查询。由于上传大小限制,本人被迫将所用到的jar包目录删除,所需的几个必备jar包我已留在本...

    pager-taglib实现Google分页

    本主题将深入探讨如何利用pager-taglib库实现类似于Google的高效分页效果,该库是基于Spring、Struts和Hibernate(SSH)框架的。下面我们将详细讲解相关知识点。 首先,** pager-taglib **是一个自定义的JSP标签库...

    ssh+pager taglib分页实现

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而`pager`则是分页功能的一种实现。在这个主题中,我们将深入探讨如何在SSH框架下使用`pager`标签库来实现高效的分页显示。首先,...

    SSHConformity【display标签和taglib标签缺架包】,ssh整合,分页,display标签,pager-taglib标签

    总的来说,SSHConformity项目展示了如何通过SSH整合实现企业级应用,而Display Tag和Pager Taglib的使用则优化了数据展示和分页操作,提高了用户体验。在实际开发中,理解并掌握这些技术将有助于构建高效、易维护的...

    S2SH整合pager-taglibs示例

    本示例主要关注的是如何在Struts2框架中整合`pager-taglibs`,它是一个强大的分页标签库,能够帮助开发者在页面上轻松实现数据的分页展示,提升用户体验。`pager-taglibs`使得在JSP页面中处理大量数据变得更加简洁...

    OA pagertaglib ssh2 增删改查

    本项目以“OA pagertaglib ssh2 增删改查”为主题,涉及到的关键技术包括SSH2框架、PagerTaglib分页库以及增删改查的基础操作。 首先,SSH2是指Spring、Struts2和Hibernate这三个开源框架的组合,它们是Java Web...

    java学生成绩管理系统源码数据库 MySQL源码类型 WebForm

    JAVA学生成绩管理系统源码 开发语言:JAVA, 框架:SSH+Mysql+jsp (struts2 + spring + hibernate) 带有Mysql数据库和漂亮的后台管理功能 ... 分页使用的是pager-taglib框架 7. 后台登陆使用的是frameset框架

    Pager Tag Lib分页操作源码

    Pager Tag Lib库就是一种用于实现分页功能的标签库,它可以极大地简化开发者的工作,无需编写复杂的分页算法。本篇文章将深入探讨Pager Tag Lib在SSH2(Spring、Struts2、Hibernate2)框架中结合JSTL的使用方法和...

    标签: OA 项目 SSH2 增删改查

    分页功能是大型系统中常见的需求,本项目利用了pager-taglib库来实现这一功能。Pager-taglib是基于JSP标签库的一种分页工具,它可以在页面上显示分页链接,同时处理分页请求,为查询结果进行分页显示。这种方式使得...

    企业管理OA系统

    "分页利用了pager-taglib",这意味着开发团队使用了自定义的JSP标签库来实现页面的分页显示。Pager-taglib通常提供了一种简便的方式来分页查询数据库,它可以帮助优化性能,避免一次性加载大量数据到页面,提高用户...

    OA 项目 SSH2 增删改查

    这个OA项目使用了`pager-taglib`标签库进行分页,这是一款基于JSTL的分页标签,它可以方便地在JSP页面中实现动态的分页效果,减轻服务器负载,提升用户体验。 6. **组织管理与人员管理**:在OA系统中,这两部分涉及...

    SSH集成所需要的jar包

    - `pager-taglib.jar`: 这个库提供了分页标签,方便在JSP页面中实现数据的分页显示。 这些jar包共同构成了SSH集成的基础,使得开发者可以构建出结构清晰、易于维护的Java Web应用程序。通过Struts处理用户请求,...

Global site tag (gtag.js) - Google Analytics