這裏介紹下在類似 Spring+FreeMarker 的架構中如何在FreeMarker中訪問Java中的靜態方法以及靜態變量。
一、首先爲了方便以及可複用我們創建一個工具類
/**
* FreeMarker Utils.
*
* @author chenxinyu
*/
public abstract class FreeMarkerUtils {
/**
* init for static classes and fields.
*
* @param model model
*/
public static void initStatics(final Model model) {
// you can also create the Version like: new Version("2.3.27");
BeansWrapper wrapper = new BeansWrapper(new Version(2, 3, 27));
TemplateModel statics = wrapper.getStaticModels();
model.addAttribute("statics", statics);
}
}
這裏稍作解釋:
`wrapper.getStaticModels()` 會返回一個 `TemplateHashModel` ,它會利用反射公開所有的靜態方法和靜態成員變量,包括 final 和 非final 的。
之後我們將這個 `HashModel` 添加至 Spring 的 Model 參數裏面。
二、之後在我們的 `Controller` 裏面調用如上代碼即可:
FreeMarkerUtils.initStatics(model);
三、現在我們就可以在 FreeMarker 的 `.ftl` 文件中調用靜態方法和靜態變量了:
1.訪問靜態變量:
${statics["com.springboot.constants.TestConstants"].NAME}
引號中間填入靜態變量所在的類路徑,中括號後面使用 . 來調用相應變量就行。
2.訪問靜態方法:
I.首先我們使用 <#assign> 來定義下所要調用的類:
<#assign DateTimeUtils=statics['com.springboot.util.DateTimeUtils']>
II.之後就可以盡情調用了:
${DateTimeUtils.formatDateTime(datetime)}
雖然網上搜羅出過不少其他解決方案的版本,但自己在沿用的過程中出現過些許不同的坑,於是重新整理了這套可行、可用,且暫未過期的方案,以前所使用的 `new BeansWrapper()` 以及 `BeansWrapper().getDefaultInstance()` 現在均已過期(被標記爲 @
Deprecated),新的 BeansWrapper 需要利用 BeansWrapperBuilder 來創建。