spring mvc + freemarker + sitemesh 案例

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>


web.xml 如下:

<!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 解析替换的)








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值