FreeMarker調用Java靜態方法以及靜態變量的方法

這裏介紹下在類似 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 來創建。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章