FreeMarker 学习
一、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} <#-- 引用的是 -->
b.ftl
<#macro copyright date>
<p>Copyright (C) ${date} 北京尚学堂.</p>
</#macro>
<#assign mail = "bjsxt@163.com">
index.ftl
<#macro copyright date>
<p>Copyright (C) ${date}</p>
</#macro>
<#assign mail = "bjsxt@163.com">
三、在WEB项目中使用 (官方demo)
public class FreemarkServlet extends HttpServlet{
private Configuration cfg;
public void init() {
cfg=new Configuration();
cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
Map<String,Object> root = new HashMap<String,Object>();
root.put("message", "Hello World!");
Template template = cfg.getTemplate("index.ftl");
Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), template.getEncoding()));
response.setContentType("text/html; charset=" + template.getEncoding());
try {
template.process(root, out);
out.flush();
} catch (TemplateException e) {
throw new ServletException( "Error while processing FreeMarker template", e);
}
}
}
1、在WEB-INF下建立目录 templates 在里面建文件 index.ftl
<html>
<head>
<meta charset="UTF-16">
<title>FreeMarker Example Web Application 1</title>
</head>
<body>
${message}
</body>
</html>
2、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>freeMark</servlet-name>
<servlet-class>com.jalja.servlet.FreemarkServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freeMark</servlet-name>
<url-pattern>/freeMark</url-pattern>
</servlet-mapping>
</web-app>
在WEB-INF下建立目录 templates 在里面建文件 index.ftl
FreeMarker 学习的更多相关文章
- Freemarker学习中遇到的问题
在网上找到了尚学堂的视频,同时有书和源码等资料.但是在跟着练习的过程中,代码运行报了错: 2015-7-20 22:26:40 freemarker.log.JDK14LoggerFactory$JD ...
- freemarker学习#1
在工作的过程中遇到了.ftl文件.打开发现里面是一些类似于html的代码,非常好奇这是一种什么样的文件,于是去网上搜了一下,了解到.ftl是Freemarker模板的文件后缀名.将问题转移到了Free ...
- FreeMarker学习(宏<#macro>的使用)
原文链接:https://my.oschina.net/weiweiblog/blog/506301?p=1 用户定义指令-使用@符合来调用 有两种不同的类型:Macro(宏)和transform( ...
- freemarker学习
链接: http://swiftlet.net/archives/category/freemarker
- FreeMarker学习教程
copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...
- freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)
什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...
- freemarker学习笔记
在模板中定义的变量有三种类型: 引用 1:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换. 2:局部变量:在宏定义体中有效,使用loca ...
- Rhythmk 一步一步学 JAVA (10): Freemarker 学习 1 - 入门
FreeMarker 笔记: 1. 注释: <#-- 注释内容 -#> 2.<#if condition> content1 <#else> content2 ...
- FreeMarker学习系列之一
一. 基本概念 ${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式插值 FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似 ...
随机推荐
- codeIgniter怎么实现对input type=text对话框blur事件的监听以及传值?
如题,这个问题怎么解决? 用JS和前端框架习惯了,现在学后端框架,感觉各种坑...
- this、super关键字
this关键字 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性. public class Demo{ public int x = 10; ...
- Asp.Net异步编程-使用了异步,性能就提升了吗?
Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...
- CentOS 7 安装 vmware-tools
[原创]标题:<CentOS 7 安装 vmware-tools>:作者:肖雪峰,QQ:35360657. 用 VMware Workstation 11 新安装了CentOS 7虚拟机, ...
- FastCgi 与 PHP-FPM
- 如果现在请求的是 /index.php,根据配置文件,nginx 知道这个不.是静态文件,需要去找 PHP 解析器来处理,那么他会把这个请求简单处理后交给 PHP 解析器.Nginx 会传哪些数据 ...
- Linux 下比较文件内容并相同部分、不同部分
说明,是通过file2内容与file1做比较,最后列出file1与file2不同的部分! 一.准备两个文件: [root@kinggoo.com test1]# cat file1 a b c d e ...
- 2013-09-25-【随笔】-Roy
路怒了. 要淡定,心态要好. 不能和不要命的傻X较劲. 路怒不好! 淡定!
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
- VS2012 编译带有c/c++代码的python模块失败解决方案
python2.7默认编译带有/c++代码的模块/包是使用VS2008环境变量,所以为了可用,我们要在编译前设置环境变量 SET VS90COMNTOOLS=%VS110COMNTOOLS% 但有时只 ...
- Grpc微服务从零入门
快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...