Lars Vogel, (c) 2012, 2016 vogella GmbHVersion 1.4,06.10.2016

FreeMarker Tutorial. This tutorial explains how can you define FreeMarker templates and how can you generate output based on these templates. It also demonstrates the usage of macros.

1. Introduction to FreeMarker

FreeMarker is a Java-based template engine which can be used in stand-alone or servlet-based Java programs.

In FreeMarker you define templates, which are text files that contain the desired output, except that they contain placeholders like ${name}, and even some logic like conditionals, loops, etc. In your Java program you supply the actual values for these placeholders and the final output is generated based on this input.

The input of templates is a bunch of named variables that you usually provide as a Map<String, Object> (the Map entries will be the variables) or as a JavaBean (the JavaBean properties will be the variables). The variable values can be simple strings, numbers and such primitive values, but also lists, maps, or arbitrary Java objects whose methods you can call from the template. Note that when accessing JavaBean properties, myObject.myProperty syntax should be used instead ofmyObject.getMyProperty().

The output of templates is written into a Writer that you provide, so it can go into a HTTP response (for dynamic web pages), into a local file, into a String, etc.

It is configurable from where FreeMarker reads the templates; commonly used options are loading from a file-system directory, from the class-path, from the servlet context ( WEB-INF/templates or such), or even from a database table. It’s also possible to "load" templates directly from String objects.

2. Installation of FreeMarker

To use FreeMarker download the latest version of it from the following webpage and add it to the classpath of your Java project.

http://freemarker.org/freemarkerdownload.html

3. Eclipse Integration

FreeMarker code completion and syntax highlighting is part of the JBoss Tools. Add the following update site to your Eclipse installation via Help ▸ Install New Software…​

http://download.jboss.org/jbosstools/updates/stable/kepler/

4. Basic example

Create a new Java project called com.vogella.freemarker.first. Create a new folder called lib and add the Freemarker library to it. Add this library to the classpath for your project.

If you don’t know how to achieve that, please see the Eclipse IDE Tutorial for instructions on the required steps.

Create a new folder called templates inside the folder of the com.vogella.freemarker.first package. Inside that, create the following file with name helloworld.ftl.

<html>
<head>
<title>${title}
</head>
<body>
<h1>${title}</h1> <p>${exampleObject.name} by ${exampleObject.developer}</p> <ul>
<#list systems as system>
<li>${system_index + }. ${system.name} from ${system.developer}</li>
</#list>
</ul> </body>
</html>

Create the following class which demonstrates the usage of Java objects in templates.

package com.vogella.freemarker.first;

public class ValueExampleObject {

        private String name;
private String developer; public ValueExampleObject(String name, String developer) {
this.name = name;
this.developer = developer;
} public String getName() {
return name;
} public String getDeveloper() {
return developer;
} }

Create the following class which creates the input for this template and creates the output.

package com.vogella.freemarker.first;

import java.io.File;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map; import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import freemarker.template.Version; public class MainTest { public static void main(String[] args) throws Exception { // 1. Configure FreeMarker
//
// You should do this ONLY ONCE, when your application starts,
// then reuse the same Configuration object elsewhere. Configuration cfg = new Configuration(); // Where do we load the templates from:
cfg.setClassForTemplateLoading(MainTest.class, "templates"); // Some other recommended settings:
cfg.setIncompatibleImprovements(new Version(, , ));
cfg.setDefaultEncoding("UTF-8");
cfg.setLocale(Locale.US);
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // 2. Proccess template(s)
//
// You will do this for several times in typical applications. // 2.1. Prepare the template input: Map<String, Object> input = new HashMap<String, Object>(); input.put("title", "Vogella example"); input.put("exampleObject", new ValueExampleObject("Java object", "me")); List<ValueExampleObject> systems = new ArrayList<ValueExampleObject>();
systems.add(new ValueExampleObject("Android", "Google"));
systems.add(new ValueExampleObject("iOS States", "Apple"));
systems.add(new ValueExampleObject("Ubuntu", "Canonical"));
systems.add(new ValueExampleObject("Windows7", "Microsoft"));
input.put("systems", systems); // 2.2. Get the template Template template = cfg.getTemplate("helloworld.ftl"); // 2.3. Generate the output // Write output to the console
Writer consoleWriter = new OutputStreamWriter(System.out);
template.process(input, consoleWriter); // For the sake of example, also write output into a file:
Writer fileWriter = new FileWriter(new File("output.html"));
try {
template.process(input, fileWriter);
} finally {
fileWriter.close();
} }
}

5. Useful FTL tricks

5.1. Reuse common template fragments

When you find yourself copy-pasting common parts between templates a lot, you should probably use macros.

Continuing our last example, create a new folder called lib inside the templates directory, and there create a file called utils.ftl, with this content:

<#macro page>
<html>
<head>
<title>${title}
</head>
<body>
<h1>${title}</h1> <#-- This processes the enclosed content: -->
<#nested>
</body>
</html>
</#macro> <#macro otherExample p1 p2>
<p>The parameters were: ${p1}, ${p2}</p>
</#macro>

