首页 > 技术文章 > 【转】FreeMarker学习笔记

shizilunya 2018-02-08 19:50 原文

出自:CSDN博客 - alingluo  http://blog.csdn.net/luowangcan/article/details/71404205

如有侵权立删

一,介绍

以下内容来自:http://www.oschina.net/p/freemarker

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。

FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据,简单来讲就是模板加数据模型,然后输出页面(如下图)

这里写图片描述

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件

FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境

FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库

FreeMarker是免费的

而且你还可以通过Eclipse的插件来编辑FreeMarker,经过验证,FreeMarker 最好的 Eclipse 编辑插件是 JBoss Tools。

在Maven中使用它:

1 <dependency>
2 <groupId>freemarker</groupId>
3 <artifactId>freemarker</artifactId>
4 <version>2.3.9</version>
5 </dependency>

表示不知道怎么把jar上传到MarkDown编辑器,留个网址下吧。下载地址:http://freemarker.sourceforge.net/freemarkerdownload.html (注:官方网站.org的经常打不开)

 

二,使用环境搭建

  • 创建一个Java项目,这里名为freemarker,在根目录下创建一个名为ftl的文件夹(PS:用来存放freemarker模板),jar啥的就不说了。

  • 创建一个FreeMarkerDemo类,用来生成模板以及处理模板与数据之间的关系并输出:

 1         //第一步:实例化Freemarker的配置类
 2         Configuration conf = new Configuration();
 3         //第二步:给配置类设置路径
 4         String dir = "D:\\java21\\freemarker\\ftl\\";
 5 
 6         conf.setDirectoryForTemplateLoading(new File(dir));
 7 
 8         Template template = conf.getTemplate("freemarker.html");
 9 
10         //第三步:处理模板及数据之间将数据与模板合成一个HTML
11         //第四步:输出html
12         Writer out = new FileWriter(new File(dir+"hello.html"));    

 

定义一个Person对象:

 1 public class Person {
 2     private String id;
 3     private String name;
 4 
 5     public String getId() {
 6         return id;
 7     }
 8 
 9     public void setId(String id) {
10         this.id = id;
11     }
12 
13     public String getName() {
14         return name;
15     }
16 
17     public void setName(String name) {
18         this.name = name;
19     }
20 
21 }

 

对象输出例子

定义数据

1        //定义数据
2         Map<String,Object> root = new HashMap<String,Object>();
3         Person p = new Person();
4         p.setId("111");
5         p.setName("哈哈哈");
6         root.put("person", p);
7         template.process(root, out);
8         out.flush();
9         out.close();

模板页面书写

1 ${person.id}<br /> ${person.name}

点击hello.html查看结果

遍历List例子

定义数据

1         //遍历List
2         List<String> persons = new ArrayList<String>();
3         persons.add("阿灵罗");
4         persons.add("罗零");
5         persons.add("灵罗");
6         root.put("persons",persons);
7         template.process(root, out);
8         out.flush();
9         out.close();

模板页面书写:

1 <#list persons as person> ${person} </#list>
2 
3 <!--获取当前索引  -->
4 <#list persons as p> ${p_index} </#list>

遍历Map

定义数据:

1         //遍历Map
2         Map<String,String> mx = new HashMap<String,String>();
3         mx.put("alingluo", "阿灵罗");
4         mx.put("lling", "罗零");
5         root.put("mx", mx);
6         template.process(root, out);
7         out.flush();
8         out.close();

模板页面书写:

1 <!--Map写法  -->
2     ${mx.alingluo}/${mx.lling} <#list mx?keys as k> ${mx[k]} </#list>

ListMap遍历

定义数据

 1 //遍历List<Map>
 2         List<Map<String,String>> maps = new ArrayList<Map<String,String>>();
 3         Map<String,String> pms1 = new HashMap<String,String>();
 4         pms1.put("id1", "张三");
 5         pms1.put("id2", "李四");
 6         Map<String,String> pms2 = new HashMap<String,String>();
 7         pms2.put("id1", "张三");
 8         pms2.put("id2", "李四");
 9         maps.add(pms1);
10         maps.add(pms2);
11         root.put("maps", maps);
12         template.process(root, out);
13         out.flush();
14         out.close();

模板页面书写:

1 <#list maps as m> ${m.id1}/${m.id2} </#list> <#list maps as m> <#list
2     m?keys as k> ${m[k]} </#list> </#list>

在模板中赋值

1 root.put("world", "世界你好");
 1 <!-- 在模板中赋值 -->
 2     1:<#assign x=0 /> ${x} 
 3     2:<#assign x="${world}" /> ${x} 
 4     3:<#assign x>世界太好了</#assign> ${x}
 5     4:<#assign x>
 6        <#list ["星期一", "星期二", "星期三",
 7          "星期四", "星期五", "星期六", "星期天"] as n> ${n} 
 8        </#list> 
 9      </#assign>
10       ${x}

生成页面对应的值: 
这里写图片描述

判断

 1  <!-- 判断 -->
 2   <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
 3       <#if n != "星期一">
 4          ${n}
 5       </#if>
 6    </#list>
 7 
 8    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
 9       <#if n_index != 0>
10       ${n}
11     </#if>
12    </#list>
13 
14    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
15        <#if (n_index == 1) || (n_index == 3)>
16           ${n}
17        </#if>
18     </#list>
19 
20    <!-- else -->
21    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
22          <#if (n_index == 1) || (n_index == 3)>
23              ${n} --红色
24          <#else>
25             ${n} --绿色
26          </#if>
27      </#list>

 

生成页面效果

这里写图片描述

时间格式

模板页面效果如下:

1  <!--时间格式  -->
2    1:${cur_time?date}
3    2:${cur_time?datetime}
4    3:${cur_time?time}

生成页面效果如下:

这里写图片描述

FreeMarkerDemo全部代码:

public class FreeMarkerDemo {
    public static void main(String[] args) throws IOException, TemplateException {
        //第一步:实例化Freemarker的配置类
        Configuration conf = new Configuration();
        //第二步:给配置类设置路径
        String dir = "D:\\java21\\freemarker\\ftl\\";

        conf.setDirectoryForTemplateLoading(new File(dir));

        Template template = conf.getTemplate("freemarker.html");

        //第三步:处理模板及数据之间将数据与模板合成一个HTML
        //第四步:输出html
        Writer out = new FileWriter(new File(dir+"hello.html"));
        //定义数据
    //  Map root = new HashMap();

        //执行生成


        //定义数据
        Map<String,Object> root = new HashMap<String,Object>();
        Person p = new Person();
        p.setId("111");
        p.setName("哈哈哈");
        root.put("person", p);
        root.put("world", "世界你好");
        //遍历List
        List<String> persons = new ArrayList<String>();
        persons.add("阿灵罗");
        persons.add("罗零");
        persons.add("灵罗");
        root.put("persons",persons);

        root.put("cur_time", new Date());
        //遍历Map
        Map<String,String> mx = new HashMap<String,String>();
        mx.put("alingluo", "阿灵罗");
        mx.put("lling", "罗零");
        root.put("mx", mx);




        //遍历List<Map>
        List<Map<String,String>> maps = new ArrayList<Map<String,String>>();
        Map<String,String> pms1 = new HashMap<String,String>();
        pms1.put("id1", "张三");
        pms1.put("id2", "李四");
        Map<String,String> pms2 = new HashMap<String,String>();
        pms2.put("id1", "张三");
        pms2.put("id2", "李四");
        maps.add(pms1);
        maps.add(pms2);
        root.put("maps", maps);

        //定义数据
        root.put("val", null);


        template.process(root, out);
        out.flush();
        out.close();
    }
}

 

freemarker.html全部代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>


    ${person.id}
    <br /> ${person.name} <#list persons as person> ${person} </#list>

    <!--Map写法  -->
    ${mx.alingluo}/${mx.lling} <#list mx?keys as k> ${mx[k]} </#list>

    <!--List<Map>写法  -->
    <#list maps as m> ${m.id1}/${m.id2} </#list> <#list maps as m> <#list
    m?keys as k> ${m[k]} </#list> </#list>

    <!--获取当前索引  -->
    <#list persons as p> ${p_index} </#list>

    <!-- 在模板中赋值 -->
    1:<#assign x=0 /> ${x} 
    2:<#assign x="${world}" /> ${x} 
    3:<#assign x>世界太好了</#assign> ${x}
    4:<#assign x>
       <#list ["星期一", "星期二", "星期三",
         "星期四", "星期五", "星期六", "星期天"] as n> ${n} 
       </#list> 
     </#assign>
      ${x}

   <!-- 判断 -->
  <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
      <#if n != "星期一">
         ${n}
      </#if>
   </#list>

   <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
      <#if n_index != 0>
      ${n}
    </#if>
   </#list>

   <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
       <#if (n_index == 1) || (n_index == 3)>
          ${n}
       </#if>
    </#list>

   <!-- else -->
   <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
         <#if (n_index == 1) || (n_index == 3)>
             ${n} --红色
         <#else>
            ${n} --绿色
         </#if>
     </#list>
   <!--时间格式  -->
   1:${cur_time?date}
   2:${cur_time?datetime}
   3:${cur_time?time}
   <!-- null -->
   ${val!}

   <!-- 宏定义 -->
   1:
    <#macro table u>
        ${u} 
        </#macro>
    <@table u=8 />
    2:
    <#macro table u>
        ${u}
    <#nested/>
    </#macro>
    <@table u=8 >这是8</@table>

</body>
</html>

 

生成的HTML页面内容如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>


    111
    <br /> 哈哈哈  阿灵罗  罗零  灵罗 

    <!--Map写法  -->
    阿灵罗/罗零  阿灵罗  罗零 

    <!--List<Map>写法  -->
     张三/李四  张三/李四    李四  张三    李四  张三  

    <!--获取当前索引  -->
     0  1  2 

    <!-- 在模板中赋值 -->
    1: 0 
    2: 世界你好 
    3: 世界太好了
    4:    
 星期一 
 星期二 
 星期三 
 星期四 
 星期五 
 星期六 
 星期天 


   <!-- 判断 -->
         星期二
         星期三
         星期四
         星期五
         星期六
         星期天

      星期二
      星期三
      星期四
      星期五
      星期六
      星期天

          星期二
          星期四

   <!-- else -->
            星期一 --绿色
             星期二 --红色
            星期三 --绿色
             星期四 --红色
            星期五 --绿色
            星期六 --绿色
            星期天 --绿色
   <!--时间格式  -->
   1:2017-5-8
   2:2017-5-8 10:56:56
   3:10:56:56
   <!-- null -->


   <!-- 宏定义 -->
   1:
        8 
    2:
            8
这是8

</body>
</html>

 

这是一些FreeMarker的基础知识,希望会有用

版权声明:本文为博主原创文章,未经博主允许不得转载。

推荐阅读