Spring Boot 整合 Freemarker,50 多行配置是怎麼省略掉的?
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 依賴,如下圖:
<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 的自動化配置:
@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<String, String> 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<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/
配置檔案按照順序依次解釋如下:
- 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 乾貨!
相關推薦
Spring Boot 整合 Freemarker,50 多行配置是怎麼省略掉的?
Spring Boot2 系列教程接近完工,最近進入修修補補階段。Freemarker 整合貌似還沒和大家聊過,因此今天把這個補充上。 已經完工的 Spring Boot2 教程,大家可以參考這裡: 乾貨|最新版 Spring Boot2.1.5 教程+案例合集 Freemarker 簡介 這是一個相當
Spring-boot整合Quartz,3、動態配置定時任務
通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組
Spring Boot 整合 Elasticsearch,實現 function score query 權重分查詢
search 小寫 業務 jpg 啟動會 last cti cal agen 摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝! 『 預見未來最好的方式就是親手創造未來 – 《史蒂夫·喬布斯
Spring-Boot整合freemarker引入靜態資源css、js等(轉)
mark pan 創建 line path main 實現 content -m 一、概述springboot 默認靜態資源訪問的路徑為:/static 或 /public 或 /resources 或 /META-INF/resources 這樣的地址都必須定義在src/
Spring Boot 整合Freemarker
SpringBoot的靜態資原始檔預設是存放在static檔案下,動態頁面模板存放在templates目錄下。 下面演示怎麼整合Freemarker 1.pom新增依賴 <!-- freemarker --> <dependency>
spring boot整合swagger,自定義註解,攔截器,xss過濾,非同步呼叫,定時任務案例
本文介紹spring boot整合swagger,自定義註解,攔截器,xss過濾,非同步呼叫,定時任務案例 整合swagger--對於做前後端分離的專案,後端只需要提供介面訪問,swagger提供了介面呼叫測試和各種註釋的視覺化web介面。配置swagger的掃描包路徑,api資訊等,見配置類Swagger
Spring-Boot整合freemarker引入靜態資源css、js等
一、概述 springboot 預設靜態資源訪問的路徑為:/static 或 /public 或 /resources 或 /META-INF/resources 這樣的地址都必須定義在src/main/resources目錄檔案中,這樣可以達到在專案啟動時候可以自動載入為專案靜態地址目錄到cl
spring boot整合dubbo,Spring boot +Dubbo,簡易的配置方式
剛做完一個基於motan的專案不久,便去看看dubbo的新特性了,dubbo自上年9月恢復更新到現在大概半年多,發現已經有和spring boot整合的配置了。個人喜歡的配置方式優先順序一般都是資原始
Spring Boot 整合 FreeMarker 詳解案例
一、Springboot 那些事 SpringBoot 很方便的整合 FreeMarker ,DAO 資料庫操作層依舊用的是 Mybatis,本文將會一步一步到來如何整合 FreeMarker 以及配置的詳解 二、執行 springboot-freemarker 工程 1.資
Spring Boot 整合 Mybatis 實現 Druid 多資料來源詳解
“清醒時做事,糊塗時跑步,大怒時睡覺,獨處時思考” 本文提綱 一、多資料來源的應用場景 二、執行 springboot-mybatis-mutil-datasource 工程案例 三、springboot-mybatis-mutil-datasource 工程程式碼配置詳解 一、多資料來
Spring Boot整合swagger2,搭建Restful API線上文件
Swagger,中文“拽”的意思,它是一個強大的線上API文件的框架,目前它的版本是2.x,所以稱為“swagger2”。swagger2提供了線上文件的查閱和測試功能。利用Swagger2很容易構建RESTf
【spring boot】【elasticsearch】spring boot整合elasticsearch,啟動報錯Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], reje
spring boot整合elasticsearch, 啟動報錯: Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8] at
Spring Boot整合shiro,出現UnavailableSecurityManagerException 異常
問題描述:由於在java過濾器中通過User token = (User) SecurityUtils.getSubject().getPrincipal();獲取當前的登入使用者的資訊,報UnavailableSecurityManagerException這個異常。spr
Spring Boot 整合mybatis 如何使用多資料來源
前言 本篇教程偏向實戰,程式猿直接copy程式碼加入到自己的專案中做簡單的修修改改便可使用,而對於springboot以及mybatis不在此進行展開介紹,如有讀者希望瞭解可以給我留言,並持續關注,我後續會慢慢更新。(黑色區域程式碼部分,安卓手機可手動向左滑動,來
spring boot整合UEditor,不改原始碼,真實有效
UEditor以前在php專案中使用過,是一款非常強大的富文字編輯器,內部實現了各種上傳功能,我們甚至不用寫任何程式碼,只需要在所需的專案中正確引入ueditor即可。最近在學習java spring boot框架,專案中也選擇這款編輯器。但是配置卻出現了很多問題,是我沒有想到的。因為
Spring Boot整合redis,key自定義生成
redis key生成策略程式碼: import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; im
spring boot 整合 redis,使用@Cacheable,@CacheEvict,@CachePut,jedisPool操作redis資料庫
好久沒寫文章了,最近換了個公司,入職差不多一個半月了,接觸了不少沒玩過的新東西,這裡放個 spring boot 整合 redis的demo吧。 先看一下demo目錄: 如何建立spring boot專案我就不說了很簡單,不會百度一大把。 先看一下p
Spring Boot 整合 Swagger,生成介面文件就這麼簡單!
開發十年,就只剩下這套架構體系了! >>>
Spring Boot 整合 Shiro ,兩種方式全總結!
在 Spring Boot 中做許可權管理,一般來說,主流的方案是 Spring Security ,但是,僅僅從技術角度來說,也可以使用 Shiro。 今天鬆哥就來和大家聊聊 Spring Boot 整合 Shiro 的話題! 一般來說,Spring Security 和 Shiro 的比較如下: Sp
Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天來聊聊 Spring Boot 整合 Freemarker。 Freemarker 簡介 這是一個相當老牌的開源的免費的模版引擎。通過 Freemarker 模版,我們可以將資料渲染成 HTML 網頁、電子郵件、配置檔案以及原始碼等。Freemarker 不是面向終端使用者的,而是一個 Java 類庫,我