下面是“springboot整合freemarker的踩坑及解决”的完整攻略。
一、前言
Spring Boot 是一款基于 Spring 框架的快速开发脚手架,可以非常快速地搭建一个 Web 项目架子。而 FreeMarker 是一款强大、灵活、安全的模板引擎,它与 Spring Boot 的整合,能够让 Web 开发更加高效。然而,整合过程中往往会遇到一些坑,下面就来一一介绍。
二、整合步骤
- 在 pom.xml 中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 配置 freemarker.properties
在 application.properties 中添加以下配置:
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.charset=UTF-8
spring.freemarker.suffix=.ftl
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
其中,spring.freemarker.template-loader-path
表示模板所在的路径,spring.freemarker.charset
表示模板文件的编码格式,spring.freemarker.suffix
表示模板文件的后缀名,spring.freemarker.cache
表示是否启用模板缓存,spring.freemarker.check-template-location
表示检查模板文件是否存在。需要注意的是,spring.freemarker.template-loader-path
的路径必须包含在 classpath 中。
- 创建一个 FreeMarkerController
在创建的 FreeMarkerController 中添加一个方法,如下:
@Controller
public class FreeMarkerController {
@GetMapping("/hello")
public String hello(Model model){
String message = "hello, freemarker!";
model.addAttribute("message", message);
return "hello";
}
}
注意,这个方法返回的是 hello
,而不是 hello.ftl
。这是因为在配置中已经指定了 spring.freemarker.suffix=.ftl
,
- 创建 hello.ftl
在 templates 目录下创建一个名为 hello.ftl
的模板文件,如下:
<!doctype html>
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
其中,${message}
就是在 hello
方法中添加到模型中的数据。
至此,整合工作就完成了。
三、踩坑解决
在整合 Spring Boot 和 FreeMarker 的过程中,我们可能会遇到一些问题,下面就来介绍几个可能遇到的问题及解决办法。
- 中文乱码问题
如果在 freemarker.properties 配置文件中没有指定 spring.freemarker.charset
,则在模板中输出中文时,会出现乱码问题。需要将编码格式设置为 UTF-8,即在配置文件中添加以下配置:
spring.freemarker.charset=UTF-8
- 模板载入路径问题
由于 spring.freemarker.template-loader-path
的路径必须包含在 classpath 中,否则会抛出找不到模板的异常。所以需要确保这个路径的正确,可以在控制台打印路径,验证它是否正确,如下:
@Autowired
FreeMarkerConfiguration freeMarkerConfiguration;
@GetMapping("/test")
public String test(){
System.out.println(freeMarkerConfiguration.getTemplateLoaderPath());
return "hello";
}
在运行程序后,在访问 /test
的时候,查看控制台输出路径是否正确。
- 缓存问题
在开发阶段,我们往往需要关闭缓存,然后在生产环境中开启缓存来加速页面的加载。需要注意的是,虽然关闭缓存可以加快页面的加载速度,但也会增加 CPU 和内存的使用。在配置文件中可以指定 spring.freemarker.cache
来开启或关闭缓存,如下:
spring.freemarker.cache=true
四、示例说明
下面提供两个示例,分别是引入第三方模板和循环输出列表数据。
示例1:引入第三方模板
有时候,我们可能会需要在 FreeMarker 模板中引入第三方模板,其中的步骤如下:
- 在
freemarker.properties
文件中添加以下配置:
spring.freemarker.settings.template_update_delay=0
这是为了让 FreeMarker 模板引擎在修改的时候,可以及时更新。
- 在
application.yml
文件中增加以下配置:
spring.freemarker.settings.auto_import=demo.ftl as demo
其中,demo.ftl
是指定引入的模板参数,as demo
指的是引入后的模板的别名。
- 在指定路径下创建一个
demo.ftl
文件。
示例代码如下:
<#macro demo a b>
Hello ${a} ${b}!
</#macro>
其中,a
和 b
是参数,后面在模板中通过 ${demo("World", "FreeMarker")}
调用该文件。注意,在引入自定义标签库时,文件名必须与自定义标签名相同。
引入模板后,直接在我们的模板中调用 ${demo("World", "FreeMarker")}
即可。
示例2:循环输出列表数据
模板引擎的另一个功能是可以循环输出列表数据,示例代码如下:
在 FreeMarkerController
中添加以下方法:
@GetMapping("/list")
public String list(Model model){
List<String> userList = new ArrayList<>();
userList.add("zhangsan");
userList.add("lisi");
userList.add("wangwu");
model.addAttribute("userList", userList);
return "list";
}
然后在 templates
目录下创建一个 list.ftl
文件,如下:
<!doctype html>
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<ul>
<#list userList as username>
<li>${username}</li>
</#list>
</ul>
</body>
</html>
其中,<#list userList as username>
表示把 userList
集合循环赋值给变量 username
,然后可以在模板中通过 ${username}
访问该值。
五、总结
本文介绍了 Spring Boot 整合 FreeMarker 的完整攻略,也介绍了在整合过程中可能会遇到的问题及相应的解决办法。同时,还提供了两个实用的示例,其中一个是自定义标签的引用,另一个是循环输出列表数据。希望本文对阅读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合freemarker的踩坑及解决 - Python技术站