`
aiaiya
  • 浏览: 42440 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

结合SpringSide与extremecomponents的数据库分页、排序和过滤

    博客分类:
  • java
阅读更多
首先,需要在ec:table标签中设置
filterable="true"
filterRowsCallback="limit"
retrieveRowsCallback="limit"
sortRowsCallback="limit"


在StrutsEntityAction类添加一个方法
public ActionForward doQuery(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
	T obcect = null;
	try {
		obcect = entityClass.newInstance();
	} catch (InstantiationException e) {
		log.error(e);
	} catch (IllegalAccessException e) {
		log.error(e);
	}
	bindEntity(form, obcect);

	// 当列表的分页 过滤 排序等操作是基于数据库时,必须要用到Limit对象.
	// 注意,当页面有多个ec的时候,需要使用带 tableId参数的同名方法.
	Limit limit = ExtremeTablePage.getLimit(request);
	// 基于数据库的排序.
	// ec会取得排序的相关信息:当前是按哪个(目前只支持单列排序)column排序的,以及排序的方式desc或asc,
	Sort sort = limit.getSort();
	Map<String, String> sortValueMap = sort.getSortValueMap();  //此方法可自行封装
	if (sortValueMap.isEmpty()) {
		sortValueMap.put(idName, TableConstants.SORT_ASC);
	}
	// 基于数据库过滤.
	// ec会取得过滤的相关信息:当前是对哪些column进行过滤,以及过滤的内容是什么
	FilterSet filterSet = limit.getFilterSet();
	Map<String, String> filterPropertyMap = filterSet.getPropertyValueMap();  //此方法可自行封装
	// DEFAULT_PAGE_SIZE ==0 时, 每页记录数会使用 properties文件内的默认设置
	// DEFAULT_PAGE_SIZE <0 时, 每页记录数会等于全部记录数
	int totalRows = ExtremeTablePage.getTotalRowsFromRequest(request);
	if (totalRows < 0) {
		// 取得记录总条数时,不要忘了把filter作为参数传入,因为要取得的总行数也是要接受条件限制的.
		totalRows = getEntityManager().FindTotalEntitys(obcect, filterPropertyMap);
	}
	limit.setRowAttributes(totalRows, DEFAULT_PAGE_SIZE);
	//保存总计行数到返回
	request.setAttribute(TableConstants.TOTAL_ROWS, totalRows);
	// 取得当前要查询的页面的记录起止行号
	// offset表示数据编号的起始号,不同的数据库起始号不一样
	int offset = 0;
	int[] rowStartEnd = new int[] { limit.getRowStart() + offset, limit.getRowEnd() + offset };
	// rowStartEnd[0], rowStartEnd[1] 左闭 右开
	List list = (List) getEntityManager().FindEntitysForPage(rowStartEnd[0], rowStartEnd[1], obcect, sortValueMap, filterPropertyMap);

	request.setAttribute(getEntityListName(), list);
	return mapping.findForward(LIST);
}

其中应用到ExtremeTablePage类
/**
 * ec组件的工具类
 * 
 * @author peter
 * 
 */
public class ExtremeTablePage {
	public static Limit getLimit(HttpServletRequest request) {
		Context context = new HttpServletRequestContext(request);
		LimitFactory limitFactory = new TableLimitFactory(context);
		TableLimit limit = new TableLimit(limitFactory);
		return limit;
	}

	public static String getTableId(HttpServletRequest request) {
		return getTableId(request, null);
	}

	public static int getTotalRowsFromRequest(HttpServletRequest request) {
		return getTotalRowsFromRequest(request, null);
	}

	public static int getTotalRowsFromRequest(HttpServletRequest request, String cTableId) {
		int totalRows = -1;
		String tableId = getTableId(request, cTableId);
		tableId = tableId == null ? "" : tableId + "_";
		Integer totalRowsI = (Integer) request.getAttribute(tableId + TableConstants.TOTAL_ROWS);
		try {
			if (totalRowsI != null) {
				totalRows = totalRowsI.intValue();
			} else {
				String totalRowsS = request.getParameter(tableId + "totalrows");
				totalRows = Integer.parseInt(totalRowsS);
			}
		} catch (Exception e) {
			totalRows = -1;
		}
		totalRows = totalRows < 0 ? -1 : totalRows;
		return totalRows;
	}

	public static String getTableId(HttpServletRequest request, String cTableId) {
		if (cTableId != null) {
			return cTableId;
		}
		String tableId = request.getParameter(TableConstants.EXTREME_COMPONENTS_INSTANCE);
		if (tableId == null) {
			tableId = TableConstants.EXTREME_COMPONENTS;
		}
		return tableId;
	}
}


在HibernateEntityDao类添加两个方法
public Integer FindTotalEntitys(T object, Map<String, String> filter) {
	Criteria criteria = createCriteria();
	if (filter != null && !filter.isEmpty()) {
		Set<String> filterNameSet = filter.keySet();
		for (String name : filterNameSet) {
			criteria.add(Restrictions.like(name, "%" + filter.get(name) + "%"));
		}
	}
	return (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
}

public List<T> FindEntitysForPage(int startRow, int countPerPage, T object, Map<String, String> order, Map<String, String> filter) {
	Criteria criteria = createCriteria();
	if (order != null && !order.isEmpty()) {
		Set<String> orderNameSet = order.keySet();
		for (String name : orderNameSet) {
			if ("asc".equalsIgnoreCase(order.get(name))) {
				criteria.addOrder(Order.asc(name));
			} else {
				criteria.addOrder(Order.desc(name));
			}
		}
	}
	if (filter != null && !filter.isEmpty()) {
		Set<String> filterNameSet = filter.keySet();
		for (String name : filterNameSet) {
			criteria.add(Restrictions.like(name, "%" + filter.get(name) + "%"));
		}
	}
	return criteria.setFirstResult(startRow).setMaxResults(countPerPage - startRow).list();
}

如此便可实现基本的功能。
分享到:
评论

相关推荐

    SpringSide3的PropertyFilter条件过滤应用小结

    它通常与DAO层结合使用,帮助我们在服务层进行数据筛选,避免在数据库层面进行复杂的查询,提高代码的可维护性和灵活性。 2. **工作原理** PropertyFilter的工作原理是接收一组由用户指定的过滤条件(比如,属性名...

    springside5

    1. **更换MySQL数据库**:SpringSide5项目将原有的数据库系统替换成了MySQL,这是一个广泛使用的开源关系型数据库管理系统,具有良好的性能和可扩展性。这种更换可能涉及到数据库设计、SQL查询优化以及事务处理等...

    springside开发全面讲解

    8. **持续集成**:与Jenkins、Git等工具集成,springside支持持续集成和版本控制,方便团队协作。 9. **测试支持**:springside鼓励单元测试和集成测试,使用JUnit和Mockito等工具,确保代码的健壮性。 在学习...

    springside-3.2.2源码

    《SpringSide 3.2.2 源码解析与技术深度探讨》 SpringSide 是一个基于 Spring Framework 的 Java 开发工具集,旨在简化 Spring 应用程序的开发过程,提供一套快速、现代且规范的开发实践。SpringSide 3.2.2 版本是...

    springside3.0.zip

    总结起来,SpringSide 3.0 是一个全面的Java开发平台,结合了Spring框架的强大功能和其他优秀开源组件,为开发者提供了一个高效、易用的开发环境。理解并掌握SpringSide 3.0 的核心知识点,对于提升Java企业级应用的...

    springside3.3完整版

    在SpringSide 3.3中,你可以直接导入这些脚本,快速构建项目的数据库结构和填充初始数据,大大节省了项目启动的时间。 4. **Spring Framework核心概念** SpringSide 3.3基于Spring Framework,因此理解Spring的...

    有springside4.2.3-GA.jar 包

    2. **Demo**:示例模块,提供了各种应用场景的实例,帮助开发者快速理解和使用SpringSide的各项功能,包括数据库操作、RESTful API开发、Maven构建等。 3. **Module**:模块化设计,SpringSide提供了多个可复用的子...

    springside3与传统ssh区别

    - 在传统SSH框架中,实体类和数据库之间的映射主要通过XML文件(如`.hbm.xml`)完成,这使得实体类代码与映射逻辑分离,但同时也增加了维护成本。 #### 2. Entity 对象 **Springside3:** - **实体类:** 在...

    SpringSide4 参考手册

    SpringSide4参考手册是一份详尽的文档,涵盖了使用SpringSide4.0版本开发应用时可能会用到的各种技术组件和模块。SpringSide是一个开源的Java开发平台,它集成了Spring框架和大量实用的组件,以方便开发人员构建复杂...

    springside全攻略

    同时,SpringSide支持与Jenkins等持续集成工具的集成,实现自动化构建和部署。 九、示例项目 在"springside"这个压缩包文件中,包含了各种示例项目的源码,这些项目覆盖了SpringSide的各个功能点,如基本的CRUD操作...

    Springside-core-4.1.0/Springside-core-4.1.0

    2. **构建工具**:SpringSide-core-4.1.0使用Maven作为主要的构建工具,提供了一套标准的项目结构和配置,使得项目的构建和部署变得更加简单。 3. **代码生成器**:内含代码生成器工具,可以帮助开发者快速生成常见...

    Springside4 学习整理

    - Mapper:包含 BeanMapper、JaxbMapper 和 JsonMapper,分别用于 Bean 之间的深度转换、XML 与 Java 对象的映射以及 JSON 数据的序列化和反序列化。 - Persistence:包括 DynamicSpecifications、Hibernate 和 ...

    springside3.3.4 使用方法

    ### springside3.3.4使用方法与SSH整合详解 #### 一、Springside简介 Springside项目是基于Spring框架的一个应用架构示例,它提供了一套完整的开发模式来构建企业级Java Web应用程序。Springside 3.3.4版本作为一...

    springside-core-4.2.2.GA相关jar包

    3. **自动化构建工具**:SpringSide通常与Maven或Gradle等自动化构建工具结合使用,以管理项目的依赖关系和构建过程。在4.2.2.GA版本中,可能已经优化了这些集成,确保开发者可以轻松地构建和测试项目。 4. **代码...

    springside框架

    在SpringSide中,Hibernate被用来处理数据库交互,通过定义对象实体和映射文件,实现了数据的透明访问。开发者不再需要关注底层的SQL细节,可以专注于业务逻辑的实现。 三、Struts2的MVC模式优雅演绎 Struts2作为...

    springside的一个应用实例

    模型层通常包含业务逻辑和数据处理,SpringSide使用Java Bean作为数据模型,通过Hibernate或MyBatis等持久层框架与数据库交互。控制器层负责接收请求、调用模型并返回响应,SpringSide通过注解驱动的Spring MVC使得...

    springside

    《SpringSide:全面解析与应用》 SpringSide项目是一个基于Java的开源软件开发框架,它以Spring Framework为核心,旨在提供一套简洁、规范的项目构建和开发实践。在深入理解SpringSide之前,我们首先需要了解Spring...

    maven+springside 开发入门

    3. 接着,解压`springside4-4.2.3.GA.zip`,研究其项目结构和配置,了解如何结合Maven和Springside进行开发。 4. 最后,参考`springside+maven(入门).doc`,这是一个针对初学者的Maven和Springside入门教程,将指导...

    springside4-4.2.3.GA

    它使用Hibernate作为持久层框架,与数据库交互,提供了一套完整的ORM解决方案。对于前端,它采用了Bootstrap和jQuery,提供了现代且响应式的用户界面。 总结来说,SpringSide 4.2.3.GA是一个综合性的Java开发框架,...

Global site tag (gtag.js) - Google Analytics