FREEMARKER学习笔记

一.背景概念

Freemarker之前一直零零散散的接触过一些,都没有很好的去总结过,这里做个学习笔记。Freemarker是一个模板引擎,可以看成和JSP扮演差不多的角色。在Struts2中有大量的应用,基于模板生成文本输出。本身使用纯Java编写,优点很多,缺点是分布式环境中的性能不怎么样。经常被用来设计生成HTML Web页面,但是并不限于此,在普通的Java项目里面也可以应用,比如实现一个Java代码生成器。和JSP不一样的是,Freemarker不依赖于容器,也就是说,他并不知道有HTTP,servlet之类的,只要有基本的Java运行环境即可。

二.用法

2.1 HelloWorld

先来个HelloWorld程序简单感受下用法,当然在此之前有些概念先说一下。Freemarker的data根节点是一个map,下面可以有很多的(Key,Value).继续往下层还可以套很多的容器等子节点,总体是一个树状结构。另外,虽然Freemarker也具备一定的编程能力,但常用的模式还是,Java程序提供数据,freemarker负责模板。
首先创建一个普通Java程序,导入Freemarker的jar包,项目目录下新建templates目录,其下新建hello.ftl模板文件,写入以下内容:

hello,${user}!

然后新建Java类,开始HelloWorld效果测试,

    package com.zqx.test;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import java.io.File;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.HashMap;
    import java.util.Map;

    public class TestFreemarker {
    public static void main(String[] args) throws Exception{
    //创建Freemarker配置实例
    Configuration configuration = new Configuration();
    configuration.setDirectoryForTemplateLoading(new File("templates"));

    //创建数据模型
    Map root = new HashMap();
    root.put("user","zqx");

    //加载模板文件
    Template template = configuration.getTemplate("hello.ftl");

    //显示生成的数据
    Writer out = new OutputStreamWriter(System.out);
    template.process(root,out);
    out.flush();
    out.close();

    }

    }

结果如下:
1226198-20181028195730726-1935975528.png

2.2 常用指令

1.if指令
模板文件hello.ftl里面加入以下内容

    ------------if指令测试-----------------
    <#if user=="zqx" >
        身份验证通过
    <#else>
        身份验证失败
    </#if>
    ************
    <#if random lt 60>
      分数:${random},不及格
    <#elseif random lte 80>
      分数:${random},良好
    <#else >
      分数:${random},优秀
    </#if>

Java类TestFreemarker.java加入这句:
root.put("random",new Random().nextInt(100));
输出结果:
1226198-20181028195858670-918239575.png

这里可以顺路提一下:
字符串类型可以使用单引号或双引号。里面可以使用转移字符"",如果存在大量的特殊字符,可以在引号前面直接加上一个r,则所有字符将直接输出。
数值类型可以直接输入,不需要引号,不支持科学记数法。

2.list指令
模板文件hello.ftl里面加入以下内容

    ------------list指令测试-----------------
    <#list lst as girl>
    <b>姓名:${girl.name},年龄:${girl.age}</b></br>
    </#list>
    新建Girl类,并在Java类TestFreemarker.java加入这段:
    List list = new ArrayList();
    list.add(new Girl("小丽",18,"A"));
    list.add(new Girl("小美",13,"B"));
    list.add(new Girl("小红",22,"C"));
    root.put("lst",list);

测试结果:
1226198-20181028195927768-800955732.png

3.include指令
该指令可以引入其他文件,并不仅限于模板文件。也可以是其他类型的文本文件。
templates下新建include.ftl文件:

    hello,${user},我是被包含的文件~

在hello.ftl中引用:

    ------------include指令测试-----------------
    <#include "include.ftl" />

结果:
1226198-20181028200258285-148236316.png

4.marco自定义指令
类似于函数,过程,方法等概念。
在hello.ftl继续加入以下内容:

    ------------marco指令测试-----------------

    <#macro m1 > <#-- 定义不带参数的宏指令 -->
    <b>aaaaaaaaaaaa </b>
    <b>bbbbbbbbbbbb </b>
    </#macro>
    第一次调用:
    <@m1></@m1>
    第二次调用:
    <@m1/>

    <#macro m2 a b c > <#-- 定义带参数的宏指令,自动类型转换 -->
    ${a}---${b}---${c}
    </#macro>

    调用带参数的宏指令:
    <@m2 "a" "bb" "ccc"/>

结果:
1226198-20181028200329828-778831187.png

5.nested指令
在hello.ftl中加入:

    ------------nested指令测试-----------------
    <#macro border width>
    <table border="4" width="${width}px">
    <tr>
    <td>
    <#nested />
    </td>
    </tr>
    </table>
    </#macro>

    测试nested指令:
    <@border 100>
    单元格内容
    </@border>

结果:
1226198-20181028200556531-387752601.png

