1. 環境
開發環境:idea2019.3
jkd版本:1.8
springboot版本:2.6.2
2. 引入JSP的步驟
2.1 新建工程,引入依賴
這里只是解析jsp,因此只需要引入springboot內嵌的tomcat對jsp的解析包
<!-- 引入依賴:springboot內嵌的tomcat對jsp的解析包-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
這里引入依賴,網上很多教程,培訓教材中,引入過多依賴,其實是多余的。僅僅訪問jsp,只需要引入內嵌tomcat對jsp的解析包即可。
如果jsp中使用了jstl,則需要引入jstl的包;這里並不需要。
如果使用了servlet相關api,則引入servlet-api,這里並不需要
2.2 建立webapp資源目錄

這時,如果在webapp目錄下右鍵新建jsp,發現在新建菜單中,沒有jsp選項,解決方法如2.3
2.3 將webapp設置為web資源存放目錄
打開項目結構(project structure),選擇module,選擇該moule的web項,添加資源目錄。

這時,webapp目錄編程帶有綠色小點的圖標。如下圖所示:

2.3 創建jsp頁面
這里新建一個簡單的index.jsp文件,內容如下所示:
<%--
Created by IntelliJ IDEA.
User: Think
Date: 2022/1/7
Time: 12:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
這是springboot應用中引入的第一個jsp
</body>
</html>
2.4 訪問jsp
運行springboot應用,瀏覽器訪問index.jsp,發現無法訪問
2.5 訪問不到jsp的原因及問題解決
2.5.1 原因分析
分析springboot工程的target目錄,沒有發現jsp相關的資源,說明webapp下的web資源沒有編譯到target下的輸出目錄,因此訪問不到。
另外一種情況也值得注意,在調試時候通過設置,即使web資源沒有被打包輸出到target目錄,但是也可以訪問。這是下面的第一種情況。但是在部署上線時,仍然需要手動配置將web資源輸出到target目錄。
2.5.2 問題解決
通過實驗,有兩種解決方法,可能有標准的解決方法,這里將找到的兩種可行的方法總結如下:
方法1:設置工作目錄
點擊Edit Configuation,設置工作目錄,如下圖所示:

設置工作目錄為 $MODULE_WORKING_DIR$(或者$MODULE_DIR$, idea2019.3中默認沒有這個目錄,可以用戶輸入$MODULE_DIR$和$MODULE_WORKING_DIR$效果相同)

方法2:配置web資源編譯后的輸出目錄
在pom文件的
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<!-- 下面的目錄可以自己設置 -->
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<!-- **匹配任意目錄,*匹配任意字符 -->
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
3. 總結
Q&A
問:pom中的路徑/代表什么,src/main/java代表什么
答:對於maven工程,pom文件位於module的根目錄,因此/代表的是module的根目錄,src/main/java則代表模塊下的src/main/java目錄
問:application.properties中的/代表什么,spring.mvc.view.prefix=/中的/代表什么
答:
application.properties是src/main/resource中的配置文件,在springboot的maven工程中,src/main/java、src/main/resources,以及用戶自己添加的src/main/webapp資源目錄中的內容,在編譯后都會被部署到target/classes下,因此/有如下對應關系:
/代表了target/classes目錄,由於src/main/java、src/main/resource、src/main/webapp中內容編譯后會輸出到target/classes,因此/也代表了這些目錄。
開發人員更關注的是src/main中的內容,因此,對於在application.properties中的/,記住下面的映射關系
/ 對應於 src/main/java
src/main/resources
src/main/webapp
當然,你也可以使用方法2中在pom中添加配置,修改src下的目錄和target下目錄的默認映射關系。
