本章节介绍怎样将 FreeMarker 和传统的 Spring MVC 进行集成。具体集成步骤如下:
(1)先看看 Spring MVC 项目的整体结构,其中包含了一个控制器Controller、一个xml配置文件、一个FreeMarker模版和web.xml文件。这是一个传统的web项目,打包方式为 war。如下图:

(2)在 resources 目录下面创建 applicationContent.xml 文件,该文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:context="https://www.springframework.org/schema/context"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.0.xsd
https://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="false">
<!-- 扫描路径 -->
<context:component-scan base-package="com.hxstrive"/>
<context:annotation-config />
<!-- annotation默认的方法映射适配器 -->
<!--<bean id="handlerMapping"-->
<!--class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<!--</bean>-->
<!--3:配置JSP 显示ViewResolver-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<!--<property name="prefix" value="/"/>-->
<!--<property name="suffix" value=".jsp"/>-->
<!--</bean>-->
<!-- 配置freeMarker的模板路径 -->
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/views" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">1</prop>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.######</prop>
<prop key="whitespace_stripping">true</prop>
</props>
</property>
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
</bean>
<!-- 配置freeMarker视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="viewNames" value="*.ftl"/>
<property name="contentType" value="text/html; charset=utf-8"/>
<property name="prefix" value=""/>
<property name="suffix" value=""/>
<property name="order" value="2"/>
<property name="cache" value="false"/>
</bean>
</beans>(3)创建 com.hxstrive.HomeController 控制器,控制器完整代码如下:
package com.hxstrive;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@Controller
public class HomeController {
@RequestMapping("/")
public String home(Map<String,Object> map) {
map.put("title", "Spring 集成 FreeMarker");
map.put("date", new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss").format(new Date()));
return "index.ftl";
}
}(4)在 webapp 目录下面创建 views 目录,然后在 views 目录中创建 index.ftl FreeMarker 模版文件。模版文件内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spring 集成 FreeMarker</title>
</head>
<body>
<h1>${title?default('title')}</h1>
<p>${date?default('')}</p>
</body>
</html>(5)在 web.xml 文件中配置 Spring 过滤器,加载配置文件等。如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="https://java.sun.com/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee
https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 装载配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 启动时由spring监听 -->
<listener>
<!-- 用于从 RequestContextHolder 中获取Request对象 -->
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC核心控制器 -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 配置session过期时间 -->
<!-- filter、listener、servlet、servlet-mapping等元素要在session-config之前 -->
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
</web-app>(6)给项目添加 Spring 和依赖库的 Maven 依赖。pom.xml 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>freemarker_learn</artifactId>
<groupId>com.hxstrive</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo3</artifactId>
<packaging>war</packaging>
<properties>
<spring.version>4.3.20.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- FreeMarker 依赖 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>(7)使用tomcat运行项目,启动成功后在浏览器访问,如下图(其中 demo3为项目名):

实例完整代码见 demo3 子模块。