资讯专栏INFORMATION COLUMN

Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?

xiaotianyi / 1538人阅读

摘要:系列教程接近完工,最近进入修修补补阶段。但是这里的自动化配置只做了模板位置检查,其他配置则是在导入的配置中完成的。表示当前配置在存在和时才会生效。是的一些基本配置,例如等则是视图解析器的基本配置,包含了等属性。现在,这些配置由帮我们完成了。

Spring Boot2 系列教程接近完工,最近进入修修补补阶段。Freemarker 整合貌似还没和大家聊过,因此今天把这个补充上。

已经完工的 Spring Boot2 教程,大家可以参考这里:

干货|最新版 Spring Boot2.1.5 教程+案例合集

Freemarker 简介

这是一个相当老牌的开源的免费的模版引擎。通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通的组件嵌入到我们的产品中。

来看一张来自 Freemarker 官网的图片:

可以看到,Freemarker 可以将模版和数据渲染成 HTML 。

Freemarker 模版后缀为 .ftl(FreeMarker Template Language)。FTL 是一种简单的、专用的语言,它不是像 Java 那样成熟的编程语言。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

好了,这是一个简单的介绍,接下来我们来看看 Freemarker 和 Spring Boot 的一个整合操作。

实践

在 SSM 中整合 Freemarker ,所有的配置文件加起来,前前后后大约在 50 行左右,Spring Boot 中要几行配置呢? 0 行!

1.创建工程

首先创建一个 Spring Boot 工程,引入 Freemarker 依赖,如下图:


    org.springframework.boot
    spring-boot-starter-freemarker


    org.springframework.boot
    spring-boot-starter-web

工程创建完成后,在 org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration 类中,可以看到关于 Freemarker 的自动化配置:

@Configuration
@ConditionalOnClass({ freemarker.template.Configuration.class, FreeMarkerConfigurationFactory.class })
@EnableConfigurationProperties(FreeMarkerProperties.class)
@Import({ FreeMarkerServletWebConfiguration.class, FreeMarkerReactiveWebConfiguration.class,
                FreeMarkerNonWebConfiguration.class })
public class FreeMarkerAutoConfiguration {
}

从这里可以看出,当 classpath 下存在 freemarker.template.Configuration 以及 FreeMarkerConfigurationFactory 时,配置才会生效,也就是说当我们引入了 Freemarker 之后,配置就会生效。但是这里的自动化配置只做了模板位置检查,其他配置则是在导入的 FreeMarkerServletWebConfiguration 配置中完成的。那么我们再来看看 FreeMarkerServletWebConfiguration 类,部分源码如下:

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, FreeMarkerConfigurer.class })
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration {
        protected FreeMarkerServletWebConfiguration(FreeMarkerProperties properties) {
                super(properties);
        }
        @Bean
        @ConditionalOnMissingBean(FreeMarkerConfig.class)
        public FreeMarkerConfigurer freeMarkerConfigurer() {
                FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
                applyProperties(configurer);
                return configurer;
        }
        @Bean
        @ConditionalOnMissingBean(name = "freeMarkerViewResolver")
        @ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true)
        public FreeMarkerViewResolver freeMarkerViewResolver() {
                FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
                getProperties().applyToMvcViewResolver(resolver);
                return resolver;
        }
}

我们来简单看下这段源码:

@ConditionalOnWebApplication 表示当前配置在 web 环境下才会生效。

ConditionalOnClass 表示当前配置在存在 Servlet 和 FreeMarkerConfigurer 时才会生效。

@AutoConfigureAfter 表示当前自动化配置在 WebMvcAutoConfiguration 之后完成。

代码中,主要提供了 FreeMarkerConfigurer 和 FreeMarkerViewResolver。

FreeMarkerConfigurer 是 Freemarker 的一些基本配置,例如 templateLoaderPath、defaultEncoding 等

FreeMarkerViewResolver 则是视图解析器的基本配置,包含了viewClass、suffix、allowRequestOverride、allowSessionOverride 等属性。

另外还有一点,在这个类的构造方法中,注入了 FreeMarkerProperties:

@ConfigurationProperties(prefix = "spring.freemarker")
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
        public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
        public static final String DEFAULT_PREFIX = "";
        public static final String DEFAULT_SUFFIX = ".ftl";
        /**
         * Well-known FreeMarker keys which are passed to FreeMarker"s Configuration.
         */
        private Map settings = new HashMap<>();
}

