FreeMarker 是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个 java 类库,最初被设计用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也能够用于非Web应用环境中。html
模板编写使用FreeMarker Template Language(FTL)。使用方式相似JSP的EL表达式。模板中专一于如何展现数据,模板以外能够专一于要展现什么数据。java
FreeMarker 基于数据模型和模板来渲染,将业务逻辑和表现层分离。 JSP开发中,页面会有大量业务逻辑,不利于维护和阅读,使用FreeMarker能够避免这一问题。nginx
**有利于分工合做。**HTML设计师能够关注页面的设计无需面对页面的业务逻辑,同时修改页面代码也不须要程序员编从新译代码。程序员
**提升开发效率。**相对于JSP,FreeMarker不须要每次修改后从新编译,所以在开发调试中能够有效节省时间。web
**有利于提升访问速度。**对于不会频繁发生变化的页面,建议使用FreeMarker生成的静态页面。而不是每次都要动态生成的JSP页面。spring
**能够提升并发量。**例如单台tomcat容器只支持几百并发,若是将静态页面放到性能更好的nginx服务器上,能够支持几万的并发。数据库
静态页面对SEO更友好。json
**不占用JVM的PermGen space。**由于不会被编译成类,因此不会占用web服务器永生代的空间,避免OutOfMemoryError:PermGen space的问题。数组
@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提供了模板加载器能够直接从数据源加载模板。tomcat
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();
复制代码
使用相似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")} 复制代码
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/head.ftl"> 复制代码
?eval
能够将字符串转为json对象,而后在模板中当包装类型使用。
<#assign user = userString?eval> User:${user.name} 复制代码
能够设置自动添加到全部模板的数据,这样就能够在全部模板中使用。
configuration.setSharedVariable("share_value_key", "share_value"); 复制代码
须要使用FreeMarker的页面在数据库更新时要及时更新,不然用户访问到的会是过时的页面。
FreeMarker数据模型的map的key只能够是String类型。