6.命名空间
类似于Java里的package,主要为了防止命名冲突
templates下新建import.ftl文件:

    <#macro copyright date>
        <p>Copyright (C) ${date} 汉得信息</p>
    </#macro>
    <#assign mail = "2443934916@qq.com" />

在hello.ftl里加入

    ------------import指令测试-----------------
    <#import "import.ftl" as bb />
    <@bb.copyright date="1998-2018" />
    ${bb.mail}

    <#assign mail="jxlpzqx@163.com" />
    ${mail}
    <#assign mail="qingxin.zhu@hand-china.com" in bb />
    ${bb.mail}

命名空间命名规则:
一个重要规则是ftl模板文件的路径不应该包含大写字母,为了分割单词应该使用下划线。
另外,结合前面的自定义marco宏指令说一下,freemarker自带的指令一般都以#开头,如<#if></#if>. 自定义指令一般一@开头,其他框架中定义的指令也看做自定义指令,但一般会多一个命名空间,Struts2的默认命名空间我们指定为s:

    <#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> <#--这一句是为了让Freemarker识别struts2的标签 -->

使用就可以这样使用了:

    <@s.form></@s.form>

结果:

1226198-20181028200753479-360574081.png

7.date类型处理
在hello.ftl里加入

    ------------date类型测试-----------------
    ${date?string("yyyy-MM-dd HH:mm:ss")}

在在Java类TestFreemarker.java加入

    root.put("date",new Date());

结果:
1226198-20181028200834290-541447735.png

8.空值处理
在hello.ftl里加入

    ------------空值处理测试-----------------
    <#-- ${nullval} 没有定义这个变量会报异常 -->
    ${nullval!} <#-- 如果没有定义,默认为空字符串 -->
    ${nullval!"aaa"} <#-- 如果没有定义,使用给定默认值aaa -->
    <#-- ??返回布尔值,可以判断变量是否存在 -->
    <#if user??><h1>Welcome ${user}!</h1></#if>

结果:
1226198-20181028200921877-527522314.png

另外,注意一下,这里我们为了测试方便,out流都指向了控制台输出。同理,我们把流指向文件,response到浏览器,甚至于通过scoket指向远程的某个地方都是没问题的。

2.3 在web项目中使用Freemarker

可以直接参考freemarker的examples参考项目webapp1,这里直接粘一些主要代码,方便自己以后查找
Web.xml

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
      <display-name>FreeMarker Example Web Application 1</display-name>
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>example.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
          <welcome-file>help.html</welcome-file>
      </welcome-file-list>
    </web-app>

Servlet中调用:

    package example;

    import java.util.*;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import freemarker.template.*;

    /**
     * This Servlet does not do anything useful, just prints "Hello World!". The
     * intent is to help you to get started if you want to build your own Controller
     * servlet that uses FreeMarker for the View. For more advanced example, see the
     * 2nd Web application example.
     */
    public class HelloServlet extends HttpServlet {
        private Configuration cfg; 
        
        public void init() {
            // Initialize the FreeMarker configuration;
            // - Create a configuration instance
            cfg = new Configuration();
            // - Templates are stoted in the WEB-INF/templates directory of the Web app.
            cfg.setServletContextForTemplateLoading(
                    getServletContext(), "WEB-INF/templates");
            // In a real-world application various other settings should be explicitly
            // set here, but for the sake of brevity we leave it out now. See the
            // "webapp2" example for them.
        }
        
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            
            // Build the data-model
            Map root = new HashMap();
            root.put("message", "Hello World!");
            
            // Get the templat object
            Template t = cfg.getTemplate("test.ftl");
            
            // Prepare the HTTP response:
            // - Use the charset of template for the output
            // - Use text/html MIME-type
            resp.setContentType("text/html; charset=" + t.getEncoding());
            Writer out = resp.getWriter();
            
            // Merge the data-model and the template
            try {
                t.process(root, out);
            } catch (TemplateException e) {
                throw new ServletException(
                        "Error while processing FreeMarker template", e);
            }
        }
    }

三. 其他

到这里,Freemarker就算是入门了。至于其他的更具体,更详细的用法,包括集合,map的各种用法啊,也不可能全记,用到了再去查就是了。
主要参考一个忘了在哪里找到的视频

转载于:https://www.cnblogs.com/zhuqingxin/p/9866802.html

Freemarker(3):指令:assign指令、include指令、if指令、list指令 指令要写到模板文件(.ftl)中 assign指令 assign指令用于在页面上定义一个变量 (1)定义简单类型 <#assign linkman="周先生"> 联系人:${linkman} (2)定义对象类型 <#assign info={"mobile":"13812345678",'address':'北京市昌平区'} > 电话:${info.mobile} 地址:${info.address} 内容会自动覆盖 include指令 nclude指令用于模板文件的嵌套 阅读详情

