1. 程式人生 > >103. Spring Boot Freemarker特別篇之contextPath【從零開始學Spring Boot】

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 2017115

 */

@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}