Thymeleaf 可以访问 Spring servletContext 吗?

Nat*_*ell 2 spring-webflow-2 thymeleaf

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

对于这大部分来说,这是可以的,但现在我正在努力让 Thymeleaf 访问我们放入servletContext.

因此,我们有一个对象被放入servletContextbean 的一部分(实现ServletContextAwareInitializingBean

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

public class ReferenceDataBuilder implements ServletContextAware, InitializingBean {

public void setServletContext(ServletContext p_context) {
    p_context.setAttribute("referenceData", "test text" );
}
Run Code Online (Sandbox Code Playgroud)

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

<p><c:out value="${referenceData}"/></p>
Run Code Online (Sandbox Code Playgroud)

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

<p>test text</p>
Run Code Online (Sandbox Code Playgroud)

在视图中呈现。

在我们的 thymeleaf 模板中,我们尝试做同样的事情:

<p th:text="${referenceData}"/></p>
Run Code Online (Sandbox Code Playgroud)

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

<p></p>
Run Code Online (Sandbox Code Playgroud)

(但我认为 EL 实际上是作为 null 返回的)

我非常确定,如果该referenceData对象是诸如flowScope或 之类的范围的属性flashScope,那么这将起作用 - 但它不是,它是servletContext.

有谁知道 thymeleaf 是否可以servletContext通过 EL 访问?也许我需要使用不同的语法?

干杯

内森

小智 7

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

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

您可以使用直接方法调用

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

或 applicationAttributes 变量映射

<p th:text="${#ctx.servletContext.applicationAttributes.referenceData}">Whatever</p>
Run Code Online (Sandbox Code Playgroud)

或者使用 Spring 隐式对象来简化事件

<p th:text="${application.referenceData}">Whatever</p>
Run Code Online (Sandbox Code Playgroud)