对于 SpringBoot中集成前端视图,一般不推荐集成。
SpringBoot中常用的模板引擎 thymeleaf 和 freemaker,默认情况下 freemaker 优先级比较高
本项目使用 SpringBoot 版本为2.5.2
<!--继承springboot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
需要在 src/main/resources/templates/ 目录中新建两个文件夹 freemarker 和 thymeleaf 分别用来存放对应的资源文件
同时在 src/main/ 目录下新增 webapp/WEB-INF/jsp 目录用于存放 jsp 资源文件
同时需要将该文件设置为资源文件 如下图
项目的目录结构如下
resources 目录下的 public / resources / static 用于存放资源文件 SpringBoot模块中,resources目录下各文件夹作用
1、项目依赖导入及配置
1.1、pom.xml 文件添加 thymeleaf 和 freemaker 和 jsp 以及其他依赖
<!--knife4j接口文档服务 只做集成时不需要添加-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.7</version>
</dependency>
<!--通常情况我们只需要引入 knife4j 的依赖即可,但是有时会出现 guava 的版本冲突,所以,可以把 guava 一起引入进来-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--添加jsp引擎,springboot内置的tomcat没有此依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--添加jstl坐标依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!--Freemarker 启动器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--Druid 数据源依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
<!-- springboot热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
1.2、定义jsp文件资源存放路径
<build>
<resources>
<resource>
<directory>src/main/webapp/WEB-INF/jsp/</directory>
<!--注意此次必须要放在此目录下才能被访问到 -->
<!--spring boot集成jsp编译jsp的路径是springboot规定好的路径META-INF/resources-->
<targetPath>/WEB-INF/jsp</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
<plugins>
<!--springboot打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
2、application 中增加相关配置并配置webconfig 增加jsp视图处理
application.yml
spring:
web:
resources:
static-locations: classpath:/resources/,classpath:/static/,classpath:/jsp/,classpath:/public/
profiles:
active: thymeleaf,freemarker,mvc,datasource # 激活对应环境
application-mvc.yml
spring:
mvc:
static-path-pattern: /**
view:
prefix: /WEB-INF/ # 指定mvc视图的前缀.
suffix: .jsp # 指定mvc视图的后缀
viewName: jsp/* # 该配置为自定义属性
order: 2
servlet:
path: / # 设定dispatcher servlet的监听路径,默认为: /
application-thymeleaf.yml
spring:
thymeleaf:
cache: false # 是否开启模板缓存,默认true
check-template-location: false # 是否检查模板路径是否存在,默认true
servlet:
content-type: text/html # 指定相应类型Content-Type,默认为: text/html
enabled: true # 是否允许MVC使用Thymeleaf,默认为: true
encoding: utf-8 # 指定模板的编码,默认为: UTF-8
mode: HTML5 # 指定视图模板的类型,具体查看StandardTemplateModeHandlers,默认为: HTML5
prefix: classpath:/templates/ # 指定模板的前缀,默认为:classpath:/templates/
suffix: .html # 指定模板的后缀,默认为:.html
check-template: false
template-resolver-order: 1 # 指定模板的解析顺序,默认为第一个.
excluded-view-names: jsp/* # 指定不使用模板的视图名称,多个以逗号分隔.
view-names: thymeleaf/* # 指定使用模板的视图名,多个以逗号分隔.
application-freemarker.yml
spring:
freemarker:
enabled: true # 是否允许mvc使用freemarker.
template-loader-path: classpath:/templates/ # 设定模板的加载路径,多个以逗号分隔,默认: ["classpath:/templates/"]
content-type: text/html # Content-Type value.
charset: UTF-8
suffix: .ftlh # 设定模板的后缀.
allow-request-override: false # 设置是否允许HttpServletRequest属性重写(隐藏)控制器生成的同名模型属性。
allow-session-override: false # 设置是否允许HttpSession属性重写(隐藏)控制器生成的同名模型属性。
cache: false # 启用模板缓存。
check-template-location: true # 是否检查templates路径是否存在
expose-request-attributes: false # 设置是否应在与模板合并之前将所有请求属性添加到模型中。
expose-session-attributes: false # 设置是否应在与模板合并之前将所有HttpSession属性添加到模型中。
expose-spring-macro-helpers: true # 设置是否公开名为“Spring macro RequestContext”的RequestContext供Spring的宏库使用.
prefer-file-system-access: true # 是否优先从文件系统加载template,以支持热加载,默认为true
view-names: freemarker/* # 指定使用模板的视图列表.
WebConfig.java
package com.jizhen.springbootstudy001.config;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
/**
* @program: com.jizhen.springbootstudy001.config.springbootstudy001
* @description:
* @author: jizhen
* @create: 2021-08-01 11:29
**/
@Data
@Configuration
@EnableWebMvc
@ComponentScan("com.jizhen.springbootstudy001.controller")//扫描控制器组件
public class WebConfig implements WebMvcConfigurer {
//日志
private static final Logger log = LoggerFactory.getLogger(WebConfig.class);
// jsp 视图前缀
@Value("${spring.mvc.view.prefix}")
private String prefix;
// jsp 视图后缀
@Value("${spring.mvc.view.suffix}")
private String suffix;
// jsp 视图的使用顺序
@Value("${spring.mvc.view.order}")
private int order;
// 重新配置静态资源目录
@Value("${spring.web.resources.static-locations}")
private String[] staticLocations;
// 重新配置静态资源模型路径
@Value("${spring.mvc.static-path-pattern}")
private String staticPathPattern;
// 使用jsp 视图的请求路径
@Value("${spring.mvc.view.viewName}")
private String[] viewName;
/**
* 注册jsp视图解析器
* @description: 以viewResolver命名。阻止ContentNegotiatingViewResolver注入I0C容器,可当做jsp视图解析器
* 为什么要阻止ContentNegotiatingViewResolver注入呢,因为这个视图解析器的默认order特别小,总放在集合最前面,它会选择最优视图解折器
* @return
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix(prefix);
resolver.setSuffix(suffix);
//当控制器返回的viewName符合规则时才使用这个视图解析器 如["jsp/*",""],是个数组(controller 返回的时候可以写成jsp/test)返回的真实视图名就是 prefix +"jsp/test.jsp"
resolver.setViewNames(viewName);
resolver.setOrder(order);//设置优先级,数值越小优先级越高
return resolver;
}
/**
* 配置静态文件映射
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置静态资源处理
registry.addResourceHandler(staticPathPattern)
.addResourceLocations(staticLocations);
}
}
3、编写 Controller 进行跳转测试
PageController.java
/**
* @program: com.jizhen.springbootstudy001.controller.springbootstudy001
* @description:
* @author: jizhen
* @create: 2021-07-21 03:19
**/
@Controller
@RequestMapping("goPage")
public class PageController {
@GetMapping("/page")
public String showPage(){
System.out.println("跳转到 thymeleaf 渲染的addUser.html 界面");
return "thymeleaf/user/addUser.html";
}
@GetMapping("/pageJsp")
public String showPageJsp(){
System.out.println("跳转到 jsp 渲染的 index.jsp 界面");
return "jsp/indexjsp";
}
@GetMapping("showUser")
public String showUser(Model model){
System.out.println("跳转到 freemarker 渲染的 index.jsp 界面");
return "freemarker/userList";
}
}
通过不同的响应路径跳转到不同模板的界面
4、创建对应的界面
其中编译完成后的class文件格式如下,请注意对照,如果编译后的路径不对,那么项目访问对应的界面是404
如果需要查看日志,那么配置 log4j.properties 文件
log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
5、访问测试
跳转到 jsp 界面
跳转到 template 界面
跳转到 freemarker 界面