FreeMarkerProperties 中则配置了 Freemarker 的基本信息,例如模板位置在 classpath:/templates/ ,再例如模板后缀为 .ftl,那么这些配置我们以后都可以在 application.properties 中进行修改。

如果我们在 SSM 的 XML 文件中自己配置 Freemarker ,也不过就是配置这些东西。现在,这些配置由 FreeMarkerServletWebConfiguration​ 帮我们完成了。

2.创建类

首先我们来创建一个 User 类,如下:

public class User {
    private Long id;
    private String username;
    private String address;
    //省略 getter/setter
}

再来创建 UserController

@Controller
public class UserController {
    @GetMapping("/index")
    public String index(Model model) {
        List users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId((long) i);
            user.setUsername("javaboy>>>>" + i);
            user.setAddress("www.javaboy.org>>>>" + i);
            users.add(user);
        }
        model.addAttribute("users", users);
        return "index";
    }
}

最后在 freemarker 中渲染数据:




    
    Title



    <#list users as user>
        
用户编号 用户名称 用户地址
${user.id} ${user.username} ${user.address}

运行效果如下:

其他配置

如果我们要修改模版文件位置等,可以在 application.properties 中进行配置:

spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/

配置文件按照顺序依次解释如下:

HttpServletRequest的属性是否可以覆盖controller中model的同名项

HttpSession的属性是否可以覆盖controller中model的同名项

是否开启缓存

模板文件编码

是否检查模板位置

Content-Type的值

是否将HttpServletRequest中的属性添加到Model中

是否将HttpSession中的属性添加到Model中

模板文件后缀

模板文件位置

好了,整合完成之后,Freemarker 的更多用法,就和在 SSM 中使用 Freemarker 一样了,这里我就不再赘述。

结语

本文和大家简单聊一聊 Spring Boot 整合 Freemarker,算是对 Spring Boot2 教程的一个补充(后面还会有一些补充),有问题欢迎留言讨论。

本项目案例,我已经上传到 GitHub 上,欢迎大家 star:https://github.com/lenve/javaboy-code-samples

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75178.html

相关文章

  • Spring Boot - 整合Jsp/FreeMarker

    摘要:大家自己了解一下的使用方法,我这里就不进行详细的讲述了。启动方式两种方式都可以主函数启动或者验证访问页面,验证是否输出了当前时间。为了提高大家学习效果,录制了同步的视频课程,还望大家支持视频课程 Spring Boot - 初识 Hello World 索引 Spring Boot - 初识 Hello World Spring Boot - Servlet、过滤器、监听器、拦截器 ...

    AbnerMing 评论0 收藏0
  • Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)

    摘要:数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响时才成为信息。主要目标是为开发提供天然的模板,并且能在里面准确的显示。目前是自然更加推荐。 这是泥瓦匠的第105篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...

    姘存按 评论0 收藏0
  • 慕课网_《SpringBoot开发常用技术整合》学习总结

    摘要:时间年月日星期四说明本文部分内容均来自慕课网。哈希表实现命令,将哈希表中的域的值设为实现命令,返回哈希表中给定域的值实现命令,删除哈希表中的一个或多个指定域,不存在的域将被忽略。实现命令,返回哈希表中,所有的域和值。 时间:2018年04月19日星期四说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com教学源码:https://github.com/zc...

    chengtao1633 评论0 收藏0
  • Spring Boot 2.x(五):整合Mybatis-Plus

    摘要:的作用可以看到,它给我们提供了一些核心的功能代码生成器和现成的接口以及可以结合的条件构造器使我们的代码变得足够优雅,分页的使用也是相当的方便,以及提供了不同的主键生成策略。 简介 Mybatis-Plus是在Mybatis的基础上,国人开发的一款持久层框架。 showImg(https://segmentfault.com/img/bVbvFk4?w=2022&h=862); 并且荣获...

    AaronYuan 评论0 收藏0
  • Spring Boot集成Freemarker和iText生成PDF文档

    摘要:格式文档导出,是信息系统中非常实用的一种功能,用于各种报表和文档的到处。示例中,使用生成要导出的格式文档,通过来实现文件下载。将转换成文档生成的代码比较简单,创建一个对象,然后会在指定的中输入生成的文件。作用相当于在中使用进行配置。 showImg(https://segmentfault.com/img/remote/1460000008547574); PDF格式文档导出,是信息系...

    liujs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<