如何在Freemarker模板中访问Spring应用程序属性?


问题内容

我有使用Spring 3.1和Freemarker模板渲染视图的Java Webapp。我想根据特定应用程序属性的true /
false值在视图中有条件地显示链接。

我在中定义了以下应用程序属性src/main/resources/application.properties

showLink=true

如果我在Spring MVC中使用常规JSP,则可以使用SpEL根据以下值有条件地显示链接showLink

<c:if test="${configuration['showLink']}">
    <a href="...">some link</a>
</c:if>

如何在Freemarker模板中做到这一点?我试图做这样的事情,但无法使它起作用:

<#assign showLink>${configuration['showLink']}</#assign>

<#if showHelpLink>
    <a href="...">some link</a>
</#if>

我查看了Springfreemarker宏(在spring.ftl中),但是我看到的最接近的东西是获得消息属性而不是应用程序属性的能力。

我尝试过的事情没有用

  1. 我查看了spring.ftl中的宏,但是最接近的是给我消息属性。

  2. 另外,我无法将值注入控制器,然后将其放入ModelMap,因为我的FreeMarker模板是所有页面的标题,因此它是自动导入的:






    /spring.ftl as spring, /myTemplate.ftl as myTemplate





我还没尝试过的东西

  1. 我找到了一篇博客文章,描述了如何手动将对SpEL的支持添加到Freemarker。我宁愿在需要的情况下不做所有这些事情。

  2. 创建一个自定义标签库以检索应用程序属性值,因此我可以在我的freemarker模板中执行以下操作:

    <#assign showLink>


问题答案:

我在spring使用加载属性

<util:properties id="myProperties" location="classpath:/myprops.properties" />

然后在配置中,我使用“ freemarkerVariables”属性,例如

<bean id="abstractFreemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" abstract="true">
...
    <property name="freemarkerVariables" ref="staticAttributesMap" />



<util:map id="staticAttributesMap">
    <entry key="var1" value="${var1}" />
    <entry key="var2" value="${var2}" />

    <entry key="myMap">
        <map>
            <entry key="v1" value="${value1}" />
            <entry key="v2" value="${value2}" />
        </map>
    </entry>
</util:map>

其中var1 / var2 / value1 / value2是文件中的所有属性。

您可以像这样在freemarker中访问属性

$var1$
$var2$
$myMap.v1$
$myMap.v2$

此解决方案的唯一缺点是,Freemarker无法自动使用属性。您需要添加所需的内容。