`

SpringSide搜索功能的扩展

阅读更多

 

    SpringSide 很好很强大,整合了各式主流的、实用的、好玩的开源项目,非常值的学习。springSide3中有一个功能很实用、很方便、就是页面条件过滤(搜索)功能。由于springSide该功能目前只支持String类型的搜索,但在项目中仅仅只有String类型是远远不够的,所以自己就将其功能做了一些扩展。
     
   在扩展中需考滤以下几个问题:
     1、需将PropertyFilter类中的枚举MatchType扩展更多的属性比较类型。
     2、在构建Criterion对象时,由于由于PropertyFilte中的过滤的属性值都是通过request.getParameter(name)方式所获取,所以需将String类型的值转换成与过滤属性类型一致。
     3、要将String类型进行转换,首先需获得过滤属性的类型,属性单一时很好处理,如果为链方式时(如A.B.C.id),怎样处理?怎样来获取最后一个属性类型(id的类型),又假如属性是继承父类而来的又将怎样处理。

 

   围绕以上3点,我主要做了以下扩展:
    
     一、扩展PropertyFilter类中的枚举MatchType

public enum MatchType {
		EQ, LIKE, LT, LE, GT, GE;
	}

 

        添加了小于、小于等于、大于、大于等于.

     二、在ReflectionUtils类中添加获取过滤属性的类型方法

public static Class<?> getFieldType(Class<?> entityClass, String propertyName) {
		Assert.hasText(propertyName, "propertyName不能为空");
		Class<?> propertyType = null;
		try {
			if (StringUtils.contains(propertyName, ".")) {
				for (String str : propertyName.split("\\.")) {
					Field declaredField = getDeclaredField(entityClass, str);
					entityClass = declaredField.getType();
				}
				propertyType = entityClass;
			} else {
				propertyType = getDeclaredField(entityClass, propertyName).getType();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

		return propertyType;

	}
 

   
     三、在HibernateWebUtils类中添加值类型转换方法

public static Object convertValue(Object value, Class<?> toType) {
		Assert.notNull(value, "value不能为空");
		Object result = null;
		try {
			if (toType == Date.class) {
				result = DateUtils.parseDate((String) value, new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" });
			} else {
				result = OgnlOps.convertValue(value, toType);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return result;
	} 
	 
	public static Object convertValue(Object value, Class<?> entityClass, String propertyName) {
		return convertValue(value, ReflectionUtils.getFieldType(entityClass, propertyName));
	}
 

     四、重构HibernateDao类中的buildPropertyFilterCriterion方法

 

protected Criterion buildPropertyFilterCriterion(final String propertyName, final Object value,
			final MatchType matchType) {
		Assert.hasText(propertyName, "propertyName不能为空");
		Criterion criterion = null;
		Object pValue = null;
		try { 
			pValue = HibernateWebUtils.convertValue(value, entityClass, propertyName); 
			if (MatchType.EQ.equals(matchType)) {
				criterion = Restrictions.eq(propertyName, pValue);
			}
			if (MatchType.LIKE.equals(matchType)) {
				criterion = Restrictions.like(propertyName, (String) value, MatchMode.ANYWHERE);
			}
			if (MatchType.LT.equals(matchType)) {
				criterion = Restrictions.lt(propertyName, pValue);
			}
			if (MatchType.LE.equals(matchType)) {
				criterion = Restrictions.le(propertyName, pValue);
			}
			if (MatchType.GT.equals(matchType)) {
				criterion = Restrictions.gt(propertyName, pValue);
			}
			if (MatchType.GE.equals(matchType)) {
				criterion = Restrictions.ge(propertyName, pValue);
			} 
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return criterion;
	}

 

 

分享到:
评论
6 楼 flyliying 2009-12-04  
3.2.1已经看到完善了
/**
	 * 属性比较类型.
	 */
	public enum MatchType {
		EQ, LIKE, LT, GT, LE, GE;
	}

	/**
	 * 属性数据类型.
	 */
	public enum PropertyType {
		S(String.class), I(Integer.class), L(Long.class), N(Double.class), D(Date.class), B(Boolean.class);

		private Class<?> clazz;

		PropertyType(Class<?> clazz) {
			this.clazz = clazz;
		}

		public Class<?> getValue() {
			return clazz;
		}
	}

	private String[] propertyNames = null;
	private Class<?> propertyType = null;
	private Object propertyValue = null;
	private MatchType matchType = MatchType.EQ;

	public PropertyFilter() {
	}

	/**
	 * @param filterName 比较属性字符串,含待比较的比较类型、属性值类型及属性列表. 
	 *                   eg. LIKES_NAME_OR_LOGIN_NAME
	 * @param value 待比较的值.
	 */
	public PropertyFilter(final String filterName, final Object value) {

		String matchTypeStr = StringUtils.substringBefore(filterName, "_");
		String matchTypeCode = StringUtils.substring(matchTypeStr, 0, matchTypeStr.length() - 1);
		String propertyTypeCode = StringUtils.substring(matchTypeStr, matchTypeStr.length() - 1, matchTypeStr.length());
		try {
			matchType = Enum.valueOf(MatchType.class, matchTypeCode);
		} catch (RuntimeException e) {
			throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性比较类型.", e);
		}

		try {
			propertyType = Enum.valueOf(PropertyType.class, propertyTypeCode).getValue();
		} catch (RuntimeException e) {
			throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性值类型.", e);
		}

		String propertyNameStr = StringUtils.substringAfter(filterName, "_");
		propertyNames = StringUtils.split(propertyNameStr, PropertyFilter.OR_SEPARATOR);

		Assert.isTrue(propertyNames.length > 0, "filter名称" + filterName + "没有按规则编写,无法得到属性名称.");
		//按entity property中的类型将字符串转化为实际类型.
		this.propertyValue = ReflectionUtils.convertValue(value, propertyType);
	}
5 楼 nbaertuo 2009-09-18  
测试是否可以灌水!
4 楼 zhxing 2009-09-18  
感觉既然用了enum ,这么多if 语句不如用swtich 来的自然。。
3 楼 kaki 2009-09-18  
大家多发一些经典代码,让我们好好学习啊。
2 楼 h521999 2009-07-28  
嗯,应该会在3.15版中完善吧.
1 楼 godson_2003 2009-07-28  
白衣应该会完善这个扩展的

相关推荐

    基于ssm+mysql的花卉养殖知识平台源码数据库论文.docx

    3. 搜索引擎模块:该模块主要负责提供搜索功能,用户可以通过关键词来搜索相关的花卉知识。 4. 内容管理模块:该模块主要负责管理平台上的内容,包括文章、图片、视频等多种媒体形式。 5. 信息推广模块:该模块主要...

    J2EE程序员需掌握的技术

    J2EE程序员在当前的软件开发环境中扮演着重要的角色,他们需要掌握一系列广泛的技术和框架,以便能够构建高效、可扩展的企业级应用。以下是一些关键领域的详细说明: 1. **Web开发框架**:Web开发框架如JSF、Struts...

    JSP+SQL2000 企业电子商城

    - 商品分类和搜索功能,可能涉及到数据库索引优化。 - 数据库设计,包括表的规范化和关系设计。 总的来说,"JSP+SQL2000 企业电子商城"是一个涵盖了前端开发、后端开发、数据库管理和系统集成的综合项目,涉及众多...

    JSP+SQL2000 都市供求信息网

    3. 信息检索:提供关键字搜索、分类浏览等手段,帮助用户快速找到所需的信息。 4. 数据统计与分析:对供求信息进行统计,提供热门类别、地区等数据分析,为决策提供支持。 5. 系统管理:后台管理系统,用于管理员...

    LTspice仿真:LDO电源电路学习与实践的利器

    内容概要:本文详细介绍了如何利用LTspice进行LDO(低压差线性稳压器)电源电路的仿真。首先讲解了如何导入LDO模型并配置仿真环境,接着深入探讨了瞬态分析、相位裕度、电源抑制比(PSRR)等关键仿真的具体步骤和注意事项。文中提供了多个实用的操作技巧,如通过调整补偿电容优化相位裕度,以及使用.step param命令批量测试不同参数的影响。此外,还分享了一些常见的仿真误区及其解决方法,帮助读者更好地理解和掌握LDO的设计与调试。 适合人群:电子工程专业学生、电源电路设计初学者、希望深入了解LDO特性的工程师。 使用场景及目标:适用于希望通过仿真工具提高LDO设计技能的人群。主要目标是掌握LDO的基本工作原理,学会使用LTspice进行各种类型的仿真分析,从而优化电路设计,确保系统的稳定性和性能。 其他说明:文章不仅提供详细的仿真步骤和技术细节,还附带了作者的实际经验和常见问题解决方案,使读者能够在实践中不断改进自己的设计思路。

    渝安集团员工职业发展通道设计方案.ppt

    渝安集团员工职业发展通道设计方案.ppt

    新能源电动汽车VCU与BMS的HIL硬件在环仿真技术及其模块化建模

    内容概要:本文详细介绍了新能源电动汽车中VCU(整车控制器)和BMS(电池管理系统)的HIL(硬件在环)仿真技术。首先阐述了整车建模的基础,包括电池、电机等关键部件的建模要点。接着分别解析了驾驶员模块、仪表模块、BCU整车控制器模块、MCU电机模块、TCU变速箱模块、BMS电池管理模块等多个子模块的功能和实现方式。最后强调了HIL仿真在电动汽车控制系统测试和优化中的重要性,特别是在降低成本和风险方面的作用。 适合人群:从事新能源汽车研发的技术人员,尤其是专注于VCU和BMS领域的工程师。 使用场景及目标:适用于需要深入了解电动汽车控制系统仿真技术的研发团队,在产品开发初期进行系统测试和优化,确保各子系统间的协同工作正常。 其他说明:文中提供了大量代码示例,帮助读者更好地理解和实践相关概念和技术细节。此外,还分享了一些实际项目中的经验和教训,如故障注入测试的具体应用场景等。

    如何应对一线人员春节后的离职潮.docx

    如何应对一线人员春节后的离职潮

    线性代数_GitHub_课件作业_教学辅助用途_1742837800.zip

    线性代数

    离职面谈表.xls

    离职面谈表.xls

    聚宽对接qmt大礼包,帮助你配置好交易实盘环境

    聚宽对接qmt大礼包,配备需要的全部软件:python3.9版本,qmt模拟安装包,pycharm安装包,talib包

    试用期转正表.xls

    试用期转正表.xls

    招聘数据分析.xls

    招聘数据分析.xls

    如何让新员工快速融入团队.docx

    如何让新员工快速融入团队

    电力电子仿真中并离网逆变器及无功补偿设备的控制策略与建模

    内容概要:本文详细介绍了并离网逆变器的两种主要控制策略——PQ控制和V/f控制,以及无功能量发生器(SVG)和有源电力滤波器(APF)的仿真模型。对于PQ控制,文章展示了如何将功率指令转化为电流指令,并强调了电网电压定向和限幅处理的重要性。V/f控制则用于离网模式,通过调节电压和频率来维持系统的稳定。SVG主要用于无功补偿,通过实时计算无功需求进行补偿。APF则专注于谐波检测和消除,利用自适应滤波器提高效率。此外,文中还提供了多个实用的小技巧,如仿真步长设置、模式切换时的前馈补偿等。 适合人群:从事电力电子仿真研究的技术人员,尤其是对逆变器控制策略感兴趣的工程师。 使用场景及目标:适用于需要深入理解和实现逆变器控制策略的研究项目,帮助工程师优化仿真模型,提升系统性能,确保仿真结果的准确性。 其他说明:文章不仅提供了详细的代码片段,还分享了许多实践经验,有助于读者避免常见错误,提高仿真成功率。

    Carsim与Simulink联合仿真中基于线性二自由度模型的卡尔曼滤波(KF)实现及优化

    内容概要:本文详细介绍了如何利用Carsim与Simulink进行联合仿真,通过线性二自由度模型和卡尔曼滤波(KF)来估计车辆的质心侧偏角和横摆角速度。首先搭建了联合仿真框架,Carsim提供车辆状态量,Simulink负责算法处理。文中展示了线性二自由度模型的状态方程及其参数设定,并深入探讨了KF的两种实现方式:S函数编程和Simulink内置模块。对于S函数实现,着重讲解了状态转移矩阵的动态更新以及噪声矩阵Q的调整策略,确保模型能够适应车速变化。而对于内置模块,则指出了其在灵活性方面的不足之处。此外,还讨论了联合仿真的配置要点,如数据接口同步、采样时间和信号处理等问题。 适合人群:从事车辆动力学研究、控制理论应用、自动化控制领域的工程师和技术人员。 使用场景及目标:适用于需要精确估计车辆质心侧偏角和横摆角速度的研究和开发项目,特别是在涉及ESP等主动安全系统的开发过程中。目标是提高估计精度,增强系统的鲁棒性和响应速度。 其他说明:文章提供了详细的代码片段和实践经验分享,帮助读者更好地理解和实施相关技术。建议在实际应用中根据具体需求选择合适的KF实现方式,并注意处理各种边界条件和异常情况。

    档案管理[03].pptx

    档案管理[03]

    风电与储能联合调频系统:基于Python的建模与优化

    内容概要:本文详细介绍了风电与储能联合调频系统的原理及其优化方法。首先解释了风电输出功率的波动性和对电网频率的影响,提出储能系统作为解决方案。文中展示了如何用Python生成风速数据并构建调频控制系统,重点讨论了PID控制器的设计以及SOC(荷电状态)管理策略。此外,还探讨了调频控制逻辑、硬件在环测试、风电功率预测模型(如LSTM)、调频效果验证方法及储能系统的物理限制等问题。最后强调了模型验证的重要性,提出了异常数据注入测试的方法。 适合人群:从事电力系统自动化、新能源发电及储能技术研发的专业人士,尤其是有一定编程基础的研究人员和技术工程师。 使用场景及目标:适用于需要理解和实施风电与储能联合调频项目的团队。主要目标是提高电网稳定性,减少风电波动带来的负面影响,同时延长储能系统的使用寿命。 其他说明:文中提供了大量实用的Python代码示例,涵盖了从数据生成到控制逻辑实现再到模型验证的全过程。对于希望深入理解风储调频系统的工作机制和技术挑战的人来说,是一份非常有价值的参考资料。

    HCIA-Storage V4.5 培训教材 合集

    HCIA-Storage V4.5 培训教材 合集

    基于S7-1200与博途V15的PLC小车自动往返控制系统设计与仿真

    内容概要:本文详细介绍了利用西门子S7-1200系列PLC和博途V15软件平台构建的小车自动往返控制系统。首先进行硬件组态,选择合适的CPU并配置输入输出点位,确保限位开关和急停按钮的有效接入。接着编写梯形图逻辑,实现小车在AB两点间的精确控制,采用定时器互锁机制避免电机损坏。然后设计触摸屏界面,通过WinCC创建动画效果展示小车运动状态,并设置按钮操作实现手动与自动模式切换。最后进行联合仿真实验,解决常见错误如变量地址配置不当等问题,确保系统稳定运行。 适合人群:工业自动化领域的工程师和技术人员,尤其是对PLC编程和HMI设计有一定基础的学习者。 使用场景及目标:适用于需要掌握PLC控制系统设计全流程的专业人士,帮助他们理解如何整合硬件组态、梯形图编程以及HMI开发,最终完成一个完整的自动化工程项目。 其他说明:文中提供了详细的调试经验和技巧,附带74分钟的操作录像资料,有助于读者更好地理解和实践相关知识点。

Global site tag (gtag.js) - Google Analytics