Hello,

I am using Tiles 2.1.3 in Spring MVC. I have two definitions/pages set up in the following way:

<definition name="page1" template="page1.jsp"/>
page1.jsp:

<h1>Page 1</h1>
...some content...
<jsp:include page="/modules/moduleOne"/>


The URL "/modules/moduleOne" is mapped to a Spring MVC controller that simply returns the tile definition named "moduleOne":

<definition name="moduleOne" template="moduleOne.jsp"/>

moduleOne.jsp:

<p>I am a module, short and stout.</p>

When I hit the URL "/modules/moduleOne" directly, the page renders fine. However, when I hit the URL for page1, the request dispatcher essentially gets stuck in an endless loop, with the condensed stack looking like this:

- pageOne.jsp
- Jsp Servlet/App Dispatcher/Filter Chain
ServletTilesRequestContext.include(String) line: 260    
ServletTilesRequestContext.dispatch(String) line: 220   
TemplateAttributeRenderer.write(Object, Attribute, TilesRequestContext) line: 44 TemplateAttributeRenderer(AbstractBaseAttributeRenderer).render (Attribute, TilesRequestContext) line: 103
BasicTilesContainer.render(Attribute, TilesRequestContext) line: 669    
BasicTilesContainer.render(TilesRequestContext, AttributeContext) line: 689
BasicTilesContainer.render(TilesRequestContext, Definition) line: 643   
BasicTilesContainer.render(TilesRequestContext, String) line: 626       
BasicTilesContainer.render(String, Object...) line: 322 
- TilesView.render()
- Spring Dispatcher Servlet
- JspRuntimeLibrary.include()
- pageOne.jsp

The logic that is grabbing my attention as doing something wrong is the code in BasicAttributeContext.inherit (which calls BasicAttributeContext.inheritParentTemplateAttribute) which "inherits" the definition, but only if the parent is empty. In this situation, this logic is wrong - due to the "include", the child/subcontext's template attribute should ALWAYS be honored. Am I off base here?

Note that when including the module from a page which already extends a parent template, this behavior does not occur:

<definition name="page2" extends="someLayout">
    <put-attribute name="content" value="page2.jsp"/>
</definition>

page2.jsp:
<h1>Page 2</h1>
...some content...
<jsp:include page="/modules/moduleOne"/>

This works fine.

Let me know if you need more information, or if I need to put together a simple project that replicates this behavior.

Thanks,
-Zach Bailey



Reply via email to