pom 文件
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<!-- springMvc & spring jar start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<!-- springMvc & spring jar end-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<!-- sitemesh start-->
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
<!-- sitemesh end-->
spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.leo.controller"></context:component-scan>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
<property name="order" value="1" />
</bean>
<!--===================== view resovler start===================== -->
<bean id="freemarkerResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="order" value="0" />
<property name="viewNames">
<array>
<value>*.ftl</value>
</array>
</property>
<property name="requestContextAttribute" value="request" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="allowSessionOverride" value="true" />
<property name="contentType" value="text/html;charset=utf-8" />
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
</bean>
<!--===================== view resovler end===================== -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 配置freeMarker模板加载地址 && freeMarker属性配置 start-->
<!-- 模版加载ftl文件路径 -->
<property name="templateLoaderPaths">
<list>
<value>/WEB-INF/views/</value>
<value>/</value>
</list>
</property>
<property name="configLocation" value="classpath:conf/freemarker.properties" />
<!-- 这里添加了几个页面可使用的全局变量 -->
<property name="freemarkerVariables">
<map>
<entry key="base" value="@{base}" />
<entry key="bofPath" value="@{bof.path}" />
<entry key="ifsPath" value="@{ifs.path}" />
</map>
</property>
<property name="defaultEncoding" value="utf-8" />
</bean>
<!-- 配置freeMarker模板加载地址 end-->
<!-- ==================== view resolver end ==================== -->
<!-- 容器加载properties 文件 start -->
<bean id="webPropertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/application.properties</value>
<value>/WEB-INF/application-vary.properties</value>
<value>/WEB-INF/application-env.properties</value>
</list>
</property>
<!-- 内存中的properties ,获取方式 默认是${} ,这里配置的是@{} -->
<property name="placeholderPrefix" value="@{" />
<!-- ## PropertyPlaceholderConfigurer类的systemPropertiesModeName的属性是 SYSTEM_PROPERTIES_MODE_OVERRIDE
这意味着可以从jvm虚拟机的参数中获得配置信息。 -->
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
<!-- 容器加载properties 文件 end -->
</beans>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:kafka-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>classpath:spring.xml</param-value> -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--sitemesh start-->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!--sitemesh end-->
<!-- freemarker 配置-->
<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>utf-8</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>
common-heard.ftl (装饰页面)
<!DOCTYPE html>
<html>
<head>
这是头部
${head}
</head>
<body>
<br />
hello world !! <br />
${body}
</body>
</html>
hello1.ftl (被装饰页面)
<!DOCTYPE html>
<html>
<head>
<title>222</title>
我是被装饰页面的head
</head>
<body>
我是被装饰页面的body
</body>
</html>
decorator.xml (装饰配置xml文件)
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/freemarker/decorators">
<decorator name="commonHeard" page="common-heard.ftl">
<pattern>/*.do</pattern>
</decorator>
<!-- <excludes>
<pattern>/index.jsp*</pattern>
<pattern>/login/*</pattern>
</excludes> -->
</decorators>
过滤请求路径,使用装饰器去配置
controller
package com.leo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping("/freeMark")
public ModelAndView hello1(ModelAndView mav){
mav.setViewName("hello1.ftl");
return mav ;
}
@RequestMapping("/jspTest")
public ModelAndView jspTest(ModelAndView mav){
mav.setViewName("hello2.jsp");
return mav ;
}
}
页面展示结果:
这是头部 我是被装饰页面的head
hello world !!
我是被装饰页面的body
总结: 该装饰器就是将被装饰页面的title 、head 、body 、 通过freemarker 解析,然后提取出来,放在装饰模版中(装饰页面中的${head}和${body}就是使用freemark 解析替换的)