zoukankan      html  css  js  c++  java
  • 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 来创建。
    
    
  • 相关阅读:
    剑指63.数据流中的中位数
    剑指62.二叉搜索树的第k个结点
    JPA ---- EntityManager使用
    JPA ---- EntityManager介绍
    win10多桌面切换
    $emit子组件如何传递多个参数
    height高度自适应
    vue Avoided redundant navigation to current location
    Ant Design 使用小结
    Object.keys方法之详解
  • 原文地址:https://www.cnblogs.com/chansblogs/p/9400014.html
Copyright © 2011-2022 走看看