Freemarker - 访问对象的静态变量

时间:2012-03-11 22:32:15

标签: freemarker

我有一个简单的课程:

public class MyClass {

     public final static long MAIN = 1;

     @Setter @Getter
     protected int id;
}

@Setter @Getter是Setter和Getter方法的lombok注释。)

在Freemarker模板中,我想创建一个类似的条件:

<#if myClassInstance.id == myClassInstance.MAIN>

但是if表达式的右侧是根据FreeMarker未定义的。有没有办法做到这一点?谢谢!

4 个答案:

答案 0 :(得分:2)

模板语言不了解Java类。但是您可以通过数据模型(模板上下文)公开静态成员。请参阅:http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55

答案 1 :(得分:2)

我知道这个问题已经有了一个可接受的答案,但我仍在编写一些代码,可以为其他人提供帮助。

使用java下面的代码

BeansWrapper w = new BeansWrapper(); 
TemplateModel statics = w.getStaticModels(); 
map.put("statics", statics); // map is java.util.Map
template.process(map, out); // template is freemarker.template.Template

然后在ftl中访问常量

${statics["com.model.to.gen.Common"].FLAG_YES} 

此处 com.model.to.gen.Common 是一个类, FLAG_YES 是一个静态常量。

答案 2 :(得分:0)

您可以使用公开字段选项。因此,您可以使用没有访问器的数据模型(getter / setter)。

BeansWrapperBuilder wrapperBuilder = new BeansWrapperBuilder(Configuration.VERSION_2_3_23);
wrapperBuilder.setExposeFields(true);

Template     template     = freemarkerConfiguration.getTemplate("mytemplatefile.ftl");
StringWriter stringWriter = new StringWriter();

template.process(model, stringWriter, wrapperBuilder.build());

System.out.println(stringWriter.toString());

答案 3 :(得分:0)

我还有另一种类似但有效的方法。
首先,我们可以创建一个这样的util类:

/**
 * FreeMarker Utils.
 *
 * @author Eric Chan
 */
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);
    }

}

然后,在您的Controller中调用它:

FreeMarkerUtils.initStatics(model);

仅此而已,现在您可以像这样访问.ftl中的静态变量:

${statics["com.springboot.constants.TestConstants"].NAME}