103. Spring Boot Freemarker特別篇之contextPath【從零開始學Spring Boot】
需求緣起:有人在群裡@我:請教群主大神一個問題,spring boot + freemarker 怎麼獲取contextPath 頭疼死我了,網上沒一個靠譜的 。我就看看之前部落格中的
【Spring Boot使用模板freemarker】好像確實沒有介紹到在.ftl檔案中如何獲取contextPath,這就是本文解決要解決的問題。
本章大綱:(1)問題的提出;
(2)spring中是如何定義requestContextAttribute的;
(3)Spring Boot應該如何定義呢?
(4)有更好的解決方案嘛?
(5)總結
接下來我們一起來看下本節的內容:
(1)問題的提出;
我們有時候需要在freemarker模板檔案.ftl中獲取contextPath,如果沒有配置一些引數的話,那麼是無法進行獲取的。
(2)spring中是如何定義requestContextAttribute的;
在spring 中是使用配置檔案的方法進行配置指定的,如下:
<property name="requestContextAttribute" value="request"/>
配置完之後,我們就可以在我們的x.ftl檔案中使用如下程式碼進行引入使用:
${request.contextPath}。
(3)Spring Boot應該如何定義呢?
在spring 中是使用配置檔案的方式,但是我們知道spring boot基本上零配置程式設計的(雖然也支援配置檔案的方式),那麼我們應該怎麼辦呢?我們可以之定義一個FreemarkerViewResolver進行指定requestContextPath屬性值,具體程式碼如下:
package com.kfit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
/**
*
* @author Angel --守護天使
* @version v.0.1
* @date 2017年1月15日
*/
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{
@Bean
public FreeMarkerViewResolver freeMarkerViewResolver() {
System.out.println("MvcConfig.freeMarkerViewResolver()");
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
resolver.setRequestContextAttribute("request");
return resolver;
}
}
新增以上的程式碼之後,就可以在x.ftl檔案中使用${request.contextPath}了。
(4)有更好的解決方案嘛?
以上方式雖然也能解決問題,但是總覺得繞了一個圈子,我們原本使用freemarker的時候,我們使用的是在配置檔案application.properties檔案進行使用的,現在又回到了程式碼的方式去引入了,那麼要思考下我們可不可以在application.properties進行直接指定呢,答案是可以的。我們只需要在application.properties中新增如下配置:
spring.freemarker.request-context-attribute=request
那麼就可以在ftl檔案中進行使用${request.contextPath}了。
(5)總結
本文說了這麼說,其實很簡單就兩個步驟:
1、在application.properties新增如下資訊:
spring.freemarker.request-context-attribute=request
2、在x.ftl檔案中進行使用:
${request.contextPath}
BTW:有時候我們為了程式碼的使用簡單,request-context-attribute也會設定為ctx,那麼使用的時候就是${ctx.contextPath}