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

  1. [干货|最新版 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;

}

}

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

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

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

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

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

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

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

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

@ConfigurationProperties(prefix = “spring.freemarker”)

public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {

public static final String DEFAULT_TEMPLATE_LO 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ADER_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<>();

你可能感兴趣的:(Java,经验分享,架构,java)