一、FreeMarker
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。(百度百科)
FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。
FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境。
优点:
1. FreeMarker的优点一,可以彻底的分离表现层和业务逻辑。
使用JSP 开发过程中发现在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。
FreeMarker根本不支持Java脚本代码。
FreeMarker的原理就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。
2. FreeMarker的优点二,可以提高开发效率。
使用JSP 页面来展示数据的,即所谓的表现层。大家都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,大家在不必在等待界面设计开发人员完成页面原形后,大家再来开发程序。
缺点:
1.FreeMarker的缺点一,应用FreeMarker模板技术,在修改模板后,可能会看到已经过期的数据。如:生成静态的HTML页面后,如果一旦模板改变,而没有及时更新模板生成的HTML页面的话,用户看到的就是过期的数据。
2.FreeMarker的缺点二,FreeMarker不支持集群应用。为了编成的方便性,把序列化的东西都放到了Session中,如Session,request等,在开发的过程中确实方便,但如果将应用放到集群中,就会出现错误。
二、数据格式
freeMark 的数据格式是树状结构 ,使用Map封装数据 key必须是string,其他数据类型无法操作。
三、使用
public static void main(String[] args) throws IOException, TemplateException{ //创建Freemarker配置实例 Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File("templates")); //创建数据模型 Map<String,Object> root = new HashMap<String,Object>(); root.put("name", "张三");//字符串类型 root.put("random", new Random().nextInt(100)); List<Map<String,Object>> listMap=new ArrayList<Map<String,Object>>(); Map<String,Object> map = new HashMap<String,Object>(); map.put("name", "A1"); map.put("name", "A2"); listMap.add(map); root.put("listMap", listMap); //加载模板文件 Template template=cfg.getTemplate("a.ftl"); //显示生成的数据 Writer writer=new OutputStreamWriter(System.out); // Writer writer = new OutputStreamWriter(new FileOutputStream("html/index.html"),"UTF-8"); template.process(root, writer); writer.flush(); }
a.ftl
你好 ${name} 欢迎学习FreeMarker<#--if 语句 -->#if 语句<#if name=="张三">张三</#if><#-- if else--># gt 大于 gte 大于等于 <#if random gt 60 > ${random}: 及格 <#else> ${random}: 不及格</#if><#-- if else if else语句测试: --><#if random gte 90> ${random}:优秀!<#elseif random gte 80> ${random}:良好!<#else> ${random}: 一般! </#if><#-- 遍历List --><#list listMap as map > <b>${map.name}</b> <br/></#list><#-- include --><#include "index.ftl" /><#-- 自定义指令 macro指令--><#macro m1> <#--定义指令m1 --> <b>aaabbbccc</b> <b>dddeeefff</b></#macro><@m1 /> <#--调用上面的宏指令 --><#-- 定义带参的宏指令: --><#macro m2 a b c > ${a}--${b}--${c}</#macro><@m2 a="老高" b="老张" c="老马" /><#-- nested指令: --><#macro border> <table border=4 cellspacing=0 cellpadding=4> <tr> <td> <#nested> </td> </tr> </table> </#macro><@border >表格中的内容! 方式二</@border><#-- 命名空间 --> <#import "b.ftl" as bb /> <@bb.copyright date="2010-2011" /> ${bb.mail} <#assign mail="my@163.com" /> ${mail} <#-- 引用的是 --> <#assign mail="my@126.com" in bb /> ${bb.mail} <#-- 引用的是 -->
View Code
b.ftl
<#macro copyright date> <p>Copyright (C) ${date} 北京尚学堂.</p> </#macro> <#assign mail = "bjsxt@163.com">
View Code
index.ftl
<#macro copyright date> <p>Copyright (C) ${date}</p> </#macro> <#assign mail = "bjsxt@163.com">
View Code
原标题:FreeMarker 学习
关键词:FreeMarker