I've just about got everything worked out for using Freemarker to create my Sitemesh templates and have it have access to all my Struts2 goodness. To do that I've got the following in my web.xml

<!-- ======================== SiteMesh Page filter ======================= -->
 <filter>
   <filter-name>sitemesh</filter-name>
   <filter-class>
     org.apache.struts2.sitemesh.FreeMarkerPageFilter
   </filter-class>
 </filter>

 <!--Declare servlet for handling freemarker requests -->
 <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>class://decorators</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <!-- FreeMarker servlet should serve all requests with .dec extension-->
 <servlet-mapping>
   <servlet-name>sitemesh-freemarker</servlet-name>
   <url-pattern>*.ftl</url-pattern>
 </servlet-mapping>

<!-- ================ Struts2 dispatching and cleanup filter ============= -->
 <filter>
   <filter-name>struts2</filter-name>
   <filter-class>
     org.apache.struts2.dispatcher.FilterDispatcher
   </filter-class>
 </filter>

 <!-- Allows access to struts2 features from Sitemesh -->
 <filter>
   <filter-name>struts2-cleanup</filter-name>
   <filter-class>
     org.apache.struts2.dispatcher.ActionContextCleanUp
   </filter-class>
 </filter>

 <filter-mapping>
   <filter-name>struts2-cleanup</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

 <filter-mapping>
   <filter-name>sitemesh</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

 <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

I think this is _almost_ working, but I'm getting an exception when I try and hit a decorated page. It looks as though the Struts2 Sitemesh Freemarker page filter is unable to get the locale to use and so throws a NPE. 12:48:18.182 [btpool0-2] ERROR o.a.s.sitemesh.FreeMarkerPageFilter - Error applying decorator: null
java.lang.NullPointerException
at org.apache.struts2.sitemesh.FreeMarkerPageFilter.getLocale(FreeMarkerPageFilter.java:176) at org.apache.struts2.sitemesh.FreeMarkerPageFilter.applyDecorator(FreeMarkerPageFilter.java:143) at org.apache.struts2.sitemesh.TemplatePageFilter.applyDecorator(TemplatePageFilter.java:113) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:62) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1040) at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1040)

Looking at the offending code, it looks as tho the filter assumes that the page being decorated is a Struts2 action and in my particular case that's not true. I also have JSPs and other things that I want to be decorated. For now I can subclass the FreeMarkerPageFilter and override the getLocale() method and have it check if invocation.getAction() is null and if it is return the configuration.getLocale(). Would that be the correct behaviour?

Thanks,
Rich

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to