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

巴巴运动网商品交易系统对分页的封装

 
阅读更多

本文参考传智播客巴巴运动网视频教程

 

首先创建一个QueryResult类来存放结果集和总记录数:package cn.aaron.bean;

import java.util.List;

public class QueryResult<T> {
	private List<T> resultlist;
	private long totalrecord;
	
	public List<T> getResultlist() {
		return resultlist;
	}
	public void setResultlist(List<T> resultlist) {
		this.resultlist = resultlist;
	}
	public long getTotalrecord() {
		return totalrecord;
	}
	public void setTotalrecord(long totalrecord) {
		this.totalrecord = totalrecord;
	}
}

 

 

接下来在DaoSupport类里面添加如下方法:

 

/**
	 * 分页获取记录
	 * @param firstindex  开始索引,如果输入值为-1,即获取全部数据
	 * @param maxresult  每页获取的记录数,如果输入值为-1,即获取全部数据
	 * @param wherejpql  条件语句,不带where关键字,条件语句只能使用位置参数,位置参数索引以1开始,如:o.username=?1 and o.password=?2
	 * @param params 条件语句出现的位置参数
	 * @param orderby 排序,Key为排序属性,Value为asc/desc
	 */
	@Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
	public QueryResult<T> getScrollData(int firstindex, int maxresult
			, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {
		QueryResult qr = new QueryResult<T>();
		String entityname = getEntityName(this.entityClass);
		Query query = em.createQuery("select o from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "where "+ wherejpql)+ buildOrderby(orderby));
		setQueryParams(query, queryParams);
		if(firstindex!=-1 && maxresult!=-1) query.setFirstResult(firstindex).setMaxResults(maxresult);
		qr.setResultlist(query.getResultList());
		query = em.createQuery("select count("+ getCountField(this.entityClass)+ ") from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "where "+ wherejpql));
		setQueryParams(query, queryParams);
		qr.setTotalrecord((Long)query.getSingleResult());
		return qr;
	}
	
	protected static void setQueryParams(Query query, Object[] queryParams){
		if(queryParams!=null && queryParams.length>0){
			for(int i=0; i<queryParams.length; i++){
				query.setParameter(i+1, queryParams[i]);
			}
		}
	}
	/**
	 * 组装order by语句
	 * @param orderby
	 * @return
	 */
	protected static String buildOrderby(LinkedHashMap<String, String> orderby){
		StringBuffer orderbyql = new StringBuffer("");
		if(orderby!=null && orderby.size()>0){
			orderbyql.append(" order by ");
			for(String key : orderby.keySet()){
				orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");
			}
			orderbyql.deleteCharAt(orderbyql.length()-1);
		}
		return orderbyql.toString();
	}
	/**
	 * 获取实体的名称
	 * @param <E>
	 * @param clazz 实体类
	 * @return
	 */
	protected static <E> String getEntityName(Class<E> clazz){
		String entityname = clazz.getSimpleName();
		Entity entity = clazz.getAnnotation(Entity.class);
		if(entity.name()!=null && !"".equals(entity.name())){
			entityname = entity.name();
		}
		return entityname;
	}
	
	protected static <E> String getCountField(Class<E> clazz){
		String out = "o";
		try {
			PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
			for(PropertyDescriptor propertydesc : propertyDescriptors){
				Method method = propertydesc.getReadMethod();
				if(method!=null && method.isAnnotationPresent(EmbeddedId.class)){					
					PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
					out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class")? ps[1].getName(): ps[0].getName());
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
        return out;
	}

 

 getScrollData是最主要的方法,可以对分页进行排序、加条件等等。

 

 我们可以讲getScrollData得到的值存放到下面这个类中,请注意这个类的注释以及相关方法的注释:

import java.util.List;

/**
 * 封装了Action向jsf所存放的一些数据
 * 该类最重要的是调用setQueryResult方法,他会连环设置该类其他属性的值。
 * @author bruce
 * @param <T>
 */
public class PageView<T> {
	/** 分页数据 **/
	private List<T> records;
	/** 页码开始索引和结束索引 **/
	private PageIndex pageindex;
	/** 总页数 **/
	private long totalpage = 1;
	/** 每页显示记录数 **/
	private int maxresult = 12;
	/** 当前页 **/
	private int currentpage = 1;
	/** 总记录数 **/
	private long totalrecord;
	/** 页码数量 **/
	private int pagecode = 10;
	/** 要获取记录的开始索引 **/
	public int getFirstResult() {
		return (this.currentpage-1)*this.maxresult;
	}
	public int getPagecode() {
		return pagecode;
	}

	public void setPagecode(int pagecode) {
		this.pagecode = pagecode;
	}

	/**
	 * 构造方法,要使用这个类,必须传进每页显示记录数和当前页。
	 * @param maxresult
	 * @param currentpage
	 */
	public PageView(int maxresult, int currentpage) {
		this.maxresult = maxresult;
		this.currentpage = currentpage;
	}
	
	/**
	 * 该方法存在一个连环的调用
	 * 将从数据库分页查询出来的总结果集和总记录数设置进来。
	 * 在设置总记录数的同时,会换算出总页数。详情参看setTotalrecord方法。
	 * 在设置总页数的同时,包含分页的开始索引和结束索引的PageIndex对象也确定了下来。详情参看setTotalpage方法。
	 * @param qr
	 */
	public void setQueryResult(QueryResult<T> qr){
		setRecords(qr.getResultlist());
		setTotalrecord(qr.getTotalrecord());
	}
	
	public long getTotalrecord() {
		return totalrecord;
	}
	/**
	 * 在设置总记录数的同时,会将总页数也设置进来。
	 * 在设置总页数的同时,包含分页的开始索引和结束索引的PageIndex对象也确定了下来。
	 * @param totalrecord
	 */
	public void setTotalrecord(long totalrecord) {
		this.totalrecord = totalrecord;
		setTotalpage(this.totalrecord%this.maxresult==0? this.totalrecord/this.maxresult : this.totalrecord/this.maxresult+1);
	}
	public List<T> getRecords() {
		return records;
	}
	public void setRecords(List<T> records) {
		this.records = records;
	}
	public PageIndex getPageindex() {
		return pageindex;
	}
	public long getTotalpage() {
		return totalpage;
	}
	public void setTotalpage(long totalpage) {
		this.totalpage = totalpage;
		this.pageindex = PageIndex.getPageIndex(pagecode, currentpage, totalpage);
	}
	public int getMaxresult() {
		return maxresult;
	}
	public int getCurrentpage() {
		return currentpage;
	}
}

 PageView用到了一个类PageIndex:

/**
 * 此类有一个静态方法,返回带有分页的开始索引和结束索引值的对象
 */
public class PageIndex {
	private long startindex;
	private long endindex;
	
	public PageIndex(long startindex, long endindex) {
		this.startindex = startindex;
		this.endindex = endindex;
	}
	public long getStartindex() {
		return startindex;
	}
	public void setStartindex(long startindex) {
		this.startindex = startindex;
	}
	public long getEndindex() {
		return endindex;
	}
	public void setEndindex(long endindex) {
		this.endindex = endindex;
	}
	
	/**
	 * 静态方法来获取分页的开始索引和结束索引的值
	 * @param viewpagecount 分页栏总共显示多少个页码
	 * @param currentPage 当前页码值
	 * @param totalpage 总共页码值
	 * @return 带有开始索引和结束索引的页码对象
	 */
	public static PageIndex getPageIndex(long viewpagecount, int currentPage, long totalpage){
			long startpage = currentPage-(viewpagecount%2==0? viewpagecount/2-1 : viewpagecount/2);
			long endpage = currentPage+viewpagecount/2;
			if(startpage<1){
				startpage = 1;
				if(totalpage>=viewpagecount) endpage = viewpagecount;
				else endpage = totalpage;
			}
			if(endpage>totalpage){
				endpage = totalpage;
				if((endpage-viewpagecount)>0) startpage = endpage-viewpagecount+1;
				else startpage = 1;
			}
			return new PageIndex(startpage, endpage);		
	}
}

 前台jsp的封装如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<font color="#FFFFFF">
    当前页:第${pageView.currentpage}页 | 总记录数:${pageView.totalrecord}条 | 每页显示:${pageView.maxresult}条 | 总页数:${pageView.totalpage}页</font> 
<c:forEach begin="${pageView.pageindex.startindex}" end="${pageView.pageindex.endindex}" var="wp">
    <c:if test="${pageView.currentpage==wp}"><b><font color="#FFFFFF">第${wp}页</font></b></c:if>
    <c:if test="${pageView.currentpage!=wp}"><a href="javascript:topage('${wp}')" class="a03">第${wp}页</a></c:if>
</c:forEach>

 倒数第二行用到了a href="javascript:topage('${wp}')"而不是直接写链接地址,这是因为这个jsp是封装好的,以后别的jsp调用就可以直接写一个topage的js方法来将链接地址写入。

分享到:
评论

相关推荐

    巴巴运动网分页jar包

    【巴巴运动网分页jar包】是专门为黑马babsport运动网站设计的一个组件,它包含了实现动态分页功能的相关代码和资源。在Web开发中,分页是一种常见的数据展示方式,尤其是在处理大量数据时,可以有效地提高用户体验,...

    巴巴运动网分页jar和品牌数据库结构数据

    本压缩包“巴巴运动网分页jar和品牌数据库结构数据”包含了这两个方面的内容,为开发者提供了一套完整的解决方案。 首先,让我们来讨论一下数据库部分。在描述中提到的“品牌brand类对应的数据库结构”,这指的是...

    巴巴运动网商品交易系统详细设计说明书

    ### 巴巴运动网商品交易系统详细设计说明书关键知识点解析 #### 一、概述 **巴巴运动网商品交易系统**是一款专为大型企业设计的在线商品交易平台,旨在帮助企业高效管理和运营电子商务活动。该系统不仅提供了商品...

    巴巴运动商城page分页的jar包

    在IT行业中,分页是网页应用中不可或缺的功能,特别是在大型电商平台如巴巴运动商城这样的系统中。这个"巴巴运动商城page分页的jar包"显然包含了实现分页功能所需的类库和资源,对于开发者来说,是一个非常实用的...

    巴巴运动网源码和jar文件

    巴巴运动网源码和jar文件,完整的源码和用到的jar文件。工程配置后可直接运行。。。

    新巴巴运动网page包

    "新巴巴运动网page包"是一个专门为传智播客的新巴巴运动网项目设计的分页功能组件。这个组件被封装在一个压缩包中,方便开发者下载并直接放入Maven的本地仓库,以便在项目中快速引入和使用。Maven本地仓库是Java开发...

    巴巴运动网原码

    通过对巴巴运动网源码的分析,我们可以学习到实际项目中的最佳实践,提升自己的编程技能和项目管理能力。同时,也能为改进现有网站、开发类似平台或者进行二次开发提供参考和灵感。对于开发者来说,这是一份宝贵的...

    百度云 2016年版新巴巴运动网项目12天完整视频教程以及源码

    根据提供的文件信息,我们可以推断出这是一套关于“新巴巴运动网”项目的视频教程及相关源码资料。接下来,我们将围绕这个项目的背景、教程内容、技术栈等方面进行深入解析。 ### 项目背景 “新巴巴运动网”项目...

    59_传智播客巴巴运动网_测试产品的分页列表功能

    本话题主要关注"59_传智播客巴巴运动网_测试产品的分页列表功能",这显然涉及到一个具体的教学或项目实践,目标是教会学员如何实现和测试网页应用中的分页功能。 首先,我们来理解分页列表的基本概念。在网页上,...

    巴巴运动网 部分 前端代码

    5. AJAX(Asynchronous JavaScript and XML):为了提供无刷新的用户体验,巴巴运动网可能使用了AJAX技术来异步加载数据,比如在用户滚动时加载更多内容,或者在不刷新页面的情况下更新信息。 6. SEO优化:前端代码...

    巴巴运动网源码巴巴运动网源码

    【巴巴运动网源码】是一个基于Java开发的分布式系统,其设计和实现充分展示了现代互联网应用的高效能和可扩展性。在当前的数字化时代,此类源码对于开发者来说是一份宝贵的参考资料,可以帮助他们理解大型网站的架构...

    传智巴巴运动网源代码[两个模块]

    更重要的是巴巴运动网是真正的商业化产品(售价12万元),它溶合了作者多年积累的商务网站运营及软件构架经验,是目前为数不多的集网站运营、业务处理及技术于一身的商品交易系统。是网上流传的商城系统无法比拟的。

    巴巴运动网 lib3

    【巴巴运动网 lib3】是源自巴巴运动网的一个开源项目,该项目主要包含了lib3相关的代码库,为开发者提供了丰富的功能和资源,旨在促进运动类应用的开发与创新。这个源码下载提供了深入学习和理解运动类应用开发的...

    巴巴运动网 基于分布式构架的大型商品交易平台

    巴巴运动网 基于分布式构架的大型商品交易平台,系统围绕一个业务中心的思想,实现了多种类型的客户端应用,如:基于浏览器的web交易系统,基于手机的wap交易系统,用于内部办公的OA系统,像这些系统都使用了同一个...

    巴巴运动网详细设计说明书

    巴巴运动网商品交易系统是一套面向大型企业开发的商品交易系统,具备先进的电子商务运营及管理理念。订单流转实现多部门协同处理,满足大型企业多部门协作处理业务的需求。系统包含以下模块: 产品管理:产品具有...

    巴巴运动网源码(传智播客)

    1. **Java Web开发**:巴巴运动网源码的编写语言是Java,这表明它是基于Java Web技术栈构建的,可能包括Servlet、JSP、JavaBean等组件,用于处理HTTP请求、展示动态内容和封装业务逻辑。 2. **MVC架构**:通常,...

    巴巴运动网 lib1

    "巴巴运动网 lib1" 提供的jar包很可能是为开发者提供的一种库或者服务,方便他们在开发过程中调用相关的功能或实现。下面我们将深入探讨与jar包相关的知识点,以及如何利用它进行开发和学习。 首先,Java的jar文件...

    传智播客巴巴运动网-项目中使用到的jar文件

    本项目“传智播客巴巴运动网”中使用的jar文件集合,显然是该项目运行所必需的依赖库。这些库包含了各种功能的实现,如网络通信、数据处理、UI组件等,对于理解和构建该项目至关重要。 首先,我们需要理解jar文件的...

    巴巴运动网源代码-完整版

    巴巴运动网的源代码设计涵盖了电子商务网站的关键模块,包括但不限于前端用户界面、后台管理、商品展示、购物车、订单处理、用户注册与登录等。 1. **前端用户界面**:前端部分是用户与网站交互的窗口,源代码可能...

Global site tag (gtag.js) - Google Analytics