FreeMarker入门

简介: 本文将带你入门FreeMarker。

什么是FreeMarker?

FreeMarker 是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个 java 类库,最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。

模板编写使用FreeMarker Template Language(FTL)。使用方式类似JSP的EL表达式。模板中专注于如何展示数据,模板之外可以专注于要展示什么数据。

image

为什么用FreeMarker?

FreeMarker 基于数据模型和模板来渲染,将业务逻辑和表现层分离。JSP开发中,页面会有大量业务逻辑,不利于维护和阅读,使用FreeMarker可以避免这一问题。

有利于分工合作。HTML设计师可以关注页面的设计无需面对页面的业务逻辑,同时修改页面代码也不需要程序员编重新译代码。

提高开发效率。相对于JSP,FreeMarker不需要每次修改后重新编译,因此在开发调试中可以有效节省时间。

有利于提高访问速度。对于不会频繁发生变化的页面,建议使用FreeMarker生成的静态页面。而不是每次都要动态生成的JSP页面。

可以提高并发量。例如单台tomcat容器只支持几百并发,如果将静态页面放到性能更好的nginx服务器上,可以支持几万的并发。

静态页面对SEO更友好。

不占用JVM的PermGen space。因为不会被编译成类,所以不会占用web服务器永生代的空间,避免OutOfMemoryError:PermGen space的问题。

怎么用FreeMarker?

在java中使用

@Test
    public void testFreeMarker() throws Exception {
        // 把freemarker的jar包添加到工程中
        //创建一个Configuration对象
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 告诉config对象模板文件存放的路径。
        configuration.setDirectoryForTemplateLoading(new File("ftl directory absolute path"));
        // 设置config的默认字符集。一般是utf-8
        configuration.setDefaultEncoding("utf-8");
        //从config对象中获得模板对象。需要制定一个模板文件的名字。
        Template template = configuration.getTemplate("test.ftl");
        //创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。
        Map root = new HashMap<>();
        root.put("hello", "hello freemarker");
        //创建一个Writer对象,指定生成的文件保存的路径及文件名。
        Writer out = new FileWriter(new File("out html file absolute path"));
        //调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
        template.process(root, out);
        //关闭writer对象。
        out.flush();
        out.close();
    }

模板加载器

当然也可以不指定绝对路径,使用模板加载器,FreeMarker提供了模板加载器可以直接从数据源加载模板。

ClassTemplateLoader:从classpath中加载模板。

FileTemplateLoader:在文件系统中从指定文件夹加载模板。

StringTemplateLoader:从一个字符串 Map 中加载模板。

URLTemplateLoader:从 URL 中加载模板。 你必须要实现 getURL 方法。

WebappTemplateLoader:从 servlet 上下文中加载模板。

使用方式:

Configuration configuration = new Configuration();
configuration.setTemplateLoader(
new WebappTemplateLoader(servletContext, "WEB-INF/content"));

在项目中使用

在项目中使用的话,可以直接托管给框架即可。

添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.1.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

配置spring

<bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>

然后使用时从FreeMarkerConfigurer拿到Configuration对象:

Configuration configuration = freeMarkerConfigurer.getConfiguration();

FreeMarker 基本语法

简单类型

使用类似EL表达式。

${hello}

包装类型

<html>
<head>
    <title>${title}</title>
</head>
<body>
    <label>学号:</label>${student.id}<br>
    <label>姓名:</label>${student.name}<br>
</body>
</html>

遍历集合/数组

<#list people as p>
    ${p.id}/${p.name}
</#list>

获取当前迭代索引

<#list people as p
    ${p_index}
</#list>

添加判断条件

<#if 条件>
<#else>
</#if>

日期类型

默认格式

1:date
${cur_time?date}
2:datetime
${cur_time?datetime}
3:time
${cur_time?time}

自定义格式

${cur_time?string("yyyy-MM-dd HH:mm:ss")}

处理 null 值

map.put("val",null)

val值为:${val!}

当val为空时,显示为空字符串,即

val值为:

也可以指定值为空时的默认值。

${val!"默认值"}

也可以使用条件语句做非空判断。

<#if curdate ??>
    当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")}
    <#else>
    curdate属性为null
    </#if>

include可以引入其他模板片段。

<#include "/include/head.ftl">

json 支持

?eval 可以将字符串转为json对象,然后在模板中当包装类型使用。

<#assign user = userString?eval>
User:${user.name}

共享变量

可以设置自动添加到所有模板的数据,这样就可以在所有模板中使用。

configuration.setSharedVariable("share_value_key", "share_value");

补充

需要使用FreeMarker的页面在数据库更新时要及时更新,否则用户访问到的会是过期的页面。

FreeMarker数据模型的map的key只可以是String类型。

原文发布时间为:2018-07-28
本文来自云栖社区合作伙伴“Java杂记”,了解相关信息可以关注“Java杂记

相关文章
|
4月前
|
XML 数据格式
SpringMVC中使用FreeMarker实践
SpringMVC中使用FreeMarker实践
27 0
|
11天前
|
XML Java 数据格式
freemarker从入门到精通
freemarker从入门到精通
|
4月前
|
缓存
FreeMarker实践总结
FreeMarker实践总结
24 1
|
6月前
|
存储 JavaScript 前端开发
Thymeleaf入门教程
Thymeleaf入门教程
77 0
|
XML Java 程序员
模板引擎:第一章:FreeMarker
模板引擎:第一章:FreeMarker
160 0
模板引擎:第一章:FreeMarker
|
设计模式 前端开发 Java
【JavaWeb】模板引擎Thymeleaf
内容提取出来单独的放在一个文件中,称为模板,对于一些动态的内容,可以将这些内容在模板中使用占位符占位,当服务器把这些动态的内容计算好了之后,就可以把模板中占位符替换成动态计算的结果,然后把组装好的HTML格式的字符串在返回给浏览器
【JavaWeb】模板引擎Thymeleaf
|
Java 程序员 Apache
模板引擎——FreeMarker初体验
FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。
|
前端开发 Java
Freemarker - 基础篇(上)
Freemarker - 基础篇(上)
310 0
Freemarker - 基础篇(上)
|
前端开发
Freemarker - 基础篇(下)
Freemarker - 基础篇(下)
164 0
Freemarker - 基础篇(下)
|
移动开发 Java HTML5
Thymeleaf 5 分钟教程
Thymeleaf 是一个用于 web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板ー HTML,它既可以在浏览器中正确显示,也可以作为静态原型工作,从而加强开发团队之间的协作。 有了 Spring Framework 的模块、大量与您最喜欢的工具集成的功能,以及插入您自己功能的能力,Thymeleaf 是现代 HTML5 JVM web 开发的理想选择ーー尽管它可以做的还有很多。 用 Thymeleaf 语言编写的 HTML 模板看起来和工作方式仍然类似于 HTML,使得在应用程序中运行的实际模板仍然可以作为有用的设计工件工
147 0