页面静态化模板引擎-Freemaker

版权声明:lex https://blog.csdn.net/qq_36258498/article/details/85015856

今天简单介绍一下什么是模板引擎,以及简单的使用

1.什么是模板引擎

简单的来说,模板引擎就是一种基于模板和数据输出文本的一种工具

1.什么是freemaker

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

2.环境搭建&快速入门

这里采用springboot项目进行入门测试,首先需要创建springboot工程,并导入下面的相关依赖信息

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
    </dependencies>

编写application.yml配置

server:
  port: 8088 #服务端口

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

在resources目录下创建一个目录,名字是templates的文件夹,注意该文件夹的名字不能随便更改,freemaker会默认去classpath下的templates文件夹下寻找模板文件,在该文件夹下创建一个模板文件后缀为ftl

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

</html>

编写controller层代码实现模板的生成

package com.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

@Controller
public class TestController {

    @RequestMapping("/freemaker")
    public String test(Map<String,String> map){
        map.put("name","lex");

        return "test1";
    }
}

在页面调用该接口可在页面输出

Hello lex!

3.freemaker基础语法

3.1list指令

该指令会将我们在controller层设置的map中的数据进行遍历

为了方便测试,这里我们先定义一个测试的对象数据

package com.test;

import lombok.Data;

@Data
public class Person {
    private String name;
    private Integer age;
    
}

然后我们在controller层添加几条数据

package com.test;

        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;

        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;

@Controller
public class TestController {

    @RequestMapping("/freemaker")
    public String test(Map<String,Object> map){
        List<Person> l =new ArrayList<>();
        Person p1=new Person();
        p1.setName("lex");
        p1.setAge(20);

        Person p2=new Person();
        p2.setName("nana");
        p2.setAge(19);

        Person p3=new Person();
        p3.setName("huihui");
        p3.setAge(16);
        l.add(p1);
        l.add(p2);
        l.add(p3);
        map.put("l",l);

        return "test1";
    }
}

修改模板文件

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Hello World!</title>
</head>
<body>
<#--Hello ${name}!-->
<h1>使用list指令遍历信息</h1>
<table>
    <tr>
        <td>姓名</td>
        <td>年龄</td>
    </tr>
    <#list l as p >
        <tr>
            <td>${p.name}</td>
            <td>${p.age}</td>
        </tr>
    </#list>
</table>
</html>

在页面输出

使用list指令遍历信息
姓名 	年龄
lex 	20
nana 	19
huihui 	16

3.2遍历map

在数据的map集合中可能还会存在一些map集合,在这里我们使用一些相关的指令将map集合中的数据遍历出来

首先还是在controller中准备一些数据

package com.test;

        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;

        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;

@Controller
public class TestController {

    @RequestMapping("/freemaker")
    public String test(Map<String,Object> map){
        Map<String,Person> personMap =new HashMap<>();
        Person p1 =new Person();
        p1.setName("lex");
        p1.setAge(20);

        Person p2 =new Person();
        p2.setName("mm");
        p2.setAge(20);

        Person p3 =new Person();
        p3.setName("nn");
        p3.setAge(20);
        personMap.put("p1",p1);
        personMap.put("p2",p2);
        personMap.put("p3",p3);

        map.put("personMap",personMap);

        return "test1";
    }
}

准备模板文件

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Hello World!</title>
</head>
<body>
<#--Hello ${name}!-->
<h1>1.使用在[]中填写key值得方法遍历map</h1>
姓名:${personMap['p1'].name}<br>
年龄:${personMap['p1'].age}<br>
<h1>2.不使用[],直接使用点的形式</h1>
姓名:${personMap.p1.name}<br>
年龄:${personMap.p1.age}<br>
<h1>3.使用list对key进行遍历,再通过中括号取出</h1>
<#--注意,在这种方法下只能使用中括号的方式获取值,因为k是一个变量,无法直接通过点的方式传入-->
<#list personMap?keys as k>
姓名:${personMap[k].name}<br>
年龄:${personMap[k].age}<br>
</#list>
</html>

页面输出

1.使用在[]中填写key值得方法遍历map
姓名:lex
年龄:20
2.不使用[],直接使用点的形式
姓名:lex
年龄:20
3.使用list对key进行遍历,再通过中括号取出
姓名:lex
年龄:20
姓名:mm
年龄:20
姓名:nn
年龄:20

3.3 if指令

if指令写法

<#if ></#if>

可以在标签中写各种相应的逻辑判断,需要注意的是当有大于逻辑的时候 也就是需要些>号的时候需要用括号将整个判断包裹起来,以免引起标签解析时候的混淆例如

<#if (c>c+5) ></#if>

3.4 空值的处理

有些时候我们不确定map中有些数据是否存在,为了避免页面报错,我们需要对空值进行一下判断

<#if personMap??>
    .....
</#if>

两个问号代表判断改值是否为空,如果为空会返回false,就不会执行里面的内容

还可以使用缺省值的方法对空值进行处理

${(personMap['p1'].name)!''}<br>

可以使用该种方法将每一个属性都进行缺省值的处理,当括号中的值为空的时候会将该变量设为空字符串

展开阅读全文

没有更多推荐了,返回首页