本章节介绍怎样将 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 子模块。