`
javatar
  • 浏览: 1701115 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

重用CommonTemplate的EL

    博客分类:
  • HTTL
阅读更多
上几天和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
分享到:
评论
2 楼 javatar 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)等等

1 楼 jindw 2007-11-22  
很简单了,已经。

仍外:VariableResolver 是否可以用现成的Map接口代替呢?

相关推荐

    commontemplate框架

    4. **宏**:类似于函数,宏是可以重用的模板片段,可以接受参数并嵌套其他模板。 5. **插件系统**:通过插件机制,CommonTemplate可以扩展其功能,例如与Struts框架集成的`struts-commontemplate-plugin`。 ### ...

    el-table,el-form在vue中封装组件化,含操作按钮和插槽.pdf

    在Vue.js开发中,组件化是一种常见的最佳实践,它能够提高代码的可重用性和可维护性。在给定的文件中,展示了如何利用Element UI库来封装`el-table`和`el-form`组件,这两个组件在管理系统的界面中非常常见,特别是...

    C++代码设计与重用

    C++代码设计与重用

    在 Altium Designer 中使用重用块和片段

    在电子设计自动化(EDA)软件Altium Designer中,重用块和片段是提高设计效率的关键特性。这些功能允许设计者存储和重复使用常见的电路模块,无论是原理图部分还是PCB布局,从而节省时间和确保设计的一致性。 **...

    片上系统:可重用设计方法学 (第三版)

    为了提升设计效率和可重用性,开发出了一套可重用设计方法学,这一方法学在《片上系统:可重用设计方法学(第三版)》一书中得到了详细的介绍。 首先,可重用设计方法学的核心在于提高设计的可重用性。这意味着设计...

    软件重用方面的资源_设计-开发-研究

    在IT行业中,软件重用是提高开发效率、降低成本和保证软件质量的重要策略。这个压缩包包含的资源聚焦于软件重用的设计、开发和研究,旨在深入探讨如何有效地利用已有的软件元素来创建新的应用程序。 首先,"基于...

    UG重用库使用 产品模板使用

    UG(现在通常称为NX)是西门子PLM软件推出的一套高端CAD/CAM/CAE集成解决方案,其中重用库是NX中的一个重要功能,它的目的是为了提高设计效率和标准化程度,通过提供一系列可重用的部件、模板和组件来加速产品设计...

    c++ 代码重用教程

    在编程领域,代码重用是提高效率和保持代码可维护性的重要原则。C++作为一款强大的面向对象编程语言,提供了多种方法来实现代码重用,从而使得开发者能够更高效地构建复杂的软件系统。本教程专注于讲解如何在C++中...

    关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案

    关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案 文章目录关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案报错时候解决方案 这其实不是一种报错,有这个提示的原因是本地端口是被共享的,...

    C++代码设计与重用.pdf

    C++代码设计与重用是关于如何编写高效可重用代码的重要话题,它对于提高软件开发效率和软件质量具有重要意义。本书《C++代码设计与重用》由Martin D. Carroll和Margaret A. Ellis合著,是一本深受业界推崇的技术书籍...

    C语言接口与实现--创建可重用软件的技术

    《C语言接口与实现--创建可重用软件的技术》是一本深入探讨如何通过C语言构建高效、可维护、可重用软件的专业书籍。在软件工程领域,可重用性是提高开发效率、降低维护成本的关键因素。这本书的核心目标就是教授读者...

    C++代码设计与重用 pdf

    《C++代码设计与重用》是由Martin D. Carroll和Margaret A. Ellis两位作者合著的作品,本书深入探讨了如何在C++编程语言中设计和实现可重用的代码,提高开发效率。书中不仅涵盖了重用性基本概念、类设计、扩展性、...

    如何提高代码重用性

    在编程领域,代码重用性是提升开发效率和软件质量的关键因素之一。代码重用性意味着我们可以避免重复编写相同的逻辑,使得程序更加模块化,易于维护和扩展。针对Java编程语言,以下是一些提高代码重用性的核心策略:...

    C语言接口与实现:创建可重用软件的技术(中文版)

    《C语言接口与实现:创建可重用软件的技术》是计算机编程领域的一本重要著作,由David R. Hanson撰写,张昆翻译,并由机械工业出版社引进国内。本书为C语言编程提供了深入的理论和实践指导,特别是在如何设计和实现...

    EL自定义标签【步骤图解和工程示例】

    - 自定义标签库可以被多个Web应用共享,提升代码重用率。 通过以上步骤,你不仅能够创建EL自定义标签,还能将其整合到实际项目中,提升开发效率和代码质量。在实践中不断探索和优化,你会发现自定义标签是Java Web...

    可重用代码管理器

    《可重用代码管理器:提升编程效率的关键工具》 在快速发展的信息技术领域,软件开发的速度和质量成为了项目成功与否的重要衡量标准。为了提高编程效率并降低错误率,程序员们开始越来越重视代码的复用性。"可重用...

Global site tag (gtag.js) - Google Analytics