SpringBoot多模板引擎整合难题?一篇搞定JSP、Freemarker与Thymeleaf!

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南 • 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。GET /items/{id} 详情。,前端同学无需等 Mock 即可联调。 阅读详情

01 引言

在现代Web应用开发中,模板引擎是实现前后端分离和视图渲染的重要工具。SpringBoot作为流行的Java开发框架,天然支持多种模板引擎。

每一个项目使用单一的模板引擎是标准输出。但是,总有一些老项目经历多轮迭代,人员更替,不同的开发都只是用自己熟悉的模版引擎,导致一个项目中包含了多种模板引擎。从而相互影响,甚至出现异常。这也是小编正在经历的痛苦。

本文将详细介绍如何在SpringBoot项目中同时集成JSP、Freemarker和Thymeleaf三种模板引擎,包括配置方法、使用场景、常见问题及解决方案。

02 项目搭建

本文基于Springboot 3.0.13,因为不同版本(2.x)对于部分包的做了更改。由于JSP的配置会影响其他的模板引擎,所以JSP的配置,放到最后说明。

2.1 Maven依赖

<!-- freemarker 模版引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- thymeleaf 模版引擎 -->
<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>

2.3 配置

#配置freemarker
spring.freemarker.template-loader-path=classpath:/templates/ftl/
spring.freemarker.suffix=.ftl
spring.freemarker.cache=false

# 配置thymeleaf
spring.thymeleaf.prefix=classpath:/templates/html/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false

2.4 最佳实践

页面

控制层

@Controller
@RequestMapping("/page")
public class PageController {
    
    @RequestMapping("{engine}")
    public String toPage(@PathVariable("engine") String engine, Model model) {
        model.addAttribute("date", new Date());
        return engine + "_index";
    }
}

2.5 测试

到这里,会发现一切顺利。Thymeleaf和Freemarker都可以顺利解析。但是,引入JSP之后,发现不能生效。

03 SpringBoot继续集成JSP

3.1 Maven依赖

<!-- JSP支持 -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- jstl 工具 -->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>

这里要说明的jstl,低版本(3.x一下)的需要引入:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

具体的依赖可以在Springboot官方文档中查看。

3.2 配置

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

3.3 创建包结构

因为SpringBoot默认不支持JSP,所以需要我们自己配置支持JSP。

包的路径地址:\src\main\webapp\WEB-INF

3.4 修改pom打包

在build下增加resource

