简述:
项目中可能会遇到多个html,其中顶部头部或者资源文件引用都相同的情况等,为了简洁项目结构,净化页面,采用了本方案来解决,如下:
1. pom文件添加相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>general-manager</groupId>
<artifactId>general-manager-web</artifactId>
<version>1.0-SNAPSHOT</version>
<!--springboot 基本配置构建 start -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<!--spring boot-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--sitemesh模版装饰-->
<dependency>
<groupId>org.sitemesh</groupId>
<artifactId>sitemesh</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 热部署依赖 start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
<dependency><!---->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>
</dependencies>
<build>
<finalName>general-manager-web</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<executable>java</executable>
<arguments>
<argument>com.py.general.App</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 创建sitemesh目录存放sitemesh相关配置

DecoratorController
package com.py.general.web.sitemesh;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* Created by py
*/
@Controller
@RequestMapping(value = "/decorator")
public class DecoratorController {
private static final Logger logger = LoggerFactory.getLogger(DecoratorController.class);
@RequestMapping(value = "/index")
public ModelAndView index(ModelMap modelMap) {
return new ModelAndView("decorators/index");
}
}
WebConfig
package com.py.general.web.sitemesh;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* Created by py
*/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public FilterRegistrationBean siteMeshFilter() {
FilterRegistrationBean fitler = new FilterRegistrationBean();
WebSiteMeshFilter siteMeshFilter = new WebSiteMeshFilter();
fitler.setFilter(siteMeshFilter);
return fitler;
}
}
WebSiteMeshFilter
package com.py.general.web.sitemesh;
import org.sitemesh.builder.SiteMeshFilterBuilder;
import org.sitemesh.config.ConfigurableSiteMeshFilter;
/**
* Created by py
*/
public class WebSiteMeshFilter extends ConfigurableSiteMeshFilter {
public static final String DECORATOR_URL="/decorator/index";
/**
* decoratorPath 第一个参数配置被模板装饰的页面 第二个参数为模板页
* @param builder
*/
@Override
protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
builder.addDecoratorPath("/", DECORATOR_URL)
.addDecoratorPath("/test", DECORATOR_URL)
.addExcludedPath("/test1")//不需要装饰的路径
.addExcludedPath(DECORATOR_URL);
}
}
3. application.yml
server:
port: 8001
spring:
freemarker:
cache: false
settings:
template_update_delay: 0
4.页面文件处理,templates下创建修饰目录

footer.ftl
footer.............................................
header.ftl
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>通用管理平台|
</title>
<link rel="shortcut icon" href="/img/favicon.ico" />
<link href="/css/bootstrap.min.css" rel="stylesheet">
<#--根据自己模板所需要的木块添加 css 只需包含在head标签即可-->
<sitemesh:write property='head'/>
</head>
index.ftl
<html xmlns:th="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/html">
<#include "header.ftl">
<body id="test">
修饰页面主题内容
</br>
<sitemesh:write property='body'/>
<#include "footer.ftl">
</body>
</html>
test.ftl
<head>
<link href="/css/bootstrap.min.test.css" rel="stylesheet">
</head>
<body>
被修饰页面主体内容
</body>
testController.java
package com.py.general.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* Created by py on 2017/11/29.
*/
@Controller
public class TestController {
@RequestMapping(value = "/test")
public String test(){
return "test1";
}
}
运行结果:

