Spring Boot干貨系列:(五)開發Web應用JSP篇


Spring Boot干貨系列:(五)開發Web應用JSP篇

前言

上一篇介紹了Spring Boot中使用Thymeleaf模板引擎,今天來介紹一下如何使用SpringBoot官方不推薦的jsp,雖然難度有點大,但是玩起來還是蠻有意思的。

正文

先來看看整體的框架結構,跟前面介紹Thymeleaf的時候差不多,只是多了webapp這個用來存放jsp的目錄,靜態資源還是放在resources的static下面。

引入依賴

使用內嵌的tomcat容器來運行的話只要這3個就好了。這里介紹下maven中scope依賴范圍的概念,因為后續涉及到這個會有問題。

依賴范圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關系,Maven有如下幾種依賴范圍:

  • compile:編譯依賴范圍。如果沒有指定,就會默認使用該依賴范圍。使用此依賴范圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。典型的例子是spring-code,在編譯、測試和運行的時候都需要使用該依賴。

  • test: 測試依賴范圍。使用次依賴范圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將無法使用此依賴。典型的例子是Jnuit,它只有在編譯測試代碼及運行測試的時候才需要。

  • provided:已提供依賴范圍。使用此依賴范圍的Maven依賴,對於編譯和測試classpath有效,但在運行時候無效。典型的例子是servlet-api,編譯和測試項目的時候需要該依賴,但在運行項目的時候,由於容器以及提供,就不需要Maven重復地引入一遍。

application.properties配置

要支持jsp,需要在application.properties中配置返回文件的路徑以及類型

這里指定了返回文件類型為jsp,路徑是在/WEB-INF/jsp/下面。

控制類

上面步驟有了,這里就開始寫控制類,直接上簡單的代碼,跟正常的springMVC沒啥區別:

jsp頁面編寫

啟動類

啟動類不變還是最簡單的

內嵌Tomcat容器運行項目

基本配置好了就可以啟動項目,通過http://localhost:8080/learn 訪問,我使用的SpringBoot是1.5.2版本,jdk1.8,以前介紹過,運行項目有三種方式,這里我都做過了一次測試,發現在maven中jasper依賴有加provided和注釋掉該依賴范圍運行的效果不大一樣,具體對比如下:

有添加provided的情況:

  • 右鍵運行啟動類,訪問頁面報404錯誤

  • 使用spring-boot:run運行正常

  • 打包成jar,通過 java -jar demo-0.0.1-SNAPSHOT.jar 運行報錯

  • 打包成war,通過 java -jar demo-0.0.1-SNAPSHOT.war 運行正常

把provided 注釋掉的情況:

  • 右鍵運行啟動類,訪問頁面正常

  • spring-boot:run運行 訪問頁面正常

  • 打包成jar,通過 java -jar demo-0.0.1-SNAPSHOT.jar 運行報錯

  • 打包成war,通過 java -jar demo-0.0.1-SNAPSHOT.war 運行正常

我測試了好幾次都是這樣,就是有加provided的時候,右鍵運行啟動類訪問頁面的時候,提示404錯誤。

其他3種情況都一樣, jar運行也報404,spring-boot:run以及war運行都可以。

為什么jar包運行不行呢,我們打開打包的jar和war分別看看區別,如下2圖所示:

從上面可以看出來,jar包運行的時候會404錯誤,因為默認jsp不會被拷貝進來,而war包里面有包含了jsp,所以沒問題。

內嵌Tomcat屬性配置

關於Tomcat的偶有屬性都在org.springframework.boot.autoconfigure.web.ServerProperties配置類中做了定義,我們只需在application.properties配置屬性做配置即可。通用的Servlet容器配置都已”server”左右前綴,而Tomcat特有配置都以”server.tomcat”作為前綴。下面舉一些常用的例子。

配置Servlet容器:

配置Tomcat:

更為詳細的Servlet容器配置以及Tomcat配置,可以前往博主之前文章查看:Spring Boot干貨系列:常用屬性匯總

外部的Tomcat服務器部署war包

Spring Boot項目需要部署在外部容器中的時候,Spring Boot導出的war包如果直接在Tomcat的部署會報錯,不信你可以試試看。

需要做到下面兩點修改才可以:

  • 繼承SpringBootServletInitializer

    外部容器部署的話,就不能依賴於Application的main函數了,而是要以類似於web.xml文件配置的方式來啟動Spring應用上下文,此時我們需要在啟動類中繼承SpringBootServletInitializer並實現configure方法:

這個類的作用與在web.xml中配置負責初始化Spring應用上下文的監聽器作用類似,只不過在這里不需要編寫額外的XML文件了。

  • pom.xml修改tomcat相關的配置

    如果要將最終的打包形式改為war的話,還需要對pom.xml文件進行修改,因為spring-boot-starter-web中包含內嵌的tomcat容器,所以直接部署在外部容器會沖突報錯。這里有兩種方法可以解決,如下

    方法一:

在這里需要移除對嵌入式Tomcat的依賴,這樣打出的war包中,在lib目錄下才不會包含Tomcat相關的jar包,否則將會出現啟動錯誤。

還有一個很關鍵的關鍵點,就是tomcat-embed-jasper中scope必須是provided。

因為SpringBootServletInitializer需要依賴 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有這個javax.servlet,如果沒用provided,最終打好的war里面會有servlet-api這個jar,這樣就會跟tomcat本身的沖突了。這個關鍵點同樣適應於下面說的第二種方法。

方法二:

直接添加如下配置即可:

provided的作用上面已經介紹的很透徹了,這里就不啰嗦了,這種方式的好處是,打包的war包同時適合java -jar命令啟動以及部署到外部容器中。

如果你不喜歡默認的打包名稱,你可以通過節點里添加內容。

最后啟動tomcat輸入http://localhost:8080/springBootJsp/learn 查看效果,還是美美噠

關於使用jar部署

上面已經測試過了,正常情況下包含jsp的頁面是無法用jar的運行的,因為jsp默認是在webapp目錄下,可是打包成jar是沒有webapp這個目錄結構的。

雖然網上有介紹說通過pom.xml配置,把WEB-INF目錄復制到META-INF/resources下面。但是博主試了一整天還是訪問不了,最后放棄了。各位如何有興趣可以繼續嘗試,畢竟war也可以通過java -jar命令來啟動的不是么。

總結

我相信全網都找不到一篇有我這篇這么詳細的介紹Spring Boot使用jsp的文章。有很多人問我,為什么我的很多文章這么簡單易懂,我每次都是哭着回復他們四個字:主題閱讀,天知道我參考了多少篇網上的文章,外加多少本相關書籍中關於這個章節的內容,反復對比提煉,最后才產出對應的博文。說真的,我很羡慕你們在這個信息爆炸的時代,剛好看到一篇自己要學習的技術的好文章,少走多少彎路。

說了這么多煽情的話,哪位大兄弟帶一波節奏啊,好久沒收到打賞了d=====( ̄▽ ̄*)b

源碼下載

( ̄︶ ̄)↗[相關示例完整代碼]

https://github.com/tengj/SpringBootDemo/tree/master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM