springboot_3.2_freemark_基础环境配置
一、前言
FreeMarker 是一款模板引擎:即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的标签语言。需要在服务器端组织数据,之后通过编写FTL模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据。
注:从freemarker 2.x 开始模板的默认后缀由 ftl 改为 ftlh(配置类FreeMarkerProperties.DEFAULT_SUFFIX)。
二、环境
- java 21
- springboot 3.2
三、相关资料
四、目标
- sprinboot 3.2 整合freemarker基础配置;
- 加入freemarker模板;
- 编写controller将绑定数据输出到模板中;
- 运行测试页面;
五、默认配置项
- jar包:spring-boot-autoconfigure-3.2.0.jar
- 对象:org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties
六、构建springboot 3.2项目
项目是通过idea脚手架创建,由于2.x不在维护,建项目时通过服务(https://start.spring.io)只能创建springboot3.x项目,如果想要创建低版本可以使用阿里的脚手架(start.aliyun.com)。springboot3.x只支持java 17 及以上版本。所以建项目前先配置好本地的jdk。
idea脚手架服务更改位置:file/New/New Project/Sping Initializr : Server URL start.string.io ,点击后面的齿轮标记修改!
6.1 pom.xml 内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.test</groupId>
<artifactId>test2312</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test2312</name>
<description>test2312</description>
<properties>
<java.version>21</java.version>
</properties>
<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>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
6.2 启动类
其中在@SpringBootApplication注解中屏蔽了DataSourceAutoConfiguration.class的加载,目的是避免出现“
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.”
错误提示。
因为我们目的只是验证freemarker,不需要数据库相关的依赖,所以不需要配置数据源相关配置。而springboot基础依赖中默认加载了MySQL、Oracle、Mybatis等和数据库相关的依赖包,结果我们的配置文件中却没有添加数据库相关的配置。
package com.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
6.3 添加ftlh模板
freemarker2.x开始默认的后缀由ftl改为ftlh了,使用ftl在freemarker3.x中是找不到的。
模板中对spring、list、map等常用的类型,做了绑定和遍历示例。加了个test目录是需要与后面的controller的地址一致。
模板位置:resources\templates\test\index.ftlh
<html>
<head>
<title>Welcome!</title>
</head>
</body>
<br>
<h1>Welcome ${user} !</h1>
<br>
<b>展示list中的数据:</b>
<p>
<ul>
<#list lst as item>
<li>${item}</li>
</#list>
</ul>
<ul>
</ul>
</p>
<p>
<b>map遍历:key值遍历</b>
<ul>
<#assign keys=map?keys/>
<#list keys as key>
<li>key=${key}; value=${map["${key}"]};</li>
</#list>
</ul>
<b>map遍历:直接遍历</b>
<ul>
<#list map?keys as key>
<li>key=${key}; value=${map["${key}"]};</li>
</#list>
</ul>
<b>map遍历:直接遍历值</b>
<ul>
<#list map?values as value>
<li>value=${value};</li>
</#list>
</ul>
</p>
</body>
</html>
6.4 controller内容
controller中有两个方法,分别是返回text内容 和 绑定ftlh模板内容。
package com.test.controller;
import lombok.extern.log4j.Log4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.View;
import java.util.Arrays;
import java.util.HashMap;
@Controller
@RequestMapping("/test")
public class TestController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping("/hello")
@ResponseBody
public String hello(){
logger.info("hello word~~~");
return "hello word!";
}
@GetMapping("/index.html")
public String index(Model model){
model.addAttribute("user","joy");
var lst = Arrays.asList("11","22","33");
var lst4empty = new HashMap<>();
var map = new HashMap<String,Object>(){
{put("k1",11);}
{put("k2",22);}
{put("k3",33);}
};
model.addAttribute("lst",lst);
model.addAttribute("lst4empty",lst4empty);
model.addAttribute("map",map);
logger.info("test index ~~~");
return "/test/index";
}
}
6.5 bootstrap.yml配置
使用这个配置可以方便做环境切换,启动项目时传入dev这个forfile参数可以读到dev环境配置。
spring:
profiles.active: ${profile:dev}
application:
name: test2312
http:
multipart:
max-file-size: 2MB
max-request-size: 2MB
---
spring.profiles: dev
spring:
freemarker:
templateLoaderPath: classpath:/templates/
preferFileSystemAccess: true #支持热加载,默认为true(生产时false)
七、总结
以上就是一个比较基础的整合过程,需要注意的是通过idea构建时依赖尽量选择少的依赖,否则容易出现各种错误。