Spring-boot集成freemarker入门|实践

Spring-boot集成freemarker入门|实践

介绍

官方介绍 https://freemarker.apache.org/

百度百科:https://baike.baidu.com/item/freemarker/9489366?fr=aladdin

关于介绍本文就不重复叙述了

下面直接开始实践!

Freemarker + Springboot Maven配置基础工程

创建一个maven项目

spring-boot项目中添加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring‐boot‐starter‐freemarker</artifactId>
        </dependency>
    </dependencies>

在resource目录下添加配置文件

server:
  port: 8088 # 服务端口
spring:
  application:
    name: test-freemarker
  freemarker:
    cache: false #关闭模板缓存,方便测试
    settings:
        template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试

创建数据模型类

package com.dsdj.test.freemarker.model;

import lombok.Data;
import lombok.ToString;

import java.util.Date;
import java.util.List;

/**
 * model
 *
 * @author dsdj
 * @version 1.0
 * @className Student
 * @date 2019/2/12 9:09
 **/
@Data
@ToString
public class Student {
    private String name;//姓名
    private int age;//年龄
    private Date birthday;//生日
    private Float money;//钱包
    private List<Student> friends;//朋友列表
    private Student bestFriend;//最好的朋友
}

这里使用了lombok需要引入下面的依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.16</version>
</dependency>

创建模板

在 src/main/resources下创建templates,此目录为freemarker的默认模板存放目录。

在templates下创建模板文件demo.ftl.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf‐8">
    <title>Hello World!</title>
</head>
<body>
Hello ${name}!
</body>
</html>

模板中的${name}最终会被freemarker替换成具体的数据。

创建controller

创建Controller类,向Map中添加name,最后返回模板文件。

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建启动类

package com.dsdj.test.freemarker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * spring boot 启动类
 *
 * @author dsdj
 * @version 1.0
 * @className FreemarkerTestApplication
 * @date 2019/2/12 9:41
 **/
@SpringBootApplication
public class FreemarkerTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(FreemarkerTestApplication.class,args);
    }
}

启动测试

1549936254247.png

FreeMarker基础

关于freemarket的知识点,主要是掌握一起下知识

  • 总体结构

  • 指令(几个核心指令)

  • 表达式

  • 插值

读者可以参考下面的教程

http://freemarker.foofun.cn/dgui_template_overallstructure.html

这个教程是翻译自官方的文档。可以快速浏览一遍,不懂再去查阅。

在掌握了基础的语法之后,下面进行静态化实践。

freemarker静态化实践

使用模板文件静态化

创建测试类

package com.dsdj.test.freemarkert;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

/**
 * TODO
 *
 * @author dsdj
 * @version 1.0
 * @className TestFreemarker
 * @date 2019/2/12 10:30
 **/

public class TestFreemarker {
    @Test
    public void testGenerateHtml() throws IOException, TemplateException, URISyntaxException {
        // 创建配置类
        Configuration configuration = new Configuration(Configuration.getVersion());
        // 设置模板路径 toURI()防止路径出现空格
        String classpath = this.getClass().getResource("/").toURI().getPath();
        configuration.setDirectoryForTemplateLoading(new File(classpath+"/templates/"));
        // 设置字符集
        configuration.setDefaultEncoding("utf-8");
        // 加载模板
        Template template = configuration.getTemplate("demo1.ftl");
        // 数据模型
        Map<String,Object> map = new HashMap<>();
        map.put("name", "静态化测试");
        // 静态化
        String content = FreeMarkerTemplateUtils.processTemplateIntoString(template,map);
        // 打印静态化内容
        System.out.println(content);
        InputStream inputStream = IOUtils.toInputStream(content);
        // 输出文件
        FileOutputStream fileOutputStream = new FileOutputStream(new File("demo1.html"));
        int copy = IOUtils.copy(inputStream, fileOutputStream);

    }
}

测试结果

1549951894520.png

使用模板字符串静态化

测试方法

@Test
public void testGenerateHtmlByString() throws IOException, TemplateException {
    // 创建配置类
    Configuration configuration = new Configuration(Configuration.getVersion());
    // 测试模板内容
    String templateString="" +
            "<html>\n" +
            " <head></head>\n" +
            " <body>\n" +
            " 名称:${name}\n" +
            " </body>\n" +
            "</html>";
    // 模板加载器
    StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
    stringTemplateLoader.putTemplate("template",templateString);
    configuration.setTemplateLoader(stringTemplateLoader);
    // 得到模板
    Template template = configuration.getTemplate("template","utf-8");
    // 数据模型
    Map<String,Object> map = new HashMap<>();
    map.put("name","使用模板字符串静态化");
    // 静态化
    String content = FreeMarkerTemplateUtils.processTemplateIntoString(template,map);
    // 打印静态化内容
    System.out.println(content);
    InputStream inputStream = IOUtils.toInputStream(content);
    // 输出文件
    FileOutputStream fileOutputStream = new FileOutputStream(new File("demo1.html"));
    int copy = IOUtils.copy(inputStream, fileOutputStream);
}
1549952513189.png

以上就是freemarker的基本使用,但看到这里我们肯定有很多疑问。下面进行总结

总结

为什么可以直接直接跳转?

模板静态化如何在场景下使用?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,208评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,502评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,496评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,176评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,185评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,630评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,992评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,973评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,510评论 1 325
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,546评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,659评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,990评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,421评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,569评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,238评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,732评论 2 366

推荐阅读更多精彩内容