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 来创建。
    
    
  • 相关阅读:
    Ubuntu12.04 安装网卡驱动
    C++类内存分布
    C++多态的实现及原理详细解析
    QT4.7.4在ubuntu10.10下的编译(转)
    FFMpeg处理RTMP流有两种方式
    C++中的单例模式
    C++ STL--stack/queue 的使用方法
    qt编译出现 /usr/bin/ld: cannot find -lQtCore的解决方法
    each()
    window.setTimeout() 和 window.setInterval() 使用说明
  • 原文地址:https://www.cnblogs.com/chansblogs/p/9400014.html
Copyright © 2011-2022 走看看