1. 模板引擎JSP的限制
在開始之前呢,我覺得我們有必要先去了解下 Spring Boot 2.0 官方文檔中提到的如下內容:
模板引擎
除了REST Web服務之外,還可以使用Spring MVC來服務動態HTML內容。Spring MVC支持多種模板技術,包括Thymeleaf,FreeMarker,和JSPs。此外,許多其他模板引擎包括它們自己的Spring MVC集成。
Spring Boot 包括以下模板引擎的自動配置支持:
如果可能的話,JSPs應該是可以避免的。因為使用嵌入servlet容器時,有幾個已知的限制。
當您使用默認配置的這些模板引擎時,您的模板會自動從 src/main/resources/templates 中提取。
根據您運行應用程序的方式,IntelliJ IDEA以不同的方式排序 classpath。 使用主方法在IDE中運行應用程序會導致與使用Maven或Gradle或從其打包的jar運行應用程序時不同的順序。 這可能會導致Spring Boot無法在classpath中找到模板。 如果您遇到此問題,可以在IDE中重新排序類路徑,以便首先放置模塊的類和資源。
或者,您可以配置模板前綴以搜索類路徑中的每個模板目錄,如下所示:classpath *:/ templates /。
那么由哪些限制呢?
JSP限制
當運行使用嵌入的servlet容器的Spring Boot應用程序(並打包為可執行文件)時,JSP支持中存在一些限制。
- 有了Tomcat,如果你使用war包裝,它應該可以工作。 也就是說,一個可執行的war工作,也可以部署到一個標准的容器(不限於,但包括Tomcat)。 由於Tomcat中的硬編碼文件模式,可執行jar無法使用。
- 使用Jetty,如果您使用war包裝,它應該可以工作。 也就是說,一個可執行的jar有效,並且也可以部署到任何標准容器。
- Undertow不支持JSP。
- 創建自定義error.jsp頁面不會覆蓋錯誤處理的默認視圖。 應該使用自定義錯誤頁面。
有一個JSP示例,以便您可以看到如何設置。
其實剛開始我有些不太理解官網上面這段話的意思,直到后來我才漸漸理解。
學習Spring Boot 2.0 這么多天,感覺有了更深刻的認識和理解,這里分享下:
Spring Boot 2.0 由於微服務的興起而被廣為人知,當我們在做微服務開發一般需要提供接口返回JSON,在Spring 4.0 以前需要@ResponseBody + @Controller合在一起使用,而在Spring 4.0 之后只需要使用@RestController 即可達到相同的效果。
1. Spring Boot 2.0 更是很友好地吸收了Spring 4.0 開始出現的@RestController.
記憶: @RestController注解相當於@ResponseBody + @Controller合在一起的作用
2. 值得注意的是,當我們使用Spring Boot 2.0 想要返回頁面而不是提供json或者xml數據接口的時候,切記不能再使用@RestController了,只能使用@Controller.
3. Spring Boot 2.0 對返回頁面 支持FreeMarker,Groovy,Thymeleaf,Muslache 多種模板技術,但是Spring Boot 2.0 缺憾是 由於默認使用內嵌的Tomcat容器,對於JSPs 這種模板技術支持不是很友好,所以我們其實完全可以使用其他的模板引擎技術,避免使用Jsps 模板和使用JSTL標簽庫
4. Spring Boot 2.0 封裝了很多強大的模塊和默認的XML配置,大大降低了開發難度。
5. Spring Boot 2.0 不僅 支持Spring MVC (基於Servlet API ),支持Spring WebFlux (基於Reactive Streams API),而且也友好支持redies,mongodb 等No-SQL 數據庫 集成以及消息處理中間件等。
6. Spring Boot 2.0 不止支持Spring Cloud 分布式服務框架集成(Spring 全家桶之一),也支持阿里巴巴 開源的 Dubbo 分布式服務框架集成。
2. 開始實戰
盡管官網文檔中提到使用JSP有一些限制,但是往往我們還是比較習慣想用下JSP,那么如何操作呢?且跟我一步一步來操作。
- 開發工具:Intellij Idea
- JDK 版本:9.0.1
- Maven 版本:3.5.2
2.1 創建一個項目
2.2 選擇Spring Initizlizr 幫助我們快速創建Spring Boot 應用
2.3 填寫如下項目配置信息
Tips: 注意這里我們使用War 而不是Jar
2.4 勾選web模板支持
2.5 選擇項目保存路徑
2.6 創建成功后你應該能看到這樣的項目結構
2.7 配置JPS頁面匹配前后綴路徑
application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
2.8 必須手動創建 webapp/WEB-INF 文件夾
文件夾目錄結構如圖所示
Tips:這里注意下jsp路徑必須和剛才配置的路徑保持一致
2.9 修改index.jsp
<%-- Created by IntelliJ IDEA. User: fairy Date: 4/6/2018 Time: 9:56 AM 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> Hello World,Spring Boot 2.0 JSP Sample </body> </html>
2.10 必須實現SpringBootServletInitializer 接口並且重寫方法
我們打開ServletInitializer.java可以看到IDE已經自動為我們實現了這個接口並且重寫了這個方法
ServletInitializer.java
package com.xingyun.springbootwebjspsample; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootWebJspSampleApplication.class); } }
2.11創建controller 文件夾並且創建HomeController.java
HomeController.java
package com.xingyun.springbootwebjspsample.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home(){ return "index"; } }
Tips: 這里注意下,我們使用JSP頁面的話將不能使用@RestController注解,必須使用@Controller 才得行
2.12 配置POM.xml

<?xml version="1.0" encoding="UTF-8"?> <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.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xingyun</groupId> <artifactId>spring-boot-web-jsp-sample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>spring-boot-web-jsp-sample</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- Web 項目所以添加Spring MVC Web模塊支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jsp頁面使用jstl標簽--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!--Provided start--> <!--War包部署到外部的Tomcat中已經包含了這些, 所以需要添加以下依賴 否則會和內嵌的Tomcat 容器發生沖突 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!--用於編譯jsp--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--Provided End--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Tips:
我們需要添加web模板支持,所以要添加spring-boot-starter-web
由於我們在JSP頁面需要使用JSP標簽庫,所以要加入JSTL標簽庫依賴
War包部署到外部的Tomcat中已經包含了這些,所以需要添加以下依賴
spring-boot-starter-tomcat 和 tomcat-embed-jasper
否則會和內嵌的Tomcat 容器發生沖突,並且<scope>provided</scope>不能修改也不能注釋掉
關於這個插件如果需要做單元測試,請添加,如果不做單元測試也可以不添加
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin>
2.13 部署war 包
到了最后這一步,千萬不要急着Run As Java Application
2.13.1 點擊“Edit configurations”
2.13.2 點擊‘+’號,選擇tomcat Server ---> Local
2.13.3 編輯名稱,點擊Fix --------> Apply-------> OK
然后點擊啟動按鈕
程序會自動打開:http://localhost:8080
3. 本博文項目案例源碼
4. 可能出現的問題
在初次學習時候可能會出現一些常見的異常,可以移步去我的CSDN博客看這篇文章
細數Spring Boot 中容易中招的那些坑
https://blog.csdn.net/hadues/article/details/79334355
@ConfigurationProperties(prefix = "xxx")的值取出為空
https://blog.csdn.net/hadues/article/details/79123645
真正解決方案:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
https://blog.csdn.net/hadues/article/details/79188793
參考文章:https://www.jianshu.com/p/c544e9a9e96f
IDEA 熱部署 https://liuyanzhao.com/7105.html