SpringBoot第十二篇:整合jsp
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/10953600.html
版权声明:本文为博主原创文章,转载请附上博文链接!
引言
SpringBoot 虽然官方推荐使用 thymelaf 模板引擎,但是也支持jsp,只不过需要做一些修改。本文将讲解 JSP 在 SpringBoot 中的应用。
说句题外话,本章的话题,比较复杂,也写得比较累。因为 SpringBoot 并不推荐使用 JSP。据我的了解,SpringBoot 和 JSP 整合的项目少之又少。从而,网上这方面的资料比较少。已经存在的资源,内容基本上都是乱七八糟,或者是远离主题的一些东西。
本章在理解的基础上,做了一一求证,希望不会误导读者,浪费读者的时间。同时,有更加了解这一块的读者,欢迎联系作者一起交流交流。
版本信息
- JDK:1.8
- SpringBoot :2.1.4.RELEASE
- maven:3.3.9
- 外部Tomcat : 9.0
- IDEA:2019.1.1
使用内嵌Tomcat
创建项目,我们先看看项目的结构:

首先,引入 maven 依赖:
<!--对 web 的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--解析jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!--jstl标签-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>provided</scope>
</dependency>
注意,跟 jsp 相关的两个依赖将其设置为 <scope>provided</scope>。这里我们讲解一下 scope 的概念:
依赖范围就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:
- compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖;
- test: 测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要;
- provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器以及提供,就不需要Maven重复地引入一遍。
其次,需要在配置文件 application.properties 中配置SpringBoot 对 jsp 的支持,SpringBoot 默认不支持 jsp。
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
然后,创建测试接口:
@Controller
public class JSPController {
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String index(Model model){
model.addAttribute("name","SpringBoot");
return "index";
}
}
启动类不变:
@SpringBootApplication
public class JspDemoApplication {
public static void main(String[] args) {
SpringApplication.run(JspDemoApplication.class, args);
}
}
最后,需要注意的是,要运行的是 war,而不是 jar,因为 jar 默认不会将 jsp 复制进去。故,我们需要在 pom.xml 文件中,修改包的类型:
<packaging>jar</packaging> 修改为 <packaging>war</packaging> 。
启动时要注意,项目打包方式是war包,不要通过 main 方法启动。这里用的容器是SpringBoot 内嵌的Tomcat,可以进入 war 包的目录下,通过命令启动:java -jar xxx.war ,访问 http://localhost:8082/index,可以得到对应的页面。
外部容器
使用外部的 Tomcat 容器时,不能直接部署上面的 war 包,需要对以上程序进行改造。
1、修改启动类
集成 SpringBootServletInitializer ,并继承以下方法:
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}
外部容器是以类似于web.xml文件配置的方式来启动Spring应用上下文,并非 main 函数。以上的的改造类似在web.xml中配置负责初始化Spring应用上下文的监听器。
2、修改相关的依赖
项目部署在外部容器中,会与内嵌的 Tomcat 冲突,需要解决,不然启动会报错。本文列举两个解决方案:
1) 移出内嵌的 Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
并将解析 jsp 的 jar 包 scope 设置为 provided,即:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
2) 添加以下依赖(推荐)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
作者推荐这种解决方案,它同时适合命令行启动,以及部署到外部容器中。
总结
本文是分析 SpringBoot 中使用 JSP。JSP相对于模板引擎来说,性能更好。但是,尽管如此,作者并不推荐这种做法,而尽量使用模板引擎 Thymelaf。不了解的读者可以阅读上一章。
源码:我的GitHub

SpringBoot第十二篇:整合jsp的更多相关文章
- spring boot实战(第十二篇)整合RabbitMQ
前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...
- SpringBoot第二十二篇:应用监控之Actuator
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11226397.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 很多文章都 ...
- SpringBoot(十二)-- 整合Redis
1.pom依赖 <!-- 添加redis支持 --> <dependency> <groupId>org.springframework.boot</grou ...
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
- spring-boot-route(十二)整合redis做为缓存
redis简介 redis作为一种非关系型数据库,读写非常快,应用十分广泛,它采用key-value的形式存储数据,value常用的五大数据类型有string(字符串),list(链表),set(集合 ...
- 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...
- Spring Cloud第十二篇 | 消息总线Bus
本文是Spring Cloud专栏的第十二篇文章,了解前十一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring ...
- 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)
解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...
- 第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
随机推荐
- NET Excel转换为集合对象
1.仅适用于规则Excel:表头和数据一一对应 2.涉及到Excel转换为集合对象的部分代码,完整npoi帮助类点击查看 /// <summary> /// 默认把excel第一个shee ...
- css sprite responsive实现探究
在做web app前端设计时,为了减少http的请求,提高系统响应时间,有一个非常常见的优化措施是:将所有用到的静态的图片通过合并形成一个sprite.png,并且配合background-posit ...
- Java自学-I/O 控制台输入流System.in
Java 控制台输入流 System.in和Scanner System.out 是常用的在控制台输出数据的 System.in 可以从控制台输入数据 步骤 1 : System.in package ...
- 轻量级流程图控件GoJS示例连载(一):最小化
GoJS是一款功能强大,快速且轻量级的流程图控件,可帮助你在JavaScript 和 HTML5 Canvas程序中创建流程图,且极大地简化你的JavaScript / Canvas 程序. 慧都网小 ...
- ios-tableview加载卡顿的解决方案
参考文章:http://www.cocoachina.com/articles/11968 总结: 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法 ...
- poi操作Word创建超链接
项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...
- 8. [mmc subsystem] host(第二章)——sdhci
一.sdhci core说明 1.sdhci说明 具体参考<host(第一章)--概述> SDHC:Secure Digital(SD) Host Controller,是指一套sd ho ...
- [Linux] nginx的try_files指令实现隐藏index.php的重写
1.nginx的try_files指令 ,核心功能是替代rewrite,并且比rewrite更强大的是可以按顺序查找文件是否存在,如果文件都找不到才会执行最后的重定向解决的问题是,如果一个网站的部署是 ...
- Appium基础:appium相关API
1.获取信息类: 1.1 获取当前界面的组件: driver.currentActivity(); //获取当前界面的activity,可用于断言是否跳转到预期的activity 1.2 获取当前页面 ...
- Android Adapter中获得LayoutInflater
LayoutInflater li =(LayoutInflater)MyContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);