SpringBoot 中同时使用 thymeleaf 和 freemaker 和 jsp

对于 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 界面

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封神尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值