Now you can simplify helloworld.ftl like this:

<#import "lib/utils.ftl" as u>

<@u.page>
<p>${exampleObject.name} by ${exampleObject.developer}</p> <ul>
<#list systems as system>
<li>${system_index + }. ${system.name} from ${system.developer}</li>
</#list>
</ul> <#-- Just another example of using a macro: -->
<@u.otherExample p1= p2= />
</@u.page>

Another way of reusing template fragments is moving the common fragment into its own ftl file. Then just insert it with <#include "lib/myfragment.ftl">. This is less flexible than macros, but simpler in concept: it mimics copy-pasting.

5.2. Variables

You can define and assign content to variables inside the FTL files for easy reuse.

<#assign var_link = "http://www.vogella.com/people/larsvogel.html">

<a href="${var_link}">About Lars Vogel</a>

5.3. Handling null/undefined values

FreeMarker requires you to provide an explicit default for variables, so avoid values that are null or undefined:

<!-- Acts like if the color was N/A if there's no color: -->
<p>Color: ${color!'N/A'}</p> <!-- Avoid the whole color row if there's no color: -->
<#if color??>
<p>Color: ${color}</p>
</#if>

5.4. Escape

When generating HTML, it’s important to escape <&, etc. in values that were not meant to store HTML and can contain these problematic characters. You can apply such escaping like ${message?html}. You can also ask FreeMarker to add ?html to all ${} -s in a section like this:

<#escape x as x?html>
<p>Sender: ${from}
<p>Title: ${title}
<p>Message: ${body}
</#escape>

It’s important to understand that #escape only affects the ${} bits that are inside the enclosed section in the template file when you look at it in a text editor. That means, ${} embracements which are in other templates or macros called from there, won’t be affected.

转载自:http://www.vogella.com/tutorials/FreeMarker/article.html


Using FreeMarker templates (FTL)- Tutorial的更多相关文章

  1. [Freemarker] - 使用struts的component调用freemarker的ftl模板方法

    struts中的component标签,可以用来调用freemarker的ftl模板文件,使用component标签传参可以这样写: 使用property方式写法: <s:component t ...

  2. freemarker(FTL)常见语法大全

    [转载]freemarker(FTL)常见语法大全 FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}  ${boo ...

  3. FreeMarker之FTL指令

    assign指令 此指令用于在页面上定义一个变量 (1)定义简单类型: <#assign linkman="周先生"> 联系人:${linkman} (2)定义对象类型 ...

  4. freemarker【FTL】常见语法大全

    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断如果 ...

  5. JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载

    这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/13072711.html 引入jar包,freemarker.jar.apache-ant-zip- ...

  6. 修改freemarker的ftl时,不重启tomcat的办法(使用了springMVC)

    一.在使用Freemarker 时,需要在spring-mvc.xml 配置文件中作如下配置: <!-- 配置freeMarker的模板路径 --> <bean id="f ...

  7. FTL(FreeMarker)基础

    FreeMarker标签使用一.FreeMarker模板文件主要有4个部分组成1.文本,直接输出的部分2.注释,即<#--...-->格式不会输出3.插值(Interpolation):即 ...

  8. Freemarker 程序开发

    Freemarker 程序开发 现在web开发中,多使用freemarker 来描述页面.通常会使用的macro来定义各种组件,从而达到UI组件的复用.结合使用其它的指定,可快速的描述一个html页面 ...

  9. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

随机推荐

  1. C++学习笔记 封装 继承 多态 重写 重载 重定义

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  2. java中一些定时器的使用

    一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便. ...

  3. MQTT——java简单测试(二)

    服务端代码: package bsit.mqtt.demo.one_way; import org.eclipse.paho.client.mqttv3.MqttClient; import org. ...

  4. Git的.gitignore文件配置

    .gitignore是Git工具的配置文件,用于屏蔽某些文件上传到线上. 创建.gitignore 在window系统中,不允许新建文件名以"."开头的文件,所以通过git bas ...

  5. (转载)Spring的refresh()方法相关异常

    如果是经常使用Spring,特别有自己新建ApplicationContext对象的经历的人,肯定见过这么几条异常消息:1.LifecycleProcessor not initialized - c ...

  6. ReactiveX编程范式

    ReactiveX http://reactivex.io/ An API for asynchronous programmingwith observable streams The Observ ...

  7. [转]word2vec使用指导

    word2vec是一个将单词转换成向量形式的工具.可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度. 一.理论概述 (主要来源于http://lic ...

  8. 代码回滚:git reset、git checkout和git revert区别和联系

    git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...

  9. 关于Java内存模型的解读

    运行时数据区域 运行时数据区包括以下五大部分:方法区.堆.虚拟机栈.本地方法栈.程序计数器.其中,方法区和堆是由所有线程共享的数据区,其他区域是线程隔离的数据区. 程序计数器: 程序计数器是一块较小的 ...

  10. CentOS 6.2 SVN搭建 (YUM安装)

    安装说明 安装了一下SVN服务器,本文没有与Apache整合,过程如下: 系统环境:CentOS-6.2安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN ...