`
ivan19861025
  • 浏览: 41942 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用spring3 El 编写自已的 表达式工具类

    博客分类:
  • Java
阅读更多
public class ExpressionUtils {
	
	public static Object getValue(Object model, String expression){
		return getValue(model, expression, false);
	}
	
	public static Object getValue(Object model, String expression, boolean throwEx){
		StandardEvaluationContext context= new StandardEvaluationContext();
		context.setRootObject(model);
		PropertyAccessor accessor1 = new MapAccessor();
		PropertyAccessor accessor2 = new ReflectivePropertyAccessor();
		List<PropertyAccessor> propertyAccessors = new ArrayList<PropertyAccessor>();
		propertyAccessors.add(accessor1);
		propertyAccessors.add(accessor2);
		context.setPropertyAccessors(propertyAccessors);
		ExpressionParser parser = new SpelExpressionParser();
		Expression exp = parser.parseExpression(expression); 
		try{
			return exp.getValue(context);
		}catch(SpelEvaluationException e){
			if (throwEx){
				throw new RuntimeException(e.getMessage(), e);
			}else{
				return null;
			}
		}
	}
	
	public static void setValue(Object model, String expression, Object value){
		StandardEvaluationContext context= new StandardEvaluationContext();
		context.setRootObject(model);
		PropertyAccessor accessor1 = new MapAccessor();
		PropertyAccessor accessor2 = new ReflectivePropertyAccessor();
		List<PropertyAccessor> propertyAccessors = new ArrayList<PropertyAccessor>();
		propertyAccessors.add(accessor1);
		propertyAccessors.add(accessor2);
		context.setPropertyAccessors(propertyAccessors);
		ExpressionParser parser = new SpelExpressionParser();
		Expression exp = parser.parseExpression(expression);
		String[] expr = expression.split("\\.");
		Object nodeModel = model;//遍历时节点索引时的model
		for (int i=0; i<expr.length - 1; i++){
			if (expr[i].matches(".+\\[\\d+\\]$")){
				nodeModel = doListExpression(expr[i], nodeModel);
			}else{
				nodeModel = doMapExpression(expr[i], nodeModel);
			}
		}
		exp.setValue(context, value);
	}

	@SuppressWarnings("unchecked")
	private static Object doMapExpression(String expr, Object nodeModel) {
		//map
		Map map = (Map)ExpressionUtils.getValue(nodeModel, expr);
		if (map == null){
			map = new HashMap();
			ExpressionUtils.setValue(nodeModel, expr, map);
		}
		return map;
	}

	@SuppressWarnings("unchecked")
	private static Object doListExpression(String expr, Object nodeModel) {
		String property = expr.substring(0, expr.indexOf("["));
		int index = Integer.parseInt(expr.substring(expr.indexOf("[") + 1, expr.length() - 1));
		List list = (List)ExpressionUtils.getValue(nodeModel, property);
		if (list == null){
			list = new ArrayList();
			Map item = new HashMap();
			list.add(item);
			ExpressionUtils.setValue(nodeModel, property, list);
			
			return item;
		}else{
			Map item = null;
			if (index >= list.size()){
				item = new HashMap();
				list.add(index, item);
			}else{
				item = (Map)list.get(index);
			}
			
			return item;
		}
	}
	
}
分享到:
评论

相关推荐

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    spring3.0.2api 文档spring表达式语言

    9. **EL解析器**:Spring提供API来解析和执行SpEL表达式,例如`StandardEvaluationContext`和`ExpressionParser`。 10. **SpEL在AOP中的应用**:在Spring AOP中,SpEL常用于定义切入点表达式,允许基于方法参数、...

    EL表达式所需要的jar包

    总的来说,EL表达式极大地提升了JSP开发的效率和可维护性,是Web开发中的重要工具。这个压缩包提供的jar文件是确保EL正常工作不可或缺的依赖,确保将它们正确地集成到你的项目中,你就能享受到EL带来的便利。

    java分页工具类,以及基于Struts,Spring,mybatis,jsp中分页的调用及实现

    ### Java分页工具类及其在Struts、Spring、MyBatis和JSP中的应用 #### 一、Java分页概述 在开发Web应用程序时,为了提高用户体验并减轻服务器压力,通常会采用分页技术来展示大量的数据记录。本文将详细介绍一个...

    论坛java源码(SpringMVC+Hibernate+EL表达式)

    3. **EL表达式**: Expression Language是JavaServer Faces(JSF)技术的一部分,但在其他Java Web框架中也被广泛使用,如SpringMVC。EL是一种简洁的脚本语言,用于在JSP页面中访问JavaBean属性和执行简单运算。在...

    spring3 enterprise pecipes

    - **更好的EL(表达式语言)**:Spring 3增强了表达式语言的功能,使得在模板引擎或自定义标签库中使用更为方便。 - **OSGi支持**:Spring 3现在支持OSGi服务平台,使得框架可以在动态模块系统环境中运行。 #### 在...

    管理系统系列--eladmin jpa 版本:项目基于 Spring Boot 2.6.4、 Jpa、 Spring.zip

    eladmin jpa版本利用JPA作为持久层的解决方案,结合Spring Boot的便利性,使得项目具有高度可扩展性和灵活性。 在压缩包文件"kwan02251353"中,可能包含了eladmin项目的源代码、配置文件、数据库脚本和其他相关资源...

    Thymeleaf与Spring集成

    SpringStandard方言引入了使用SpringEL作为变量表达式语言,提供了专门的属性处理如th:field,th:errors和th:errorclass,以及与Spring主题和URI构建相关的表达式对象和方法。 开发者通常不需要直接将...

    thymeleaf for spring pdf

    Thymeleaf与Spring的集成,使得用户能够在模板中使用SpringEL表达式,创建与后端bean集成的表单,并处理国际化和资源解析等功能。这些功能使得Thymeleaf成为了开发Spring MVC应用程序的强大工具,尤其是在视图层模板...

    普通类调用Spring bean对象

    5. **工具类**:为了简化代码,有时我们会创建一个工具类,该类持有`ApplicationContext`的单例,提供获取bean的方法。例如: ```java public class SpringUtil { private static ApplicationContext context; ...

    spring应用必须的类库

    1. **spring-core**:这是Spring框架的基础模块,提供了核心工具类和特性,包括Bean工厂、资源处理、事件传播和通用的类型转换系统。它定义了Spring的基本架构,并为其他模块提供了基础设施。 2. **spring-beans**...

    达梦 Spring 框架所需jar包

    5. spring-expression(spring-el):表达式语言,用于在运行时查询和操作对象图。 为了与数据库进行交互,Spring提供了JDBC抽象层,相关jar可能包括: 1. spring-jdbc:提供了对JDBC的抽象,使得开发者无需直接...

    spring 3.x企业应用开发实战

    3. **支持EL表达式**:在 3.x 版本中,Spring 引入了对 EL 表达式的原生支持,可以更方便地在模板引擎或 JSP 页面中使用 Bean 属性。 4. **异步支持**:Spring 3.x 提供了对异步调用的支持,可以更好地处理高并发...

    spring4各个功能的jar总结

    6. **spring-expression.jar (spring-el)**:提供了表达式语言,使得在运行时能够查询和操作对象图,常用于SpEL(Spring Expression Language)。 7. **spring-web.jar**:为Web应用提供支持,如Servlet监听器、...

    EL标签的jar文件

    EL表达式语言是JSP 2.0及更高版本中引入的一种强大而灵活的数据绑定工具,用于简化JSP页面中的脚本代码。在Java Web开发中,EL标签的使用极大地提高了开发效率和代码可读性。 这个名为"EL标签的jar文件"的压缩包,...

    spring boot+hibernate+thymeleaf 练习demo项目源码

    在本项目中,Thymeleaf模板将用于构建前端页面,通过表达式语言(EL)和条件语句等,将后端的数据动态渲染到视图上,为用户提供交互式的界面。 在实际的项目结构中,你可能会看到以下组件: 1. `pom.xml` - Maven...

    Spring.docx

    7. **Spring 工具类和扩展**:如 Spring Boot、Spring Data、Spring Cloud 等,进一步简化开发流程。 通过以上学习,开发者能够掌握 Spring 框架的核心特性和使用方法,从而高效地构建高质量的 JavaEE 应用。

    spring需要的jar包

    - **spring-core.jar**:这是Spring框架的基础,提供了核心工具类、资源处理和IoC容器的基础。它包括Bean工厂,它是所有Spring应用的起点,用于管理对象的生命周期和依赖关系。 - **spring-beans.jar**:这个包...

    spring-framework-3.0.5.RELEASE-dependencies1

    5. **org.apache.commons**:Apache Commons项目提供了一系列实用工具类,如Commons Lang、Commons IO等,它们在Spring框架中被广泛使用,提供了各种通用的功能,如字符串处理、IO操作等。 6. **...

    spring.docx

    如果遇到Spring框架中的El表达式无法解析的问题,可能是因为Servlet版本过低,不支持El表达式。这时需要更新`web.xml`文件,将其改为对应的JSP版本,例如改为`web-app_3_0.xsd`。 综上所述,Spring框架是一个强大的...

Global site tag (gtag.js) - Google Analytics