`

Freemarker学习--程序开发

阅读更多

一、创建 Configuration 实例

 

Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg .setClassForTemplateLoading(this.getClass(), "ftl");

cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

 不需要重复创建 Configuration 实例; 它的代价很高,尤其是会丢失缓存。Configuration实例就是应用级别的单例。

 

二、获取模板

Template temp = cfg.getTemplate("hashes.ftl");

Configuration 缓存 Template 实例,当再次获得 hashes.ftl 的时候,它可能再读取和解析模板文件了, 而只是返回第一次的 Template实例。

三、数据模型

在内部,模板中可用的变量都是实现了freemarker.template.TemplateModel 接口的Java对象。 但在数据模型中,可以使用基本的Java集合类作为变量,因为这些变量会在内部被替换为适当的 TemplateModel 类型,类freemarker.template.ObjectWrapper的职责

A、标量

有4种类型的标量:

  • 布尔值
  • 数字
  • 字符串
  • 日期类型(子类型: 日期(没有时间部分),时间或者日期-时间)

每一种标量类型都是 TemplateTypeModel 接口的实现,这里的 Type 就是类型的名称。这些接口只定义了一个方法: typegetAsType();。 它返回变量的Java类型(boolean, Number, String 和 Date 各自代表的值)。

B、哈希表 对应TemplateHashModel 

C、序列对应TemplateSequenceModel  

D、集合 对应TemplateCollectionModel 

E、方法对应TemplateMethodModel 

方法示例:

public class IndexOfMethod implements TemplateMethodModel {
    
    public TemplateModel exec(List args) throws TemplateModelException {
        if (args.size() != 2) {
            throw new TemplateModelException("Wrong arguments");
        }
        return new SimpleNumber(
            ((String) args.get(1)).indexOf((String) args.get(0)));
    }
}

如果将一个实例放入根数据模型中,像这样:

root.put("indexOf", new IndexOfMethod());

那么就可以在模板中调用:

<#assign x = "something">
${indexOf("met", x)}
${indexOf("foo", x)}

将会输出:

2
-1

 F、指令 对应TemplateDirectiveModel 

我们来创建一个指令,这个指令可以一次又一次地执行其中的嵌套内容, 这个次数由指定的数字来确定(就像 list 指令), 可以使用<hr>将输出的重复内容分开。 这个指令我们命名为"repeat"。示例模板如下:

<#assign x = 1>

<@repeat count=4>
  Test ${x}
  <#assign x++>
</@repeat>

<@repeat count=3 hr=true>
  Test
</@repeat>

<@repeat count=3; cnt>
  ${cnt}. Test
</@repeat>

输出为:

  Test 1
  Test 2
  Test 3
  Test 4

  Test
<hr>  Test
<hr>  Test

  1. Test
  2. Test
  3. Test
指令的实现类为:
public class RepeatDirective implements TemplateDirectiveModel {
    
    private static final String PARAM_NAME_COUNT = "count";
    private static final String PARAM_NAME_HR = "hr";
    
    public void execute(Environment env,
            Map params, TemplateModel[] loopVars,
            TemplateDirectiveBody body)
            throws TemplateException, IOException {
        
        // ---------------------------------------------------------------------
        // Processing the parameters:
        
        int countParam = 0;
        boolean countParamSet = false;
        boolean hrParam = false;
        
        Iterator paramIter = params.entrySet().iterator();
        while (paramIter.hasNext()) {
            Map.Entry ent = (Map.Entry) paramIter.next();
            
            String paramName = (String) ent.getKey();
            TemplateModel paramValue = (TemplateModel) ent.getValue();
            
            if (paramName.equals(PARAM_NAME_COUNT)) {
                if (!(paramValue instanceof TemplateNumberModel)) {
                    throw new TemplateModelException(
                            "The \"" + PARAM_NAME_HR + "\" parameter "
                            + "must be a number.");
                }
                countParam = ((TemplateNumberModel) paramValue)
                        .getAsNumber().intValue();
                countParamSet = true;
                if (countParam < 0) {
                    throw new TemplateModelException(
                            "The \"" + PARAM_NAME_HR + "\" parameter "
                            + "can't be negative.");
                }
            } else if (paramName.equals(PARAM_NAME_HR)) {
                if (!(paramValue instanceof TemplateBooleanModel)) {
                    throw new TemplateModelException(
                            "The \"" + PARAM_NAME_HR + "\" parameter "
                            + "must be a boolean.");
                }
                hrParam = ((TemplateBooleanModel) paramValue)
                        .getAsBoolean();
            } else {
                throw new TemplateModelException(
                        "Unsupported parameter: " + paramName);
            }
        }
        if (!countParamSet) {
                throw new TemplateModelException(
                        "The required \"" + PARAM_NAME_COUNT + "\" paramter"
                        + "is missing.");
        }
        
        if (loopVars.length > 1) {
                throw new TemplateModelException(
                        "At most one loop variable is allowed.");
        }
        
        // Yeah, it was long and boring...
        
        // ---------------------------------------------------------------------
        // Do the actual directive execution:
        
        Writer out = env.getOut();
        if (body != null) {
            for (int i = 0; i < countParam; i++) {
                // Prints a <hr> between all repetations if the "hr" parameter
                // was true:
                if (hrParam && i != 0) {
                    out.write("<hr>");
                }
                
                // Set the loop variable, if there is one:
                if (loopVars.length > 0) {
                    loopVars[0] = new SimpleNumber(i + 1);
                }
                
                // Executes the nested body (same as <#nested> in FTL). In this
                // case we don't provide a special writer as the parameter:
                body.render(env.getOut());
            }
        }
    }

}
 四、实用类
1、访问静态方法
BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel staticModels = wrapper.getStaticModels();
TemplateHashModel fileStatics =
    (TemplateHashModel) staticModels.get("java.io.File");
 2、访问枚举类型
BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel enumModels = wrapper.getEnumModels();
TemplateHashModel roundingModeEnums =
    (TemplateHashModel) enumModels.get("java.math.RoundingMode");
 3、自定义模版加载
FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));
FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));
ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "");
TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

cfg.setTemplateLoader(mtl);
 
分享到:
评论

相关推荐

    apache-freemarker-2.3.26-incubating-bin.tar.gz

    Apache FreeMarker是一个强大的、开源的模板引擎,常用于生成HTML和其他动态内容,尤其在Web应用程序中,如...通过熟练掌握FreeMarker,开发者可以更高效地构建和维护Web应用程序的前端部分,提高开发效率和用户体验。

    FreeMarkerDemo-java.rar

    综上所述,这个"FreeMarkerDemo-java.rar"项目是一个实用的学习资源,它教你如何在Spring Boot环境中利用FreeMarker来处理Word文档,这对于那些需要生成动态报告或文档的系统来说非常有价值。通过研究这个示例,...

    freemarker --struts中的应用

    Freemarker是一个强大的模板引擎,常用于Java Web开发中,特别是在Struts框架中...总之,学习并熟练运用Freemarker在Struts中的应用,对于Java Web开发者来说是一项重要的技能,它有助于构建高效、易维护的Web应用。

    freemarker-2.3.8源码

    通过对`freemarker-2.3.8`源码的学习,开发者可以更好地掌握Freemarker的工作机制,从而更高效地利用它来构建应用程序的视图层,同时也能为自定义扩展和解决特定问题提供参考。此外,对于Java开发者来说,阅读源码也...

    Freemarker-2.3.19中文手册和jar包

    Freemarker是一个强大的...综上所述,Freemarker是一个功能丰富的模板引擎,适用于Java Web开发,通过与数据模型的结合,可以生成动态内容。提供的中文手册和jar包,使得中文开发者能够更便捷地学习和使用这一工具。

    freemarker学习

    为了提高开发效率,你还可以安装Freemarker的编辑器插件。官方提供的插件可能不包含所有功能,比如没有智能提示。推荐使用hudson.freemarker_ide_0.9.14,这是一个既能高亮显示关键词又能提供智能提示的插件。不过,...

    freemarker中文学习资料

    Freemarker是一个强大的模板引擎,常用于Web开发中生成动态HTML页面。它是Java语言的一个开源项目,遵循Apache软件基金会的Apache License。...通过深入学习和实践,你可以熟练掌握Freemarker,提升Web应用的开发效率。

    freemarker-2.3.32

    数据模型则是程序传递给Freemarker的变量和对象集合,用于填充模板中的占位符。在处理时,Freemarker会解析模板,结合数据模型,生成最终的输出。 在Java中,使用Freemarker通常涉及以下几个步骤: 1. 创建一个`...

    FreeMarker-rumen.rar_freemarker

    在FreeMarker中,模板文件通常以`.ftl`为扩展名,它们包含了一系列控制结构(如条件语句和循环)以及占位符,这些占位符会被程序中的实际数据替换。 **FreeMarker的基本概念:** 1. **模板(Template)**:FTL文件...

    FreeMarker_2.3.23 中文

    FreeMarker 是一个强大的模板引擎...总之,FreeMarker_2.3.23 中文版的资源为开发者提供了全面的学习材料,无论是初学者还是有经验的用户,都能从中受益,提升自己的技能,更好地利用FreeMarker进行高效的Web应用开发。

    freeMarker学习入门

    FreeMarker 是一个强大的模板引擎,主要用于生成HTML或其他类型的文本输出,尤其在Web开发中被...通过学习FreeMarker,开发者可以更好地实现MVC架构中的视图层,提高开发效率,并创建出更加灵活、可维护的Web应用程序。

    FreeMarker开发手册(中文版)

    #### 四、程序开发指南 **4.1 创建配置实例** - **步骤**: 初始化FreeMarker配置对象,设置参数如默认编码等。 **4.2 创建数据模型** - **构建**: 构建一个包含所需数据的对象模型。 - **传递**: 将数据模型传递给...

    FreeMarker学习指南

    总的来说,FreeMarker是一个强大的工具,它简化了动态内容的生成,使得设计人员和开发人员能够各自专注于他们的专业领域,从而提高效率和协作效果。通过理解FreeMarker的基本概念,如模板、数据模型以及各种数据类型...

    struts2-freemarker

    Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,它极大地简化了构建基于Java的Web应用程序的过程。而FreeMarker则是一种模板引擎,主要用于生成...

    freemarker使用文档

    2.1 通过例子来学习:通过具体示例,学习如何在FreeMarker模板中处理XML。 2.2 形式化描述:对如何处理XML给出了形式化的定义。 三、声明的XML处理 3.1 基础内容:讲述了如何在FreeMarker中进行声明式的XML处理。 ...

    freemarker的学习资料、架包、源码

    FreeMarker是一个广泛应用于Java开发领域的模板引擎,它的主要任务是根据预先定义的模板和动态数据生成HTML或者其他格式的文本...通过不断实践和学习,你将能够充分利用FreeMarker的强大功能,提高开发效率和代码质量。

    Freemarker 学习笔记一 【乱码解决】

    Freemarker是一个强大的Java模板引擎,常用于动态生成HTML或其他类型的文档。在使用Freemarker的过程中,遇到乱码问题...通过实践和学习,你将能够有效地避免和解决Freemarker的乱码问题,提升你的开发效率和代码质量。

    FreeMarker 中文教程 用于 FreeMarker 2.3.19

    ### FreeMarker 中文教程知识点概览 #### 一、FreeMarker 概述 ...通过以上知识点的概览,读者可以全面了解 FreeMarker 的基本概念、使用方法及高级特性,为后续深入学习和应用 FreeMarker 奠定坚实的基础。

Global site tag (gtag.js) - Google Analytics