Thymeleaf可以访问Spring servletContext吗?

时间:2012-12-19 09:23:46

标签: spring-webflow-2 thymeleaf

我想知道是否有人可以提供帮助。我们正在将Spring Webflow 2应用程序从使用基于jsp的视图层转换为基于Thymeleaf的视图。

对于大多数情况来说这是可以的,但现在我正在努力让Thymeleaf访问我们放在servletContext中的对象。

所以,我们有一个对象作为bean的一部分放在servletContext中(实现ServletContextAwareInitializingBean

为简单起见,我们假设它是一个字符串:

public class ReferenceDataBuilder implements ServletContextAware, InitializingBean {

public void setServletContext(ServletContext p_context) {
    p_context.setAttribute("referenceData", "test text" );
}

在我们基于jsp的视图中,我们可以像这样访问referenceData对象:

<p><c:out value="${referenceData}"/></p>

通过Spring EL的魔力,它知道它可以访问的各种范围(servletContextflowScopeflashScope等),并且(我猜是?)搜索每个范围范围,直到找到匹配的属性。结果是:

<p>test text</p>

在视图中呈现。

在我们的百里香模板中,我们正在尝试做同样的事情:

<p th:text="${referenceData}"/></p>

但这只是返回一个空字符串。该视图呈现一个空字符串:

<p></p>

(但我认为EL实际上是以null形式返回)

我很确定如果referenceData对象是范围的属性,例如flowScopeflashScope,这将起作用 - 但不是,它的属性为{{ 1}}。

有没有人知道百里香是否可以通过EL访问servletContext?也许我需要使用不同的语法?

干杯

1 个答案:

答案 0 :(得分:4)

您可以通过#ctx对象访问常用地图,该对象的类型为SpringWebContext

例如#ctx.locale,#ctx.httpServletRequest.contextPath,#ctx.servletContext,甚至是Spring applicationContext的#ctx.applicationContext。

您可以使用直接方法调用

<p th:text="${#ctx.servletContext.getAttribute('referenceData')}">Whatever</p>

或applicationAttributes变量映射

<p th:text="${#ctx.servletContext.applicationAttributes.referenceData}">Whatever</p>

使用Spring隐式对象简化事件

<p th:text="${application.referenceData}">Whatever</p>