一、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 学习的更多相关文章

  1. Freemarker学习中遇到的问题

    在网上找到了尚学堂的视频,同时有书和源码等资料.但是在跟着练习的过程中,代码运行报了错: 2015-7-20 22:26:40 freemarker.log.JDK14LoggerFactory$JD ...

  2. freemarker学习#1

    在工作的过程中遇到了.ftl文件.打开发现里面是一些类似于html的代码,非常好奇这是一种什么样的文件,于是去网上搜了一下,了解到.ftl是Freemarker模板的文件后缀名.将问题转移到了Free ...

  3. FreeMarker学习(宏<#macro>的使用)

    原文链接:https://my.oschina.net/weiweiblog/blog/506301?p=1 用户定义指令-使用@符合来调用  有两种不同的类型:Macro(宏)和transform( ...

  4. freemarker学习

    链接: http://swiftlet.net/archives/category/freemarker

  5. FreeMarker学习教程

    copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...

  6. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)

    什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...

  7. freemarker学习笔记

    在模板中定义的变量有三种类型: 引用 1:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换. 2:局部变量:在宏定义体中有效,使用loca ...

  8. Rhythmk 一步一步学 JAVA (10): Freemarker 学习 1 - 入门

    FreeMarker 笔记: 1. 注释:   <#-- 注释内容 -#> 2.<#if condition> content1 <#else> content2 ...

  9. FreeMarker学习系列之一

    一. 基本概念 ${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式插值 FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似 ...

随机推荐

  1. 机器学习利器——Scikit-learn的安装

    由于笔者最近在进行毕业论文的准备,且毕业论文中需要用到Python版本的机器学习库——scikit-learn.所以最近三天一直在Windows上部署这个框架,终于部署成功了... 首先打开加州大学底 ...

  2. openjudge2985(数字组合)

    描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如:n=5,5个数分别为1,2,3,4,5,t=5:那么可能的组合有5=1+4和5=2+3和5=5三种组合方式.输入输入的第一行是两 ...

  3. C++中有符号/无符号数比较

    原创文章,欢迎阅读,禁止转载. 在我的程序中有如下代码编译被警告了 if(list.size()>msize){...} warning C4018: '<' : signed/unsig ...

  4. jsp_内置对象_request

    request内置对象是使用最多的一个对象,其主要作用是接收客户端发送来的请求信息.如请求的参数.发送的头信息等都属于客户端发送来的信息.request是javax.servlet.http.Http ...

  5. 关于Java线程意外退出自动重启..

    最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停2秒.一切都像想象中的辣么美好.可是在后面的测试中发现收不到推送的消息了,接着发现了原来推送的线程由 ...

  6. linux时钟基本概念、CST与UTC、以及NTP简单设置

    1,安装linux的时候在设置时间的时候有一个选项:system clock uses UTC,那么这个UTC是什么意思呢? 世界协调时间(Universal Time Coordinated,UTC ...

  7. u3d avatar部件的理解

    u3d中带动画的fbx文件导入的时候,就会显示一个avatar组件,这个到底干嘛的一直没能很好的理解,翻看网上的介绍,基本都是告诉你,设置humanoid类型动画时,拖拉过去之类,但是这玩意到底存储了 ...

  8. linux mysql

    安装mysql 1.使用rpm 安装mysql 或者使用yum安装 使用rpm 安装 下载 Centos 7 所需要的mysql包 tar -xf 解压整合包 根据依赖 安装 common>li ...

  9. Software Testing Lab1

    Junit和Hamcrest的安装需要先把两个jar文件下载到本地,具体取得方式多种多样,我是直接从同学那要的.新建一个java项目,在新建时直接在库中导入这两个包即可. 这次编程内容是一个测试三角形 ...

  10. docker pull certification error

    export DOMAIN_NAME=<my-dtr-domain> echo -n | openssl s_client -showcerts -connect itapregistry ...