2010-10-21 41 views
2

我有一个问题:假设在Spring MVC 3.0环境中,我使用Tiles管理视图:我有一个带有所有视图定义的xml文件。每个视图都扩展了特定的模板。我有两个模板:一个用于渲染完整的DOM()和一个用于partialDOM(.....)。问题是,有一些视图可以在fullDOM中检索,也可以在partialDOM中检索,但我不想写两个相似的定义。Apache Tiles:运行时更改模板页面

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

有些建议?

回答

2

在春天的TilesConfigurer需要设置可变容器:

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

而且在Spring控制器:

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"); 
3

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

瓷砖允许他们称之为“runtime composition”,它允许您修改定义。所以,你可以重用现有的定义,只是换模板:

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