配置对象Configuration

配置就是在对象中存储常用(应用级别)的设置和定义某些想在所有模板中可用的变量。它们也会处理 Template 实例的创建和缓存操作。

配置对象是 freemarker.template.Configuration 的实例,可以通过构造方法来创建它。一个应用程序通常只使用一个共享的Configuration实例。

配置对象通过Template的方法来使用,特别是通过process方法。每个实例都有一个确切的而且和它相关的Configuration实例,这个实例由Template的构造方法分配给Template示例。可以指定一个Configuration实例作为它的参数。通常情况下,使用Configuration.getTemplate(而不是直接调用Template的构造方法)来获得Template实例。这种情况下,相关的Configuration实例就会是getTemplate法官法被调用时的那个实例。


设置共享变量

共享变量是为所有模板所定义的变量

可以使用setSharedVariable方法向配置实例中添加共享变量。

例如:


Configuration cfg = new Configuration();
...
cfg.setSharedVariable("wrap", new WrapDirective());
cfg.setSharedVariable("company", "Foo Inc.");



在所有使用这个Configuration的模板中,名为 wrap 的用户自定义指令和一个名为 compnay的字符串会在数据模型的根上可见。

在传递给Template.process根对象里的变量将会隐藏同名的共享变量。

如果配置对象在多线程环境中使用,不要使用TemplateModel实现类来作为共享变量,因为它不是线程安全的。这也是基于Servlet的Web应用的典型情况。


设置配置信息

配置信息是影响FreeMarker行为的已经被命名的值。

配置信息存储在Configuration实例中,可以在Template实例中被覆盖。

例如在Configuration对象中给 locale 设置为 en_us,那么 locale 在所有模板中都使用 en_us 的配置,除非在模板中 locale 被明确设置成不同的值。因此,在Configuration中的值充当默认值,这些值在每个模板中也可以被覆盖。在Configuration和Template实例中的值也可以在单独调用Template.process方法后被覆盖。

配置信息可以被分成3层 Environment > Template > Configuration


  • 在Configuration层设置信息:
Configuration myCfg = new Configuration();
myCfg.setLocale(java.util.Locale.ITALY);
myCfg.setNumberFormat("0.####");



在许多Web应用框架中,应该使用这种框架特定的配置方法来进行配置,比如使用.properties文件。在这种情况下,大多数使用Configuration对象的setSetting(String name, String value)方法。

在Spring框架中,可以这样使用:

<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="freemarkerSettings">
    <props>
      <prop key="locale">it_IT</prop>
      <prop key="number_format">0.####</prop>
    </props>
  </property>
</bean>


  • 在Template层设置:

这里不需要设置配置信息,除非想替代freemaker.cache.TemplateCache来管理Template对象,这样的话,应该在Template对象第一次使用前就设置配置信息,然后就将Template对象视为是只读的。


  • Environment层

有两种配置方法:

  • 使用Java API:使用Environment对象的setter方法:
Environment env = myTemplate.createProcessingEnvironment(root, out);
env.setLocale(java.util.Locale.ITALY);
env.setNumberFormat("0.####");
env.process(); // 处理模板


  • 在模板中直接使用指令,
<#setting locale="it_IT">
<#setting number_format="0.####">