Freemarker模板引擎技术
Freemarker模板引擎
1:技术概述
1.1模板引擎技术
Freemarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:
(1)Freemarker 适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
(2)虽然Freemarker 具有一些编程的能力,但通常由Java程序准备要显示的数据,由Freemarker 生成页面,通过模板显示准备的数据 。
(3)Freemarker 不是一个Web应用框架,而适合作为Web应用框架一个组件。
(4)Freemarker 与容器无关,因为它并不知道HTTP或Servlet。
(5)Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
下载地址:
https://sourceforge.net/projects/freemarker-ide/files/freemarker-ide/
下载freemarker-ide-0.9.14.zip (909.6 kB)
2:为什么要使用freemarker
在互联网软件内容网站中 一般首页的访问量大,为了提供首页的访问效率,一般 首页的内容以及其中的新闻等信息都可以实现html静态化 浏览器访问时 设置浏览器的缓存策略和生成静态页面的周期一致 可以使访问效率大大提升 同时配合cdn处理图片 js css等资源 可以在首页访问时 理论完全脱离数据库 降低应用压力
2:Freemarker安装
将freemarker的jar加入项目,下载freemarker的插件,找到它的plugins目录,将该目录下的文件拷贝到eclipse的plugins目录下,重启eclipse,新建个ftl文件,该文件中的内容显示为不同的颜色,可以视为插件安装成功。
例:
3:基本语法
1:FreeMarker标记
FreeMarker标记的设计非常精炼,只有三种:
1) $ : ${expression} FreeMarker会在输出时用实际值进行替代
例如:${stockNum?default(‘’)}
2) # :标准的FTL标记。大部分FreeMarker指令都以#开始,可以明显地与html标记区分,
<#if user = "BigJoe">our beloved leader</#if>。
同时,FTL文件的注释包含在<#--和-->(而不是<!--和-->)之间
3) @作为用户定义指令使用宏变量时,使用@替代FTL标记中的#。后面将详细介绍宏
2:标准的FTL标记指令
1) if, else, elseif语法
<#if 条件1>内容或逻辑
<#elseif 条件2>内容或逻辑
<#elseif 条件3>内容或逻辑
<#else>内容或逻辑
</#if>
2) switch, case, default, break
3) list, break语法(循环)
<#list 集合或数组 as 临时变量>
<#if item="spring"><#break></#if>...
</#list>
关键字:临时变量_index:是list当前值的下标
临时变量_has_next:判断list是否还有值
4) include语法(包含)
<#include “filename”>
or<#include “filename” options>
options包含两个属性encoding=”GBK” 编码格式parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”
需要注意的是,没有结束标签。
5) Import与include
如果在两个模板中都分别存在变量名相同的变量,include会包含进来,当同时使用这两个变量时,后一个变量会覆盖前一个变量的值,为了防止,可以使用import进行导入,
Import的使用方式:
<#import “模板路径” as 别名>
通过别名可以获取模板中的变量值,可以防止变量覆盖
6) assign生成变量,并且给变量赋值
常见的语法形式:
<#assign name=value>
Or
<#assign name1=value1 name2=value2 ...nameN=valueN>
Or
<#assign name> capture this</#assign>
Or
<#assign name in namespacehash>
capture this
</#assign>
需要注意的是,如果<#assign></#assign>之间没有内容,则jvm会报错,所以,当它们之间没有内容时,去掉</#assign>
macro,宏指令(特有的),可以理解为java中的方法
定义如下:mymacro是宏的别名,p1 p2是参数,中间是逻辑
调用<@宏名 参数1 参数2>
例:
<#macro mymacro p1 p2>
输出的结果是 :${p1+p2}
</#macro>
<@mymacro p1=10 p2=200/>
Nested:代替调用宏指令时标签对之间包裹的内容,使用如下
4:在javase中的使用:
例:
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration();
//配置ftl查找目录
cfg.setDirectoryForTemplateLoading(
new File("template"));
//设置数据的抓取模式
cfg.setObjectWrapper(new DefaultObjectWrapper());
//构建数据
Map root = new HashMap();
root.put("user", "Big Joe");
Map latest = new HashMap();
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
root.put("latestProduct", latest);
root.put("sex", "1");
//添加个数组
String[] str=new String[]{"1","2","3","4"};
root.put("array", str);
//添加个对象
List list=new ArrayList<>();
User user=new User();
user.setId("1");
user.setName("zs");
list.add(user);
User user1=new User();
user1.setId("1");
user1.setName("zs");
list.add(user1);
root.put("list", list);
//实例化模板对象
Template temp = cfg.getTemplate("helloFreeMark.ftl");
//生成html,输出到目标
FileOutputStream fos=new FileOutputStream("E:\\框架\\freemarker框架\\html\\freemark.html");
Writer out = new OutputStreamWriter(fos);
//Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
}
在ftl文件中的应用,例:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
<#--FTL中的if else指令的用法 -->
性别为
<#if sex="1">男
<#else>女
</#if>
<#--FTL中的循环 -->
用户信息为
<#list list as tem>
${tem.id}-----${tem.name}
</#list>
<#list array as arrTmp>
<#if arrTmp_index%2==0>
<font color=green>${arrTmp}__${arrTmp_index}</font>
<#else>
<font color=red>${arrTmp}__${arrTmp_index}</font>
</#if>
</#list>
</body>
</html>
5:在javaee中的举例:
和javase差不多,只是需要在web.xml中配置一些格式:
例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>freemarker_web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!-- 模板的查找路径 -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<!--是否需要缓存-->
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<!--最终显示是html格式-->
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
<!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
</init-param>
<!--编码格式-->
<init-param>
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--数字格式-->
<init-param>
<param-name>number_format</param-name>
<param-value>0.##</param-value>
</init-param>
<!--SERVLET 容器启动时实例化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>