相关推荐

Freemarker基础教程(一)

FreeMarker是一款模板引擎即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarkerTemplateLanguage(FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显示已经准备好的数据。常用的java模板引擎还有哪些。.........

云恒要逆袭的博客 5509

入门freemarker include指令

include指令和jsp中的include指令意思是差不多的,include可以在模版中插入其他的静态文件,或者是freemarker模版,这里通常引入的都是项目的公共部分,比如说网站的头部,以及版权信息,在下面的例子中使用的是引入模版,至于引入静态内容那就的自己试了,太简单了.这这几篇中例子很简单,内容也很少,因为写的太多自己都不想看.所以用几个简单的示例先了解freemarker的最常用的一

YHC 3125

Freemarker快速入门(SpringBoot版)

Freemarker是什么?Freemarker是一个强大的 Java模板引擎,它允许开发人员将展示层与应用逻辑分离。通过提供一种灵活高效的方式,在运行时生成动态内容。Freemarker模板使用类似HTML的语法,但包含可以在运行时填充数据的占位符和控制结构。这使得创建动态网页、电子邮件和其他文本文档非常简单。Freemarker支持条件语句、循环、宏等各种功能,并且可以与不同的数据模型和框架集成。它在Java Web开发中被广泛应用于生成HTML视图、电子邮件模板和其他文本输出。个人理解。

热爱编程、热爱生活、热爱探索 4776

Spring Boot + Freemarker 中的弯弯绕!

昨天说手把手教大家整一个代码自动生成工具,用到了 Freemarker,结果有不少小伙伴表示对 Freemarker 不熟悉,这不,松哥赶紧整一个 Spring Boot+Freemarker 的教程出来,和大家分享下 Freemarker 中的常见操作。1. Freemarker 简介2. 整合 Spring Boot2.1 创建工程2.2 创建类2.3 其他配置3. Freemarker 使用...

十指波课堂的博客 523

FreeMarker中文学习笔记

FreeMarker中文学习笔记

Mike 164

Freemarker--学习笔记

Freemarker学习笔记。一、Freemarker 概述FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。是一个Java类库。FreeMarker 被设计用来生成 HTMLWeb 页面,特别是基于 MVC 模式的应用程序,将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,而是将视图交给 FreeMarker 来输出。

weixin_45694171的博客 2102

FreeMarker学习笔记

FreeMarker ⼀、概述 FreeMarker是⼀款模板引擎:即⼀种基于模板和要改变的数据,并⽤来⽣成输出⽂本(HTML⽹⻚,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。它不是⾯向最终⽤户的,⽽是⼀个Java类库,是⼀款程序员可以嵌⼊他们所开发产品的组件。 模板编写为 FTL (FreeMarker Template Language)。 设计思想:模板 + 数据 —&amp;amp;gt; ⽂本输出 官网...

IT小浣熊的博客 620

FreeMarker学习笔记

FreeMarker是一款模板引擎:一种基于模板和要改变的数据,并用来生成输出文件(HTML网页,电子邮件,配置文件,源代码等)的通用工具,是一个Java类库FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序,将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,而是将视图交给 FreeMarker 来输出。

weixin_44823875的博客 1636

SpringBoot学习笔记(6)——SpringBoot整合Freemarker

SpringBoot学习笔记(6)——SpringBoot整合Freemarker 1. 创建项目 2. 修改pom,添加坐标 <dependencies> <!-- springBoot的启动器 --> <dependency> <groupId>org.springframework.boot</group...

njsunll的博客 290

Freemarker notes | Freemarker学习笔记

Freemarker 应用场景 对比 JSP Freemarker Velocity 在java领域,表现层技术主要有三种:jsp、freemarker、velocity。 JSP jsp是大家最熟悉的技术 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广,丰富的第三方jsp标签库 5...

weixin_30326515的博客 275

freemarker 学习笔记

此章节参考:http://freemarker.foofun.cn/dgui_quickstart_template.html插值(interpolation):${…},输出时用真实值替换插值表达式FTL标签(指令):类似于html标签,这些标签以#开头,自定义的FTL标签使用@来代替#注释:和html一样在模板中可以使用宏作为自定义指令模板内容为输出为带有参数的自定义指令实例模板内容为变量可以设置默认值。

小狗是码农的博客 284

freemarker模板学习笔记

freemarker学习笔记

810cheng 1635

freemarker学习笔记

1、什么是FreeMarker FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言。 2、Hello Freemarker 1、导入jar包 <dependencies> <!--导

ilove_story的博客 504

freeMarker学习笔记

FreeMarker 概述 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 HTML静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以使用FreeMarke...

zzzliuke的博客 264
上一篇: WEBSERVICE发布与调用
下一篇: REDIS基础学习笔记
decikang4470
博客等级 码龄10年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值