【发布时间】:2011-04-08 10:11:34
【问题描述】:
这是一个复杂的问题,所以请耐心看完冗长的解释。
当前情景
我们使用 Spring MVC 3.0.5 和 Apache Tiles 2.2。目前我们基于 Spring 的瓦片配置如下所示:
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/**/views.xml</value>
</list>
</property>
<!-- resolving preparer names as Spring bean definition names -->
<property name="preparerFactoryClass"
value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />
</bean>
<bean id="tilesViewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver"
p:order="1" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" />
(Tiles)视图定义是从所有views.xml 文件中读取的,当 Spring 控制器产生例如“主页”作为要呈现的逻辑视图名称时,将显示名称为“主页”的相应 Tiles 定义。
瞄准
我们现在打算在我们的 Web 应用程序中允许来自不同目录的不同视图定义集。原因是,不同的用户组会根据他们的组有自定义的模板。
假设我当前的所有视图定义都驻留在
/WEB-INF/default-views/**/views.xml
我想添加第二个文件夹
/WEB-INF/administrator-views/**/views.xml
第二个文件夹应包含与default-views 文件夹中名称相同 的视图定义。但根据 URL 模式,应显示其中一个或另一个。以下是两个示例:
http://example.com/default/foobar
==> Controller yields logical view name "foobar"
==> definition "foobar" from "default-views" folder shall be displayed
http://example.com/admin/foobar
==> Controller yields logical view name "foobar"
==> definition "foobar" from "administrator-views" folder shall be displayed
此外,我们希望允许一种回退机制。当相应的视图文件夹中不存在专用视图名称(上例中的“admin”)时,我们希望显示其他文件夹中的默认版本。
到目前为止
目前我正在考虑几个起点。也许我可以调整TilesConfigurer。它将 Tiles 视图定义保留在单个属性中,而不区分视图定义来自的文件夹。
另一种选择是尝试使用chained view resolvers 来完成此操作,专用的在链中更靠前,默认的在最后。
第三种选择是使用不同的视图名称,intercept the view name response from the controller 使用 HandlerInterceptor 将其映射到专用视图(如果不存在,则可能不起作用)。
问题
- 有哪些好的选项可以实现这种视图分辨率机制?
- 允许视图定义被其他人/更专业的人覆盖
- 根据请求的 URL 模式进行显示
目前,我的选项#2 听起来最有说服力,因为我想避免在没有必要时玩弄 Springs 类。但是我缺少链式视图解析器和TilesConfigurer 中的视图定义列表之间的连接。
感谢您迄今为止的耐心和阅读。
【问题讨论】:
标签: spring spring-mvc view tiles2