`
ivan19861025
  • 浏览: 41038 次
  • 性别: 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 MVC 开发一般步骤详述

    6 工具类的编写 一般根据自己的需求 "&gt;本人将Spring MVC的一般开发步骤做了一个详细的记录 有相关截图 相关核心代码 为懂各个java代码但是不会整合开发的朋友提供一个借鉴 希望朋友们看了文档后能够达到用java做系统...

    web开发常用jar

    OGNL表达式所需要的包,支持EL htmlparser.jar 强大的html解析器 jcommon-1.0.15.jar 使用java生成图表的工具 freemarker-2.3.8.jar 模板相关操作需要包 struts2-core-2.0.14.jar struts2核心包 ...

    java开发常用jar包

    OGNL表达式所需要的包,支持EL htmlparser.jar 强大的html解析器 jcommon-1.0.15.jar 使用java生成图表的工具 freemarker-2.3.8.jar 模板相关操作需要包 struts2-core-2.0.14.jar struts2核心包 struts2-...

    java web技术开发大全(最全最新)

    5.3.4.JSP表达式语言(EL) 5.3.5 实例:用EL函数替换HTML中的特殊字符 5.3.6 JSP页面中的注释 5.4 JSP指令 5.4.1 JSP指令简介 5.4.2 page页面指令 5.4.3 include加入指令 5.5.JSP的9个内置对象 ...

    java开源包3

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java web开发技术大全

    5.3.4.JSP表达式语言(EL) 5.3.5 实例:用EL函数替换HTML中的特殊字符 5.3.6 JSP页面中的注释 5.4 JSP指令 5.4.1 JSP指令简介 5.4.2 page页面指令 5.4.3 include加入指令 5.5.JSP的9个内置...

    JAVA上百实例源码以及开源项目

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目源代码

    Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测 用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作...

    java开源包1

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包11

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包2

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包6

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包5

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包10

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包4

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包8

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包7

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包9

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包101

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    Java资源包01

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

Global site tag (gtag.js) - Google Analytics