从Tiles视图(JSP)访问Spring bean

在Spring MVC中,我可以使用JstlView的exposedContextBeanNames(或exposeContextBeansAsAttributes)在JSP中访问我的bean。 例如,然后,在我的JSP中我可以编写($ {properties.myProperty)。 但是,当相同的JSP是切片视图的一部分时,无法访问这些属性。 是否可以正确配置Tiles或以其他方式访问这些属性?

我正在使用Spring MVC 3.0.2和Tiles 2.2.1。 这是我的一些配置:

          properties   

编辑:我已经实施了Skaffman的解决方案。

TilesExposingBeansViewResolver.java:

 package es.kcsolutions.util.spring.servlet.view; import org.springframework.web.servlet.view.*; public class TilesExposingBeansViewResolver extends UrlBasedViewResolver { private Boolean exposeContextBeansAsAttributes; private String[] exposedContextBeanNames; public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) { this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes; } public void setExposedContextBeanNames(String[] exposedContextBeanNames) { this.exposedContextBeanNames = exposedContextBeanNames; } @Override protected AbstractUrlBasedView buildView(String viewName) throws Exception { AbstractUrlBasedView superView = super.buildView(viewName); if (superView instanceof TilesExposingBeansView) { TilesExposingBeansView view = (TilesExposingBeansView) superView; if (this.exposeContextBeansAsAttributes != null) view.setExposeContextBeansAsAttributes(this.exposeContextBeansAsAttributes); if (this.exposedContextBeanNames != null) view.setExposedContextBeanNames(this.exposedContextBeanNames); } return superView; } } 

TilesExposingBeansView.java:

 package es.kcsolutions.util.spring.servlet.view; import java.util.*; import javax.servlet.http.*; import org.springframework.web.context.support.ContextExposingHttpServletRequest; import org.springframework.web.servlet.view.tiles2.TilesView; public class TilesExposingBeansView extends TilesView { private boolean exposeContextBeansAsAttributes = false; private Set exposedContextBeanNames; public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) { this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes; } public void setExposedContextBeanNames(String[] exposedContextBeanNames) { this.exposedContextBeanNames = new HashSet(Arrays.asList(exposedContextBeanNames)); } protected HttpServletRequest getRequestToExpose(HttpServletRequest originalRequest) { if (this.exposeContextBeansAsAttributes || this.exposedContextBeanNames != null) return new ContextExposingHttpServletRequest(originalRequest, getWebApplicationContext(), this.exposedContextBeanNames); return originalRequest; } @Override protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest requestToExpose = getRequestToExpose(request); exposeModelAsRequestAttributes(model, requestToExpose); super.renderMergedOutputModel(model, requestToExpose, response); } } 

弹簧配置:

      properties   

如果您遇到问题,请查看TilesExposingBeansView.renderMergedOutputModel。 我做了一些测试,但也许有必要做更多。

正如您所注意到的,此function是InternalResourceViewResolverInternalResourceView一部分,而Tiles内容直接从UrlBasedViewResolverAbstractUrlBasedViewinheritance,因此您无法使用它。

看一下代码,没有理由不把这些东西放到AbstractUrlBasedView 。 神奇发生在InternalResourceView.getRequestToExpose ,它看起来也非常适用于AbstractUrlBasedView

在短期内,我建议TilesView UrlBasedViewResolverTilesView ,从InternalResourceView复制getRequestToExpose东西。 从长远来看,我鼓励你向SpringSource提出一个问题,要求他们将这个function在类层次结构中移动到AbstractUrlBasedView ,使其更广泛地可用。

您是否尝试在xml配置文件中使用ServletContextAttributeExporter

          

从Spring 3.0开始,现在有一个TilesViewResolver 。

UrlBasedViewResolver的便捷子类,支持TilesView(即Tiles定义)及其自定义子类。

可以通过“viewClass”属性指定此解析程序生成的所有视图的视图类。 有关详细信息,请参阅UrlBasedViewResolver的javadoc。

注意:链接ViewResolvers时,TilesViewResolver将检查指定模板资源是否存在,并且只有在实际找到模板时才返回非空View对象。

自:3.0作者:Juergen Hoeller