SiteMesh - Freemarker Decorators
As of SiteMesh 2.0.2 Freemarker (.ftl) decorators are supported.Here is an example of how such a decorator might look like:
<#include "/includes/decorators/header.dec"> <h2>${title}</h2> ${head} <img src="${base}/images/logo.gif" border="0"> <td valign="top" class="body"> <div class="header"> <span class="pagetitle">${title}</span> </div> ${body} </td> <#include "/includes/decorators/footer.dec">
Installation
- Download Freemarker 2.3 (recommended) and copy it into
[web-app]/WEB-INF/lib
. The SiteMesh distribution comes with freemarker.jar v2.3rc3 - Add the following to
[web-app]/WEB-INF/web.xml
within the<web-app>
tag:
<servlet> <servlet-name>sitemesh-freemarker</servlet-name> <servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>ISO-8859-1</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sitemesh-freemarker</servlet-name> <url-pattern>*.dec</url-pattern> </servlet-mapping>
- Modify
decorators.xml
to reference a .dec file.
<#include "/includes/decorators/header.dec"> <h2>${title}</h2> ${head} <img src="${base}/images/logo.gif" border="0"> <td valign="top" class="body"> <div class="header"> <span class="pagetitle">${title}</span> </div> ${body} </td> <#include "/includes/decorators/footer.dec">
Context
FreemarkerDecoratorServlet puts some things into the context object that you should be aware of:
Basic context attributes
- It makes all request, request parameters, session, and servlet context attributes available to templates through Request, RequestParameters, Session, and Application variables. For example :
${Session["user"]}
- The scope variables are also available via automatic scope discovery. That is, writing Application.attrName, Session.attrName, Request.attrName is not mandatory; it's enough to write attrName, and if no such variable was created in the template, it will search the variable in Request, and then in Session, and finally in Application.
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"]>
- It creates a variable with name JspTaglibs, that can be used to load JSP taglibs. For example:
<#assign ww=JspTaglibs["/WEB-INF/webwork.tld"]> ... <@ww.property value="myVar"/>
Sitemesh context attributes
base request.getContextPath() title Parsed page title (<title>...<title>) head Parsed page head body Parsed page body page SiteMesh's internal Page object