1. 程式人生 > >SpringBoot第十二篇:整合jsp

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。不瞭解的讀者可以閱讀上一章。



相關推薦

SpringBoot整合jsp

作者:追夢1819 原文:https://www.cnblogs.com/yanfei1819/p/10953600.html 版權宣告:本文為博主原創文章,轉載請附上博文連結! 引言   SpringBoot 雖然官方推薦使用 thymelaf 模板引擎,但是也支援jsp,只不過需要做一些修改。本文將講解

一起來學SpringBoot | 整合Swagger線上除錯

SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 隨著網際網路技

HTML基礎

項目 logs 瀏覽器 圖片 handle 標題欄 width light 標題 本篇內容 HTML概述 HTML常用基本標簽 CSS格式引入 一、 HTML概述 1.定義: HTML,超文本標記語言,寫給瀏覽器的語言,目前網絡上應用最廣泛的語言。HTML也在不斷

數據庫操作

mysq 查詢 alc mys clas 多對多 class 操作 連接查詢 一、數據庫簡紹 二、mysql 增刪改查 三、mysql 外鍵關聯 四、mysql 連接查詢 五、mysql 事務與索引 六、ORM 簡紹 七、sqlalchemy 常用語法 八、sqlalche

史上最簡單的SpringCloud教程 | 斷路器監控(Hystrix Dashboard)

詳細 pre 良好的 依次 alt ews 需要 ext 數據監控 最新Finchley版本,請訪問:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f12-dash/或者http://blog.csdn.net

隨手記一下javaBean的setter,getter方法的命名問題

今天測試新寫的一個系統表的完整Ibatis配置和呼叫,因為經驗少,到處撞牆、、、其他的坑爹問題就不提了       測試sqlMapClient.queryForList("...",param)這個方法,查詢正常有3條記錄,但是結果卻是[

SpringBoot | 給大家推薦8個SpringBoot精選專案

專案一: 支付服務   簡介:支付服務:支付寶、微信、銀聯詳細 程式碼案例,目前已經1800+Star。十分鐘讓你快速搭建一個支付服務,內附各種教程。 專案地址: https://gitee.com/52itstyle/spring-boot-pay &nbs

Spring Boot 基礎系列教程 | 使用Spring-data-jpa簡化資料訪問層(推薦)

推薦 Spring Boot/Cloud 視訊: Spring Boot中使用Spring-data-jpa讓資料訪問更簡單、更優雅 在上一篇Spring中使用JdbcTemplate訪問資料庫 中介紹了一種基本的資料訪問方式,結合構建RESTful API和

Spring Boot 基礎系列教程 | 整合MyBatis

推薦 Spring Boot/Cloud 視訊: 最近專案原因可能會繼續開始使用MyBatis,已經習慣於spring-data的風格,再回頭看xml的對映配置總覺得不是特別舒服,介面定義與對映離散在不同檔案中,使得閱讀起來並不是特別方便。 Spring中整合

卜若的程式碼筆記系列-Web系列-SpringBoot-Swagger的批註詳解-3212

1. @ApiOperation("swaggerTest") 用來描述當前的api的簡略資訊 我來解釋下為什麼會出現這麼多比如DELETE,GET,HEAED啥的請求,因為swagger預設將所有請求全部顯示出來,為了解決這種情況,我們其實可以將這個api單獨

一起來學SpringBoot | 強大的 actuator 服務監控與管理

SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 actuato

Spring Boot之使用Spring RestTemplate訪問Rest服務

RestTemplate是Spring3.0後開始提供的用於訪問 Rest 服務的輕量級客戶端,相較於傳統的HttpURLConnection、Apache HttpClient、OkHttp等框架,RestTemplate大大簡化了發起HTTP請求以及處理響應的過程。這篇文章主要介紹怎

【SSH三大框架】Hibernate基礎load()懶載入分析以及一對一、一對多、多對一、多對多懶載入的分析

一、懶載入的定義: 懶載入:在WEB應用程式中,經常會需要查詢資料庫,系統的響應速度在很大程度上是與資料庫互動的響應。因此,如果能夠優化與資料庫的互動速度,則能夠大大提高WEB應用的響應速度。 例如:當有一個Student類和一個Teacher類。當我們載入一個學生的所有資

R實戰 隨機數

由R生成的隨機數實際上偽隨機數,也就是說,隨機數是由某種演算法而不是真正的隨機過程產生的,隨機數生成器需要一個初始值來生成數字,該初始值叫做種子。通過把種子設定為特定的值,可以保證每次運行同一段程式碼時都能生成相同的隨機數。 R使用set.seed(n)函式來設定種子值,n是一個正整數,不同的種子會生成不同

SM2演算法數字證書原理

作者:無恙 完美的邏輯,簡直碉堡了。學習學習,,,尊重原創,熱愛大神。 通過一段時間的學習,我漸漸地可以將好幾篇不同的部落格聯絡起來,對照著看,領會到各篇文章之間的交叉與獨到之處。 ---------------------------------------------

【屌絲程式的口才逆襲演講稿50世界上最快的捷徑【張振華.Jack】

演講稿主題:《世界上最快的捷徑》                    --作者:張振華Jack 給大家講個故事。         有一天正好猴子和鸚鵡坐同一架飛機去旅行。猴子向空姐說:“請來一瓶礦泉

OpenCV學習帶透明通道影象合成(縮放,旋轉,和ROI)

第一步:獲取素材圖片 Mat src, dst; src = imread("F:/識圖/底圖.PNG", 1); dst = imread("logo", -1); 【ps:這裡需要注意的是透明度圖片獲取,後面的引數帶-1】 第二

Spring Cloud Learning | Docker部署Spring Cloud專案

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin

一起來學SpringBoot | actuator與spring-boot-admin 可以說的祕密

SpringBoot 是為了簡化 Spring 應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 一起來學Spr

一起來學SpringBoot | 輕鬆搞定資料驗證(一)

SpringBoot是為了簡化Spring應用的建立、執行、除錯、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規範,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 對於任何一個