4

我有使用 Spring 3.1 的 Java webapp,带有用于呈现视图的 Freemarker 模板。我想根据特定应用程序属性的真/假值有条件地在视图中显示链接。

我在中定义了以下应用程序属性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>

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

我尝试过但不起作用的事情

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

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

<bean id="abstractFreemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" abstract="true">
    ...
    <property name="freemarkerSettings">
        <props>
            <prop key="auto_import">
                /spring.ftl as spring, /myTemplate.ftl as myTemplate
            </prop>
        </props>
    </property>
    ...
</bean>

我还没有尝试过的事情

  1. 我发现一篇博客文章描述了如何手动向 Freemarker 添加对 SpEL 的支持。对于我需要它的这种情况,我宁愿不做所有这些。

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

<#assign showLink><foo:getAppProperty name="showLink"/></#assign>
4

3 回答 3

5

我在春天使用加载属性

<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 不会自动使用属性。你需要添加你想要的。

于 2013-03-09T15:31:10.287 回答
1

由于某些未知原因,接受的解决方案对我不起作用。我正在使用 bean 加载属性。所以假设存在一个用这个 bean 映射的 Java 类:

<bean id="appProperties" class="com.myCompany.AppProperties">
    <property name="appVersion" value="${app.version}" />
</bean>

我使用这个 xml 映射访问 Freemarker 中的 bean 变量:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/views/"/>
    <property name="defaultEncoding" value="UTF-8" />
    <property name="freemarkerSettings">
        <props>
            <prop key="auto_import">spring.ftl as spring</prop>
            <prop key="number_format">0.####</prop>
        </props>
    </property>
    <property name="freemarkerVariables" ref="staticAttributesMap"/>
</bean>

<util:map id="staticAttributesMap">
    <entry key="appversion" value="#{appProperties.appVersion}" />
</util:map>

并且不要忘记在 xml 文件的顶部添加相应的名称空间(...是您已经拥有的名称空间,以防您像我一样直到现在才使用 util):

<beans ...
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="...
     http://www.springframework.org/schema/util
     http://www.springframework.org/schema/util/spring-util-3.0.xsd">
于 2014-06-20T16:41:56.123 回答
0

我无法让公认的解决方案正常工作,但如果我使用context:property-placeholder而不是 util:properties 加载属性文件,一切都会无缝运行:

代替

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

<context:property-placeholder location="classpath:/myprops.properties" />

我实际上是在尝试从 maven 获取版本,所以我的位置是

 META-INF/maven/group.id/artifactid/pom.properties

此外,我发现我必须像这样访问 freemarker 中的变量: ${var1}, ${var2}

于 2014-11-21T12:15:18.563 回答