I'm looking for a framework that is better and easier to use than Apache Tiles (which so far, I have used a couple of times).
With Tiles, it seems that when I have 100 actions I need to creates 100 jsp files and create 100 definitions in tiles.xml
.
Is there a better framework to manage my templates? I want to create, for example, 2 templates:
a) menu and column for content
b) menu, column for content, right column with banner
In both templates the menu is constant. In template b
, the right column is constant, so only the content column is different. For this simple example I don't want to define each JSP file that extends the template a
(just to provide a body). Thats lame imo. Or maybe I`m lame and I can define a DEFAULT template in Apache Tiles and I'm just not using it right. In anycase, all help appreciated.
Apache Tiles™ Tiles allows authors to define page fragments which can be assembled into a complete page at runtime. These fragments, or tiles, can be used as simple includes in order to reduce the duplication of common page elements or embedded within other tiles to develop a series of reusable templates.
A free open-sourced templating framework for modern Java applications. Based upon the Composite pattern it is built to simplify the development of user interfaces. For complex web sites it remains.
Overall, I would recommend SiteMesh over Tiles.
Here's how to setup SiteMesh 3
You can use Tiles for in-page templates, but use SiteMesh for site-wide template. Nevertheless...
How to make Tiles suck less:
Use convention over configuration. For example, put your definitions in webapp/WEB-INF/tiles.xml
and there's no need to tell tiles where it is.
Use wildcards:
<definition name="default" template="/WEB-INF/templates/default.jsp">
<put-attribute name="titleKey" value=""/>
<put-attribute name="body" value=""/>
</definition>
<definition name="*" extends="default">
<put-attribute name="titleKey" value="{1}.title"/>
<put-attribute name="body" value="/WEB-INF/views/{1}.jsp" />
</definition>
If your controller returns view name index
, it will match the definition *
, and use the JSP file /WEB-INF/views/index.jsp
for the body, and use the message property index.title
.
If your controller returns view name contact-us
, it will match the definition *
, and use the JSP file /WEB-INF/views/contact-us.jsp
for the body, and use the message property contact-us.title
In your template, add:
<c:set var="titleKey"><tiles:getAsString name="titleKey" /></c:set>
and
<title><spring:message code="${titleKey}"/></title>
Add ReloadableResourceBundleMessageSource
bean to your servlet application context.
Make a file /src/main/resources/messages.properties
, with content like:
index.title = Welcome to Acme, Inc.
contact-us.title = Contact Us
An other approach is Sitemesh. It was designed to mesh views where you can not modify the original, so it is more a html transformation/decoration framework than a templating framework like Tiles.
In my personal opinion Tiles is the better approach for appliations, and I would try to implement some kind of resolver (based on some naming conventions) that makes the xml files obsolete, but this was not the question.
@See: This old introductions shows how SiteMesh works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With