`
penciltim
  • 浏览: 43282 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

HOWTO: Use Freemarker, SiteMesh, and Spring MVC together

阅读更多
转自http://forum.springsource.org/showthread.php?t=53476

HOWTO: Use Freemarker, SiteMesh, and Spring MVC together

I hope this thread will help others who are trying to combine these
technologies. After much pain, I finally got it working exactly the way
I want.

My goal was to build a website using Freemarker for templating,
SiteMesh for layouts, and Spring MVC. Normally you would just put the
Freemarker files in WEB-INF/freemarker.

However, this site is one of many we build that re-use the same Content
Management Admin screens - so we wanted the Freemarker templates for
those forms in the classpath. But we sometimes need to override those
admin screens with customizations in a specific project. To enable
customizations, we want to be able to first try to load the Freemarker
template from the WAR file in /modules/
, and if it's not found there, load it from the classpath package modules.

Additionally, each website will have its site-specific HTML content written in Freemarker - these files be stored in /WEB-INF/freemarker.

Summary:
* The content of a site-specific web page is written in Freemarker and stored in /WEB-INF/freemarker.
* Site-specific SiteMesh decorators are written in Freemarker and stored in the website's /decorators/
directory. (This could probably be in /WEB-INF/freemarker/decorators)
* Re-usable, default admin screens are written in Freemarker and stored in classpath:modules.
* If needed, a developer can override an admin screen for the site by copying the freemarker file from classpath:modules
into the site's /modules.
folder.  Then they can make any customizations needed.

We also use Freemarker in the service tier to generate emails, so we can't just follow the Reference Guide instructions for using Freemarker in the web tier.
Instead, we have to use Spring's FreeMarkerConfigurationFactoryBean
class to create a custom Freemarker Configuration bean.

applicationContext-freemarker.xml

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
	<description>Using the Config directly so we can use it outside the web tier</description>
	<property name="templateLoaderPaths">
		<list>
		<value>/WEB-INF/freemarker/</value>
		<value>/modules/</value>
		<value>/</value>
		<value>classpath:modules</value>
		<value>classpath:org/springframework/web/servlet/view/freemarker</value>
		</list>
	</property>
	<property name="freemarkerSettings">
		<props>
		<prop key="datetime_format">MM/dd/yyyy</prop>
		<prop key="number_format">#</prop>
		<prop key="whitespace_stripping">true</prop>
		</props>
	</property>
	<property name="freemarkerVariables">
		<map>
		<entry key="xml_escape" value-ref="fmXmlEscape" />
		<entry key="html_escape" value-ref="fmHtmlEscape" />
		</map>
	</property>
</bean>

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<description>Required for Freemarker to work in web tier</description>
	<property name="configuration" ref="freemarkerConfiguration" />
</bean>
	
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />

<bean id="fmHtmlEscape" class="freemarker.template.utility.HtmlEscape" />


In the freemarkerConfiguration
bean above, the important setting is the templateLoaderPaths
.  When Freemarker tries to find a template file, it will look for the template in the following order:

* /WEB-INF/freemarker

* /modules/

* / (the site's root - important for decorators)

* The modules package in the classpath - this could be a JAR file in WEB-INF/lib or in WEB-INF/classes

* The org/springframework/web/servlet/view/freemarker package on the
classpath - this is so we can reuse Spring's Freemarker Macros

By Default, The Freemarker Servlet creates a new Configuration object, which will only
load templates from the Servlet Context, a physical directory, OR a
classpath location (in other words, it does not use
freemarker.cache.MultiTemplateLoader). SiteMesh extends the
FreemarkerServlet to do its decorating. Since we need to re-use the
Configuration created in applicationContext-freemarker.xml
(which loads templates from multiple locations), I needed to extend com.opensymphony.module.sitemesh.freemarker.Freema  rkerDecoratorServlet
.  I wrote the following Subclass:

package com.kazaam.sitemesh.servlet;

import java.io.IOException;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet;

import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;

/**
 * @author mstralka
 * 
 */
public class KzSpringFreemarkerDecoratorServlet extends FreemarkerDecoratorServlet {

	@Override
	public void init() throws ServletException {
		super.init();
		WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
		Configuration springConfiguration = (Configuration) ctx.getBean("freemarkerConfiguration");
		TemplateLoader templateLoader = springConfiguration.getTemplateLoader();
		getConfiguration().setTemplateLoader(templateLoader);
	}
}


Normally, The SiteMesh FreemarkerDecoratorServlet is configured
in web.xml. Since we want to re-use our Spring Interceptors, we are
going to use Spring's ServletWrappingController to configure the
servlet as a Spring bean instead.

In spring-servlet.xml
(or whatever you call your Spring MVC XML file), add the following bean (which wraps the Servlet in a controller so we can re-use our Spring MVC interceptors for Hibernate, etc):

<bean id="freemarkerWrapperServletController" class="org.springframework.web.servlet.mvc.ServletWrappingController">
	<property name="servletClass" value="com.kazaam.sitemesh.servlet.KzSpringFreemarkerDecoratorServlet" />
	<property name="servletName" value="sitemesh-freemarker" />
	<property name="initParameters">
		<props>
			<prop key="TemplatePath">/</prop><!--this is ignored by our custom implementation but keep it here-->
			<prop key="default_encoding">ISO-8859-1</prop>
		</props>
	</property>
</bean>


Add the following to your UrlMapping Bean's mappings property:

<prop key="/**/*.ftl">freemarkerWrapperServletController</prop>
<prop key="/**/*.ftd">freemarkerWrapperServletController</prop>


In web.xml, make sure *.ftl and *.ftd are handled by your Spring dispatcher servlet (my dispatcher servlet is named spring
):

<servlet>
	<servlet-name>spring</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>


In addition to whatever other URL patterns you let Spring handle,add the following so the Freemarker templates are handled by Spring too:

<servlet-mapping>
	<servlet-name>spring</servlet-name>
	<url-pattern>*.ftd</url-pattern>
</servlet-mapping>
<servlet-mapping>
	<servlet-name>spring</servlet-name>
	<url-pattern>*.ftl</url-pattern>
</servlet-mapping>


To complete the SiteMesh configuration, here is my sitemesh.xml
file in the /WEB-INF/ directory (Note that I name my decorators.xml
file sitemesh-decorators.xml file instead because I like them to appear
next to each other alphabetically in Eclipse)

<sitemesh>
	<property name="decorators-file" value="/WEB-INF/sitemesh-decorators.xml" />
	<excludes file="/WEB-INF/sitemesh-decorators.xml" />

	<page-parsers>
		<parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
		<parser content-type="text/html;charset=ISO-8859-1" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
	</page-parsers>

	<decorator-mappers>
		<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
			<param name="property.1" value="meta.decorator" />
			<param name="property.2" value="decorator" />
		</mapper>
		<mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
		<mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
			<param name="decorator" value="printable" />
			<param name="parameter.name" value="printable" />
			<param name="parameter.value" value="true" />
		</mapper>
		<mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
		<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
			<param name="config" value="/WEB-INF/sitemesh-decorators.xml" />
		</mapper>
	</decorator-mappers>
</sitemesh>


And here is my sitemesh-decorators.xml file (yours will be different):

<decorators defaultdir="/decorators">
	<!-- SiteMesh Decorator Mappings:
	See http://opensymphony.com/sitemesh/dm.html
	 -->

	<!-- No decorator -->
	<excludes>
		<pattern>/misc/*</pattern>
		<pattern>/dwr/*</pattern>
		<pattern>/articles/rss.*</pattern>
		<pattern>/dwr/index.html</pattern>
	</excludes>
	
	<decorator name="main" page="main.ftd">
		<url-pattern>*</url-pattern>
	</decorator>
	
	<decorator name="authoring" page="authoring.ftd">
		<url-pattern>/page/create*</url-pattern>
		<url-pattern>/page/edit*</url-pattern>
		<url-pattern>/article/create*</url-pattern>
		<url-pattern>/article/edit*</url-pattern>
	</decorator>
	
	<decorator name="popup" page="popup.ftd">
		<url-pattern>/page/wikihelp*</url-pattern>
		<url-pattern>/page/help*</url-pattern>
	</decorator>
	
</decorators>


Hope this helps!




分享到:
评论

相关推荐

    spring mvc +freemarker不错的mvc搭配

    Spring MVC 是一个强大...在Spring MVC中集成FreeMarker,首先需要在项目的配置文件(如`servlet-context.xml`)中配置FreeMarker视图解析器。这通常包括指定模板目录、编码格式和是否缓存模板等设置。例如: ```xml ...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。这个教程“Spring MVC - A Tutorial”旨在帮助开发者深入理解和掌握Spring MVC的核心概念和...

    spring mvc, tiles, freemarker集成

    标题中的“Spring MVC, Tiles, Freemarker集成”指的是在Java Web开发中,将Spring MVC作为控制器框架,Tiles作为页面布局工具,而Freemarker作为视图模板引擎进行整合使用的技术方案。这种集成可以帮助开发者构建...

    spring mvc freemarker 简单例子

    Spring MVC 和 Freemarker 是两种广泛应用于Java Web开发的技术。Spring MVC 是一个基于Spring框架的Model-View-Controller架构,用于构建高效、灵活的Web应用程序。而Freemarker 是一款强大的模板引擎,它与后端...

    spring mvc step by step,例子

    4. **View**:视图负责渲染模型数据,Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。 5. **HandlerMapping**:负责将请求映射到特定的控制器方法。 6. **HandlerAdapter**:适配器模式,使得Spring ...

    最全最经典spring-mvc教程

    Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种优雅的方式来处理HTTP请求和响应,使得开发者可以专注于业务逻辑而不是底层实现。在这...

    整合 freemarker +spring security + spring MVC + spring DATA jpa 前端jtable 简单的crud

    本项目结合了Freemarker、Spring Security、Spring MVC和Spring Data JPA,旨在实现前端JTable的简单CRUD(创建、读取、更新、删除)功能。以下是这些技术的详细介绍及其在项目中的应用。 **Freemarker** 是一个...

    spring MVC .docx

    Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。 5. **View**: 视图负责渲染模型中的数据并呈现给用户。它通常与某种模板语言结合,如JSP中的EL(Expression Language)和JSTL(JavaServer Pages ...

    spring MVC基础学习

    - 视图(View):负责渲染模型数据,Spring MVC支持多种视图技术如JSP、FreeMarker、Thymeleaf等。 5. **数据绑定与验证**: - 数据绑定:Spring MVC可以自动将请求参数绑定到Controller方法的参数上。 - 数据...

    开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp

    标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...

    spring mvc 3.0-mybatis-freemarker整合

    在本项目中,我们主要探讨的是如何将Spring MVC 3.0、MyBatis 3 和 Freemarker 2.3 这三个强大的技术框架整合在一起,以构建一个高效且灵活的Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...

    spring mvc 4.0

    7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、Thymeleaf等,视图解析器可以根据配置自动选择合适的视图技术。 8. **异步处理**:Spring MVC 4.0引入了异步请求处理,通过@...

    Spring MVC 4.2.3

    7. **多视图解析器**:Spring MVC支持多种视图解析器,如JSP、FreeMarker、Thymeleaf等,可以根据项目需求灵活选择。 8. **模板引擎集成**:例如,与Thymeleaf的集成使得开发者能编写声明式逻辑的模板,提高了视...

    Spring MVC Cookbook(PACKT,2016).pdf

    《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...

    Spring MVC框架实例

    - **View**: 负责呈现视图,Spring MVC 支持多种视图技术,如 JSP、FreeMarker、Thymeleaf 等。 - **HandlerMapping**: 将请求映射到处理器,Spring 2.5 中主要通过 XML 配置来实现。 - **HandlerAdapter**: 适配...

    spring MVC3 集成 freemarker

    **Spring MVC3 集成 FreeMarker 概述** Spring MVC 是一个强大的MVC框架,用于构建基于Java的Web应用程序。它提供了模型、视图和控制器的分离,使得开发过程更加模块化,易于维护。而FreeMarker则是一个模板引擎,...

    Spring MVC and FreeMarker Sample

    **Spring MVC与FreeMarker整合应用详解** Spring MVC是Spring框架的一部分,它是一个强大的Web应用程序开发模型,用于构建灵活、可维护的Java Web应用。而FreeMarker则是一个模板引擎,允许开发者将逻辑代码与呈现...

    Spring MVC框架的各种依赖包下载

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者轻松地处理HTTP请求、数据绑定、视图渲染等任务。在使用Spring MVC时,依赖包的正确...

    freemarker 与sitemesh 整合例子

    Freemarker和Sitemesh是两个在Web开发中常用的开源技术。Freemarker是一个模板引擎,主要用于生成动态HTML或其他文本格式的输出,而Sitemesh则是一个页面布局和装饰框架,用于统一网站的外观和感觉。这两者的整合...

Global site tag (gtag.js) - Google Analytics