我想知道是否有人可以提供帮助。我们正在将Spring Webflow 2应用程序从使用基于jsp的视图层转换为基于Thymeleaf的视图。
对于大多数情况来说这是可以的,但现在我正在努力让Thymeleaf访问我们放在servletContext
中的对象。
所以,我们有一个对象作为bean的一部分放在servletContext
中(实现ServletContextAware
和InitializingBean
)
为简单起见,我们假设它是一个字符串:
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的魔力,它知道它可以访问的各种范围(servletContext
,flowScope
,flashScope
等),并且(我猜是?)搜索每个范围范围,直到找到匹配的属性。结果是:
<p>test text</p>
在视图中呈现。
在我们的百里香模板中,我们正在尝试做同样的事情:
<p th:text="${referenceData}"/></p>
但这只是返回一个空字符串。该视图呈现一个空字符串:
<p></p>
(但我认为EL实际上是以null形式返回)
我很确定如果referenceData
对象是范围的属性,例如flowScope
或flashScope
,这将起作用 - 但不是,它的属性为{{ 1}}。
有没有人知道百里香是否可以通过EL访问servletContext
?也许我需要使用不同的语法?
干杯
森
答案 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>