<resources>
    <!-- 打包时将jsp文件拷贝到META-INF目录下-->
    <resource>
        <!-- 指定处理哪个目录下的资源文件 -->
        <directory>src/main/webapp</directory>
        <!--注意此次必须要放在此目录下才能被访问到-->
        <targetPath>META-INF/resources</targetPath>
        <includes>
            <include>**/**</include>
        </includes>
    </resource>
</resources>

3.5 测试

其他两个不受影响,但是发现配置的JSP并不生效,根据报错信息来看,默认使用了Thymeleaf解析的。

04 源码追踪

关键的类:org.springframework.web.servlet.view.ContentNegotiatingViewResolver

断点调试发现,图中①根据jsp_index视图,可以发现两个候选的View:ThymelearView和JstlView。

图中②获取最优的视图返回了ThymelearView,从而解析错误。从getBestView()源码可以看到,仅仅做了遍历操作,并没有个给句特殊的规则去取。如图:

所以影响视图解析器的就是候选视图的顺序。

我们继续看候选视图的取值:

这里仍是只是遍历,我们需要继续追溯this.viewResolvers的来源:

关键代码AnnotationAwareOrderComparator.sort(this.viewResolvers)会对所有的视图排序,所以我们只需要指定JSP的视图为第一个就可以了。

05 配置JSP视图的顺序

因为JSP的视图使用的是InternalResourceViewResolver,所以我们只需要设置其顺序即可。

@Configuration
public class BeanConfig {

    @Autowired
    InternalResourceViewResolver resolver;

    @PostConstruct
    public void init() {
        resolver.setOrder(1);
    }

由于其他的视图解析器默认是最级别,所以这里的设置只要比Integr.MAX小即可。

测试

我们发现源代码已经将JstlView变成了第一个,最优的视图自然也选择了JstlView,如图:

效果

我们发现JSP是正常显示了,但是其他两个又不好了。

真实让人头大!

06 解决JSP混合问题

6.1 解决方案

其实这里要使用一个属性可以永久的解决问题:viewName,

每一个ViewResolver都有一段关键的源码:

image-20250925165142273

这里是匹配关系,可以通过配置的view-names过滤不符合条件的视图:

6.2 重新修改配置

###配置freemarker
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.view-names=ftl/*
spring.freemarker.suffix=.ftl
spring.freemarker.cache=false
#
### 配置thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.view-names=html/*
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
##
### 配置JSP
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

这里的和之前不同的就是增加了spring.thymeleaf.view-names、spring.freemarker.view-names,并且classpath的路径少了一部分移动到view-names里面了。

JSP的spring.mvc.view.prefix同样少了一部分需要配置。

6.3 重新修改Java配置

@Configuration
public class BeanConfig {

    @Autowired
    InternalResourceViewResolver resolver;

    @PostConstruct
    public void init() {
        resolver.setViewNames("jsp/*");
    }

也可以使用Bean定义。使用Bean定义需要删除配置文件关于JSP的配置。

@Bean
public ViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/");
    resolver.setSuffix(".jsp");
    resolver.setViewNames("jsp/*");
    return resolver;
}

6.4 修改控制层

@Controller
@RequestMapping("/page")
public class PageController {
 
    @RequestMapping("{engine}")
    public String toFtl(@PathVariable("engine") String engine, Model model) {
        model.addAttribute("date", new Date());
        return engine + "/" + engine + "_index";
    }
}

6.5 效果

uni-app - 手机端实现用户长按文本提示选取复制功能 手机端实现用户长按文本提示选取复制功能 需求:用户手指长按文本区域,弹出手机系统复制功能。 有时,安卓或苹果用户会有复制文本的需求,但是uni-app编译后组件是无法长按选取复制的。 实现 最简单的方式,就是将<text>标签selectable属性设置为true,演示如下: <textselectable="true">这是一个可以长按选择文本,弹出复制的text标签</tex... 阅读详情

相关推荐

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

springBoot(3)---整合jsp

本章介绍springBoot整合jsp,springBoot的视图层不推荐使用jsp,一般使用freemarker或thymeleaf 第一步、我们会发现新建的项目中没有webapp,没有WEB-INF,也没有web.xml等,如下图: 第二步、在src/main下新建webapp文件夹(注意webapp和resources、java是同级目录) 然后在webapp下新建WEB-IN...

猿累人生 542

【编译原理】LL(1)分析方法 生成语法树(c++实现)

基本流程 输入文法->消除左递归->提取左公共因子->求FIRST集->求FOLLOW集->LL(1)分析表->表驱动的预测语法分析过程->输出语法分析结果和语法树

qq_43417265的博客 1万+

Springboot整合JSP-修订版本(Springboot3.1.6+IDEA2022版本)

springboot整合JSP使用JSP模板引擎

雾林小妖的博客 2009

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 159

SARScape实战:集成GACOS数据优化InSAR大气校正全流程

本文详细介绍了如何在SARScape软件中集成GACOS数据,以优化InSAR大气校正的全流程。通过实战步骤,从GACOS数据申请、下载、导入,到在单景干涉图和SBAS-InSAR流程中应用,有效剥离大气相位延迟,显著提升形变监测结果的精度与可靠性,实现从“雾里看花”到“拨云见日”的转变。

weixin_28419039的博客 402

SpringBoot.03.SpringBoot集成jsp

SpringBoot.03.SpringBoot集成jsp前言准备工作jsp集成案例集成步骤1.新建Module2.pom.xml3.Springboot03JspApplication.java4.application.yml5.index.jsp6.JspController.java7.测试问题分析解决方案1.springboot:run2.设置Working directory修改jsp无须重启应用 前言 在SpringBoot中默认推荐使用的模板引擎是Thymeleaf,但是作为传统Web开发的

潮汐先生的专栏 575

Linux系统安装AutoDockTools、AutoGrid和AutoDock并实现分子对接(详细讲解)

linux系统为centos7.0 按照下面操作安装AutoDockTools(MGLTools) 1. 下载安装包,链接(https://ccsb.scripps.edu/mgltools/downloads/),我的linux系统是64位,下载红色标记源代码,拷贝入linux目标文件夹下。 2. shell终端进行安装: 1. 终端进入安装包所在文件夹,并获取root权限;赋予代码安装权限; cd /home/... #目标文件夹,根据目标程序文件位置进行更改 su #获

carlos_zhao的博客 1万+

Spring Boot -03 整合 JSP

Spring Boot -03 整合 JSP 原文链接:https://blog.youkuaiyun.com/qq_40147863/article/details/84197797 上面已经完成了 Spring Boot 项目的简单搭建,我们仅仅需要进行一些简单的设置,写一个 HelloController 就能够直接运行了,不要太简单…接下来我们再深入了解一下 Spring Boot 的使用。 Spring Boot 加入 JSP 支持 Spring Boot 的默认视图支持是 Thymeleaf 模板引擎,.

qq_41781775的博客 658

基于 Simulink 的单相 PWM 整流器(四象限变流器)在高铁辅助电源系统中的建模与仿真实战教程

这是一份基于 Simulink 的实战教程。在高铁牵引供电与辅助电源系统中,单相 PWM 整流器(又称四象限变流器,4QC)是极其核心的“绿色电源”枢纽。传统的二极管整流器虽然结构简单,但会导致严重的输入电流畸变和低功率因数,对电网造成极大的谐波污染。而 PWM 整流器通过高频主动控制,不仅能将单相交流电转换为平稳的直流电,还能实现输入电流正弦化、单位功率因数(PF=1)运行,并支持能量双向流动(如列车再生制动时的能量回馈)。本教程将带你从数学模型出发,搭建一套高性能的电压电流双闭环控制系统。

amy_mhd的博客 47

Android 12,通过JNI写framebuff实现白板书写加速

Android 书写加速

448313096@qq.com 1204

springboot整合JSP(详细配置过程+配图和说明)

springboot整合jsp使用jsp模板引擎

雾林小妖的博客 1万+

基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真

本文完成了基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真,实现了:✅ 构建了四轮独立驱动+主动悬架高保真整车模型✅ 实现了Skyhook主动悬架控制✅ 设计了驱动-悬架状态共享与协同决策机制✅ 验证了5 m/s高速下连续颠簸路面稳定通过能力✅ 为高性能移动机器人提供一体化底盘解决方案。

xiaoheshang_123的博客 190

SpringBoot项目中如何使用Jsp

SpringBoot项目中如何使用Jsp!!

weixin_53168000的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring Boot解决jsp中jstl标签无法使用问题

需求:在测试Spring MVC的时候使用到了JSP,这个时候报错如下: 解决方法: 加入以下依赖: <!--JSP依赖--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactI...

weixin_43404791的博客 1660

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot03 JSP基本原理与使用

1.介绍 JSP 本质上就是⼀个 Servlet,JSP 主要负责与⽤户交互,将最终的界⾯呈现给⽤户, HTML+JS+CSS+Java 的混合⽂件。 当服务器接收到⼀个后缀是 jsp 的请求时,将该请求交给 JSP 引擎去处理,每⼀个 JSP ⻚⾯第⼀次被访 问的时候,JSP 引擎会将它翻译成⼀个 Servlet ⽂件,再由 Web 容器调⽤ Servlet 完成响应。 单纯从开发的⻆度看,JSP 就是在 HTML 中嵌⼊ Java 程序。 2. 案例 下面是一个基本的演示,需要User类,包含以下几种方

Big_Study_Father的博客 364

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

spring boot 整合 jsp,如何整合spring boot工程、启动spring boot,整合JSP(三)

spring 、spring boot、idea、spring、spring boot整合jsp、JSP

zhangfuping123456789的博客 687

三 SpringBoot整合jsp

一 pom.xml文件 &lt;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.o...

fangguozi的专栏 176

Spring Boot 项目中使用 JSP

在 Spring Boot 项目中不是不可以使用 JSP。想在 Spring Boot 中使用 JSP,需要满足一些特殊要求。如果像其他项目一样,直接在 IDEA 中通过 main 方法来启动项目,在访问测试的时候会出现。这是因为 Spring Boot JSP 项目需要额外进行一个设置:选择。step 2:排除内嵌的 Tomcat 依赖,避免 jar 包冲突。图标,通过点击它在弹出的窗口中可直接手动执行 maven 命令。补充:IDEA 的 Maven 工具窗口中,有个。,因此,后者不再需要单独配置;

xiaotu的博客 3014

springboot教程3——模板引擎jsp

  1 将使用JSP作为模板引擎的Maven依赖导入进来 &lt;dependency&gt; &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt; &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt; &lt;scope&gt;provided&lt;/scope&gt

dahaiaaaqe的博客 458

终于学会了,SpringBoot整合JSP,建议收藏不然找不到了

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-PnJzhQtD-1712755613652)]一个人可以走的很快,但一群人才能走的更远。

2301_79098332的博客 551

FreeMarker与Thymeleay详解

Thymeleaf模板引擎简介 Thymeleaf是网站或者独立应用程序的新式的服务端java模板引擎,可以执行HTML,XML, JavaScript,CSS甚至纯文本模板。 Thymeleaf的主要目标是提供一个以优雅的高可维护型的方式创建模板,为了达到这个目的,他建立了 自然模板的概念,以一种不影响模板设计原型的方式将逻辑注入到模板文件中,可以显著的减少设计和 开发之间的沟通成本。 用Thymeleaf编写的HTML模板在外观和功能上仍然类似于HTML,从而使应用程序中运行的实际模板可 以用作有用的

weixin_43477950的博客 1746

Spring Boot -03- Spring Boot 整合 JSP

Spring Boot -03- Spring Boot 加入 JSP 支持 上面已经完成了 Spring Boot 项目的简单搭建,我们仅仅需要进行一些简单的设置,写一个 HelloController 就能够直接运行了,不要太简单…接下来我们再深入了解一下 Spring Boot 的使用。 Spring Boot 加入 JSP 支持 Spring Boot 的默认视图支持是 Thymeleaf...

肖朋伟 1万+

Spring Boot简单应用集成jsp-3

一.Spring Boot集成jsp页面 1.指定存放web资源目录 集成jsp页面需要在src/main下创建webapp目录以存放jsp文件,须在Project Structor中指定该目录为资源目录 二.添加物理视图依赖 1.引入jasper依赖 <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId.

Mr.ZY的专栏 311

SpringBoot项目中使用JSP

1、SpringBoot虽然支持JSP,但是官方不建议使用 在《Spring官方文档》中对于JSP的支持有这么一段描述: 使用翻译软件上述内容: JSP局限性 当运行使用嵌入式servlet容器(并打包为可执行档案)的Spring Boot应用程序时,JSP支持存在一些限制。 对于Jetty和Tomcat,如果使用war包装,它应该可以工作。 与java -jar一起启动时,可执行...

pan_junbiao的博客 1万+

SpringBoot 整合 JSP、Thymeleaf 、Freemarker 详细步骤

更早版本是实现 WebMvcConfigurerAdapter 类,但是现在已经过期,推荐使用接口,缺少那部分功能就添加对应功能即可。MvcConfig} }在这里自定义两个组件,一个是视图解析器组件,一个是静态资源解析组件。注解默认是没有打开静态资源解析,需手动开启,通过 addResourceHandlers() 方法添加需解析的静态资源。其中/**表示访问静态资源时,不限制访问层级目录。

龚小帅的博客 1532
上一篇: 弃用html2canvas!震惊,新一代截图神器snapdom要快800倍
下一篇: GitHub 标星 370k!免费编程资源大合集,从此自学不花一分钱
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

智_永无止境

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

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

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

打赏作者

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

抵扣说明:

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

余额充值