Apache Tiles:在运行时更改模板页面

时间:2010-10-21 22:08:16

标签: spring-mvc tiles

我有一个问题:假设在Spring MVC 3.0环境中我使用Tiles管理Views:我有一个包含所有视图定义的xml文件。每个视图都扩展了特定模板。我有两个模板:一个用于渲染completeDOM(),另一个用于partialDOM(.....)。问题是,有些视图可以在fullDOM和partialDOM中检索,但我不想写两个类似的定义。

我正在考虑采用动态方法:在运行时注入视图模板,指定一个http参数,该参数应包含模板的名称。如果请求包含参数,则Tiles应覆盖视图扩展的模板,并使用http参数值检测模板。

一些建议?

3 个答案:

答案 0 :(得分:3)

我知道这是一个老问题,但我需要做这件事,所以我想我会分享我的解决方案。

Tiles允许他们称之为“runtime composition”,它允许您修改定义。因此,您可以重用现有定义并只交换模板:

<tiles:insertDefinition name="existingDefinition" template="alternateTemplate.jsp" />

答案 1 :(得分:2)

我认为视图准备工作者可能有所帮助: http://tiles.apache.org/framework/tutorial/advanced/preparer.html

答案 2 :(得分:2)

在spring tilesConfigurer中,您需要设置可变容器:

<property name="useMutableTilesContainer" value="true"/>
<property name="checkRefresh" value="true"/>

在你的Spring Controller中:

ModelAndView model = new ModelAndView();
MutableTilesContainer container = (MutableTilesContainer)ServletUtil.getContainer(request.getSession().getServletContext());
Attribute attribute = new Attribute("your template jsp");
HashMap<String, Attribute>  attributes = new HashMap<String, Attribute>();
attributes.put("body", attribute);
Definition definition = new Definition("your definition name", "your jsp", attributes);
definition.setExtends("your definition template name");
definition = PatternUtil.replacePlaceholders(definition, "your definition name", new Object());
container.register(definition, request, response);
model.setViewName("your definition name");