Spring Boot2 系列教程接近完工,最近進入修修補補階段。Freemarker 整合貌似還沒和你們聊過,所以今天把這個補充上。html
已經完工的 Spring Boot2 教程,你們能夠參考這裏:java
這是一個至關老牌的開源的免費的模版引擎。經過 Freemarker 模版,咱們能夠將數據渲染成 HTML 網頁、電子郵件、配置文件以及源代碼等。Freemarker 不是面向最終用戶的,而是一個 Java 類庫,咱們能夠將之做爲一個普通的組件嵌入到咱們的產品中。git
來看一張來自 Freemarker 官網的圖片:github
能夠看到,Freemarker 能夠將模版和數據渲染成 HTML 。web
Freemarker 模版後綴爲 .ftl
(FreeMarker Template Language)。FTL 是一種簡單的、專用的語言,它不是像 Java 那樣成熟的編程語言。在模板中,你能夠專一於如何展示數據, 而在模板以外能夠專一於要展現什麼數據。spring
好了,這是一個簡單的介紹,接下來咱們來看看 Freemarker 和 Spring Boot 的一個整合操做。編程
在 SSM 中整合 Freemarker ,全部的配置文件加起來,前先後後大約在 50 行左右,Spring Boot 中要幾行配置呢? 0 行!後端
首先建立一個 Spring Boot 工程,引入 Freemarker 依賴,以下圖:緩存
<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>
工程建立完成後,在 org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
類中,能夠看到關於 Freemarker 的自動化配置:session
@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; } }
咱們來簡單看下這段源碼:
另外還有一點,在這個類的構造方法中,注入了 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<String, String> settings = new HashMap<>(); }
FreeMarkerProperties 中則配置了 Freemarker 的基本信息,例如模板位置在 classpath:/templates/
,再例如模板後綴爲 .ftl
,那麼這些配置咱們之後均可以在 application.properties 中進行修改。
若是咱們在 SSM 的 XML 文件中本身配置 Freemarker ,也不過就是配置這些東西。如今,這些配置由 FreeMarkerServletWebConfiguration 幫咱們完成了。
首先咱們來建立一個 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<User> 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 中渲染數據:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <tr> <td>用戶編號</td> <td>用戶名稱</td> <td>用戶地址</td> </tr> <#list users as user> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.address}</td> </tr> </#list> </table> </body> </html>
運行效果以下:
若是咱們要修改模版文件位置等,能夠在 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/
配置文件按照順序依次解釋以下:
好了,整合完成以後,Freemarker 的更多用法,就和在 SSM 中使用 Freemarker 同樣了,這裏我就再也不贅述。
本文和你們簡單聊一聊 Spring Boot 整合 Freemarker,算是對 Spring Boot2 教程的一個補充(後面還會有一些補充),有問題歡迎留言討論。
本項目案例,我已經上傳到 GitHub 上,歡迎你們 star:https://github.com/lenve/javaboy-code-samples
關注公衆號【江南一點雨】,專一於 Spring Boot+微服務以及先後端分離等全棧技術,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!