论坛首页 Java企业应用论坛

重用CommonTemplate的EL

浏览 2179 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-21  
上几天和jindw讨论时,
他提到想在他的一个开源项目重用CommonTemplate(http://www.commontemplate.org)的EL (Expression Language),
问我是否可以抽取使用,我觉得这是一个很好的想法,
为此重构了一下CommonTemplate,以使EL分离于TL (Template Language),可以单独使用。

因为原始设计就将EL单独设计的,只是为了和TL统一,有些范围未最小化控制,
重构如下:
将Expression的求值过程所依赖Context改成VariableResolver,即:
Object evaluate(Context context);

改成:
Object evaluate(VariableResolver variableResolver);


加入接口VariableResolver:
public interface VariableResolver {
	
	Object lookupVariable(String name) throw VariableException;

}

并让Context继承于VariableResolver,保持指令可以使用原有的expression.evaluate(context)调用表达式求值,
(实际继承关系是Context -> LocalContext -> VariableStorage -> VariableResolver)
这样,单独使用EL时,就不用实现整个Context,只需实现最简单的VariableResolver就行了,

实现上面重构后,单独使用EL的体系为:
org.commontemplate.core.VariableResolver
org.commontemplate.core.Expression
org.commontemplate.cofig.ExpressionConfiguration
org.commontemplate.engine.expression.ExpressionEngine
org.commontemplate.standard.ExpressionSetting

第三方只需要重新实现org.commontemplate.core.VariableResolver,
其它都可以直接使用,如:
// 创建配置,
// 这里用的org.commontemplate.util包内置的IoC配置工具,
// 也可以编程一个个setXXX,或用其它IoC容器创建,
BeanFactory beanFactory = new PropertiesBeanFactory("commontemplate-expression.properties");
ExpressionSetting setting = (ExpressionSetting)beanFactory.createBean(ExpressionSetting.class);

VariableResolver variableResolver = ... //自行实现

// 通过配置创建
ExpressionEngine engine = new ExpressionEngine(setting);

// 解析表达式
String expr = "1 + 1"; // 待求值的表达式
Expression expression = engine.parseExpression("1 + 1");

// 运行求值
Objecct result = expression.evaluate(variableResolver);
System.out.println(expr + " = " + result);


应该重用方式已经非常简单了,
当然可以加几个工具类,把配置再封装一下,
或再提供一个用Map实现的最简单VariableResolver等,
但这些都不是必需的,

另外,是否应该将el相关的放到一个package下,我觉得没必要,
那会影响整个项目的package层级关系,
倒是可以写一个Ant脚本,抽取相关类,打包成commontemplate-el.jar
   发表时间:2007-11-22  
很简单了,已经。

仍外:VariableResolver 是否可以用现成的Map接口代替呢?
0 请登录后投票
   发表时间:2007-11-23  
因为要保持与VariableStorage设计风格一致,所以用了lookupVariable,
感觉VariableResolver也不应该决定扩展者使用何种注册方式,并且适配到Map非常简单,
我加了一个org.commontemplate.side.tool.ExpressionEvaluator工具类,使用如:
ExpressionEvaluator evaluator = new ExpressionEvaluator();
evaluator.put("book", new Book());
Object result = evaluator.evaluate("book.price + 3");

put方法可以链式调用:
Object result = new ExpressionEvaluator().put("a", 1).put("b", 2).evaluate("a + b");

且重载了所有基本类型:
put(String, boolean),put(String, char),put(String, int)等等

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics