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

FreeMarker在TemplateLoader的设计缺陷

    博客分类:
  • HTTL
阅读更多
在设计MeteorTL的TemplateLoader时,借鉴了下FreeMarker,
FreeMarker的TemplateLoader:
public interface TemplateLoader {

    public Object findTemplateSource(String name) throws IOException;

    public long getLastModified(Object templateSource);

    public Reader getReader(Object templateSource, String encoding) throws IOException;
    
    public void closeTemplateSource(Object templateSource) throws IOException;

}

初读此接口很费解,这是一个留给扩展者的SPI,但却让扩展者要看完那长篇的注释才能明白那个Object是干什么的。

TemplateLoader的第一目标是要通过模板name拿到Reader,
最初的想法肯定是:
public interface TemplateLoader {

    public Reader getReader(String name, String encoding) throws IOException;

}

但实现时,会发现Reader无法持有一些meta数据,如:用于热加载时比较是否更新用的lastModified时间等。

所以freemarker才会有上面的写法,用一个Object(大部分时候是File)传递,也就是 findTemplateSource(String name) 的返回值 Object templateSource 会被框架(接口调用者)通过参数回传给下面的三个函数。以至于此接口的契约依赖于框架的具体实现(即所有此接口的调用者,都应该遵守回传templateSource,而这些都是文档约束的)。

重构如下:
import java.io.IOException;

public interface TemplateLoader {
	
	public TemplateSource getTemplateSource(String name) throws IOException;

}


import java.io.IOException;
import java.io.Reader;

public interface TemplateSource {
	
	public static final long UNKOWN_TIME = -1;

	public long getLastModifiedTime();
	
	public Reader getReader(String encoding) throws IOException;
	
	public void close() throws IOException;
	
}


分享到:
评论
4 楼 yanqingluo 2013-05-07  
博主真是非常专业.
3 楼 magice 2007-08-17  
我个人觉得TemplateSource设计成为抽象类更加好一些,因为它本身就是对Reader以及时间的一个封装嘛

import java.io.IOException;   
import java.io.Reader;   
  
public abstract class TemplateSource {   
       
    private Reader rd;
    
    private long lastModifiedTime;
	
    public static final long UNKOWN_TIME = -1;   
  
    public long getLastModifiedTime();   
       
    public Reader getReader(String encoding) throws IOException;   
       
    public void close(Reader reader) throws IOException;   
       
}   
2 楼 javatar 2007-06-29  
Template是可以独立于Context存在的。
Context相当于语言设计体系中的Runtime,
而Template是Compile期的产物,
Template不能包含任何动态数据,也不能持有可变的全局状态,必需保证线程安全,否则在多线程中,需要拷贝实例到ThreadLocal,这是很耗性能的。那运行期的数据状态怎么办呢,都交给Context管理,包括与外界的交互。

Template也是一种DSL语言,这种设计应该是合理的。
1 楼 leadyu 2007-06-27  
恩,有点像类的加载方式了。不过不是很理解为什么采用这种模型?
模版可以独立于上下文Context存在吗?如果不可以,那么模版的加载为什么采用这种模型?javatar兄是怎么考虑的?

相关推荐

    FreeMarker模板设计指南

    FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...

    FreeMarker设计指南.ppt

    这个“FreeMarker设计指南.ppt”文件很可能是关于如何有效地使用FreeMarker进行模板设计和编程的一份详细教程。以下是FreeMarker的一些核心知识点和相关概念: 1. **模板语言**:FreeMarker是基于文本的模板语言,...

    freemarker 自定义freeMarker标签

    本篇将深入探讨如何自定义FreeMarker标签,以扩展其功能并适应特定项目需求。 首先,理解FreeMarker的默认标签语法至关重要。FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件...

    FreeMarker 设计指南

    FreeMarker 是一个强大的模板引擎,常用于Web应用中的视图层,特别是在Java环境中与Spring MVC等框架配合使用。本设计指南将深入探讨FreeMarker的核心概念、语法、最佳实践以及常见应用场景,帮助开发者更好地理解和...

    Freemarker简介及标签详解大全

    FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,通过模板显示准备的数据。 -...

    freemarker Demo 适用于freemarker初学

    Freemarker是一个基于模板的开源模板语言,它与Java代码分离,使得开发者可以专注于业务逻辑,而设计师则可以专注于页面设计。它不依赖于任何特定的Web框架,可以在各种Java应用中使用。 2. **模板语法** ...

    freemarker-ide插件

    Freemarker-IDE是一款专为开发人员设计的Eclipse插件,它主要针对Freemarker模板语言提供了强大的支持。在Eclipse这样的集成开发环境中,这款插件能够显著提升开发人员编写和调试`.ftl`(FreeMarker Template ...

    FreeMarker设计指南.doc

    这种情况下,设计者可以在HTML或其他输出文本中插入特定的FreeMarker指令,这些指令将在最终输出给用户时被适当的数据替换。 - **示例**: 以下是一个简单的HTML模板示例,展示了如何使用FreeMarker指令: ```html...

    freemarker-2.3.23jar

    Freemarker是一个强大的模板引擎,主要用于生成动态HTML、XML或其他文本格式的页面。...在实际应用中,开发者需要结合Java后端框架(如Spring MVC)和其他相关技术,充分利用Freemarker的功能来构建动态网站和应用。

    freemarker-2.3.28.jar

    3. **模板设计**: Freemarker强调模板应与业务逻辑分离,使得设计师可以专注于布局和样式,而开发者处理数据和逻辑。这种分离使得维护和更新变得更加容易。 4. **缓存机制**: 2.3.28版本可能包含了对模板编译后的...

    freemarker中文学习资料

    - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护。 2. **Freemarker语法** - **变量**:`${...}` 用于输出变量的值,如 `${name}` 将输出与`name`键对应...

    freemarker生成doc方案

    在本场景中,我们探讨的是如何利用Freemarker来生成Microsoft Word(.doc)文档。这个方案主要适用于需要根据预定义模板动态生成报告、合同等Word文档的场合。 一、Freemarker基础 Freemarker是一个基于模板的语言...

    freemarkerdemo 生成word 插入图片

    5. **模板设计**:Freemarker模板设计是关键步骤,它定义了Word文档的结构和内容。在模板中,可以使用Freemarker的语法来控制文本、段落和图片的布局。图片的插入通常会涉及`<#assign>`指令来定义变量,以及`<img>`...

    freemarker-2.3.22

    在这个"freemarker-2.3.22"的压缩包中,包含了Freemarker 2.3.22版本的相关资源,有助于我们深入了解和使用这个库。 首先,`README.txt`通常包含项目的基本信息、安装指南和快速入门等内容。在这个版本中,它可能...

    Freemarker 设计指南

    FreeMarker 设计指南 FreeMarker 是一个模板引擎,用于生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。...FreeMarker 通过模板和数据模型来生成输出,解决了在 Web 页面中显示的信息在设计页面时是无效的问题。

    可视化div布局 生成freemarker模板

    在IT行业中,可视化布局工具和模板引擎是提升开发效率、简化网页设计的重要手段。本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关...

    FreeMarker2.3.23官方中文文档

    10. **模板设计模式**:FreeMarker鼓励采用MVC模式,将业务逻辑与视图分离,使得模板更专注于呈现,提高了代码的可维护性和可复用性。 通过阅读和理解FreeMarker 2.3.23的官方中文文档,开发者能够熟练掌握...

    freemarker解析成pdf

    1. **创建模板**:在Freemarker中,我们需要创建一个`.ftl`(Freemarker Template Language)文件,其中包含静态文本和动态占位符。动态占位符由${}或#{}包裹,用于插入数据模型中的值。例如,`${title}</h1>`会将...

    FreeMarker设计指南(完整整理)

    FreeMarker设计指南(完整整理)是我们学习的好帮手!

Global site tag (gtag.js) - Google Analytics