什么是FreeMakrer
模板引擎技术
FreeMakrer是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:
(1)FreeMakrer适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
(2)虽然FreeMakrer具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMakrer生成页面,通过模板显示准备的数据 。
(3)FreeMakrer不是一个Web应用框架,而适合作为Web应用框架一个组件。
(4)FreeMakrer与容器无关,因为它并不知道HTTP或Servlet。
(5)Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
数据模型+模板=输出
FreeMakrer的下载
<font color=#847oFF>jar 包:可在www.freemarker.org下载 ,或者取maven.aliyun.com下载</font>
插件:可在www.freemarker.org下载或者百度
插件放入eclipse中plugins目录下即可
FreeMakrer的基本语法
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
2) switch, case, default, break
3) list, break
4) include
5) Import
6) assign
7) macro, nested, return
if, else, elseif
例子
public class TestFreeMarker {
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration();
//配置ftl查找目录
cfg.setDirectoryForTemplateLoading(
new File("template"));
//设置数据的抓取模式
cfg.setObjectWrapper(new DefaultObjectWrapper());
Map latest = new HashMap();
//构建数据
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
// 创建一个hashMap
Map root = new HashMap();
// 存入值
root.put("user", "Big Joe");
root.put("latestProduct", latest);
root.put("sex", "1");
//数组list break 循环
String[] str=new String[]{"1","2","3","4","5"};
root.put("arr",str);
List list=new ArrayList();
User user=new User();
user.setId("1");
user.setName("张三");
list.add(user);
User user1=new User();
user1.setId("2");
user1.setName("李四");
list.add(user1);
root.put("userList", list);
//找到模板对象 实例模板对象
Template temp = cfg.getTemplate("hello.ftl");
//文件输出流
FileOutputStream fos=new FileOutputStream("E:\\html\\hello.html");
//输出到目标生成html
Writer out = new OutputStreamWriter(fos);
temp.process(root, out);
out.flush();
}
}
public class User {
private String id;
private String name;
public User(){
}
public User(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
freeemarker模板语法
freemarker的模板 ftl为后缀 语法类似于jsp的标签
添加 hellworld.ftl
<!-- 定义模板-->
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
<br/>
<#--
if标记 键=值
-->
我的性别是: <br/>
<#if sex = '1'>
男 <br/>
<#else>
女 <br/>
</#if>
<#--
list循环标记 数据或集合 as 临时变量
临时变量_index 获取当前的索引从0开始
break 标记用于退出循环
-->
输出数组结果: <br/>
<#list arr as tmp>
<#if tmp_index=2>
<#break>
</#if>
<#if (tmp_index+1)%2==0>
<font color=green size=10>${tmp}--->${tmp_index+1}</font> <br/>
<#else>
<font color=red size=10>${tmp}--->${tmp_index+1}</font> <br/>
</#if>
</#list>
输出list结果: <br/>
<#list userList as userTmp>
${userTmp.id}---->${userTmp.name} <br/>
</#list>
<br/>
</body>
</html>
freemarker内置的处理函数(http://freemarker.org/docs/ref_builtins.html)
函数调用 语法为
变量?函数名(参数)
{‘ aaa ’?trim}
以下是字符串串函数的用法:
<#--FTL内置的处理函数-->
<#assign str=' hello my name is zhang '>
<#assign str1='HELLO WORLD'>
<#--获取长度-->
${str?length}
<#--取空格-->
--${str?trim}--
<#--转小写-->
${str1?lower_case}
<#--转大写-->
${str?upper_case}
<#--获得序列中元素的数目-->
${userList?size}
<#--取得数字的整数部分-->
${1.6?int}
${userList?size}
<#--精度为3位-->
${1.656464513546313574652?float}
<#--判断变量是否存在-->
<#if aaa?exists>
${aaa}
</#if>
定义变量:
<#assign age=12>
javaee环境下 使用freemarkerservlet寻找ftl文件并输出
添加一个servlet 映射路径 /t web.xml添加:
<servlet>
<description></description>
<display-name>TestServlet</display-name>
<servlet-name>TestServlet</servlet-name>
<servlet-class>webtest.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
配置freemarkerservlet 在web.xml添加
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!--模板的查找路径 从上下文根路径查找模板ftl文件 -->
<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>
<!--定时刷新模板-->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value>
</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>