本來地址:Spring Boot乾貨系列:(五)開發Web應用之JSP篇
博客地址:tengj.top/javascript
上一篇介紹了Spring Boot中使用Thymeleaf模板引擎,今天來介紹一下如何使用SpringBoot官方不推薦的jsp,雖然難度有點大,可是玩起來仍是蠻有意思的。html
先來看看總體的框架結構,跟前面介紹Thymeleaf的時候差很少,只是多了webapp這個用來存放jsp的目錄,靜態資源仍是放在resources的static下面。
java
<!--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>
<!--用於編譯jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>複製代碼
使用內嵌的tomcat容器來運行的話只要這3個就行了。這裏介紹下maven中scope依賴範圍的概念,由於後續涉及到這個會有問題。git
依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:github
要支持jsp,須要在application.properties中配置返回文件的路徑以及類型web
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp複製代碼
這裏指定了返回文件類型爲jsp,路徑是在/WEB-INF/jsp/下面。spring
上面步驟有了,這裏就開始寫控制類,直接上簡單的代碼,跟正常的springMVC沒啥區別:apache
@Controller
@RequestMapping("/learn")
public class LearnResourceController {
@RequestMapping("")
public ModelAndView index(){
List<LearnResouce> learnList =new ArrayList<LearnResouce>();
LearnResouce bean =new LearnResouce("官方參考文檔","Spring Boot Reference Guide","http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/htmlsingle/#getting-started-first-application");
learnList.add(bean);
bean =new LearnResouce("官方SpriongBoot例子","官方SpriongBoot例子","https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples");
learnList.add(bean);
bean =new LearnResouce("龍國學院","Spring Boot 教程系列學習","http://www.roncoo.com/article/detail/125488");
learnList.add(bean);
bean =new LearnResouce("嘟嘟MD獨立博客","Spring Boot乾貨系列 ","http://tengj.top/");
learnList.add(bean);
bean =new LearnResouce("後端編程嘟","Spring Boot教程和視頻 ","http://www.toutiao.com/m1559096720023553/");
learnList.add(bean);
bean =new LearnResouce("程序猿DD","Spring Boot系列","http://www.roncoo.com/article/detail/125488");
learnList.add(bean);
bean =new LearnResouce("純潔的微笑","Sping Boot系列文章","http://www.ityouknow.com/spring-boot");
learnList.add(bean);
bean =new LearnResouce("CSDN——小當博客專欄","Sping Boot學習","http://blog.csdn.net/column/details/spring-boot.html");
learnList.add(bean);
bean =new LearnResouce("梁桂釗的博客","Spring Boot 揭祕與實戰","http://blog.csdn.net/column/details/spring-boot.html");
learnList.add(bean);
bean =new LearnResouce("林祥纖博客系列","從零開始學Spring Boot ","http://412887952-qq-com.iteye.com/category/356333");
learnList.add(bean);
ModelAndView modelAndView = new ModelAndView("/index");
modelAndView.addObject("learnList", learnList);
return modelAndView;
}
}複製代碼
<body style="background-image: none;">
<div class="body_wrap">
<div class="container">
<div class="alert alert-success text-center" role="alert">Sptring Boot學習資源大奉送,愛我就關注嘟嘟公衆號:嘟爺java超神學堂</div>
<table class="table table-striped table-bordered">
<tr>
<td>做者</td>
<td>教程名稱</td>
<td>地址</td>
</tr>
<c:forEach var="learn" items="${learnList}">
<tr class="text-info">
<td th:text="${learn.author}">嘟嘟MD</td>
<td th:text="${learn.title}">SPringBoot乾貨系列</td>
<td><a href="#" th:href="${learn.url}" class="btn btn-search btn-green" target="_blank"><span>點我</span></a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</body>複製代碼
啓動類不變仍是最簡單的編程
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}複製代碼
基本配置好了就能夠啓動項目,經過http://localhost:8080/learn 訪問,我使用的SpringBoot是1.5.2版本,jdk1.8,之前介紹過,運行項目有三種方式,這裏我都作過了一次測試,發如今maven中jasper依賴有加
有添加
把
我測試了好幾回都是這樣,就是有加
其餘3種狀況都同樣, jar運行也報404,spring-boot:run以及war運行均可以。
爲何jar包運行不行呢,咱們打開打包的jar和war分別看看區別,以下2圖所示:
關於Tomcat的偶有屬性都在org.springframework.boot.autoconfigure.web.ServerProperties配置類中作了定義,咱們只需在application.properties配置屬性作配置便可。通用的Servlet容器配置都已"server"左右前綴,而Tomcat特有配置都以"server.tomcat"做爲前綴。下面舉一些經常使用的例子。
配置Servlet容器:
#配置程序端口,默認爲8080
server.port= 8080
#用戶繪畫session過時時間,以秒爲單位
server.session.timeout=
# 配置默認訪問路徑,默認爲/
server.context-path=複製代碼
配置Tomcat:
# 配置Tomcat編碼,默認爲UTF-8
server.tomcat.uri-encoding=UTF-8
# 配置最大線程數
server.tomcat.max-threads=1000複製代碼
更爲詳細的Servlet容器配置以及Tomcat配置,能夠前往博主以前文章查看:Spring Boot乾貨系列:經常使用屬性彙總
Spring Boot項目須要部署在外部容器中的時候,Spring Boot導出的war包若是直接在Tomcat的部署會報錯,不信你能夠試試看。
須要作到下面兩點修改才能夠:
繼承SpringBootServletInitializer
外部容器部署的話,就不能依賴於Application的main函數了,而是要以相似於web.xml文件配置的方式來啓動Spring應用上下文,此時咱們須要在啓動類中繼承SpringBootServletInitializer並實現configure方法:
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}複製代碼
這個類的做用與在web.xml中配置負責初始化Spring應用上下文的監聽器做用相似,只不過在這裏不須要編寫額外的XML文件了。
pom.xml修改tomcat相關的配置
若是要將最終的打包形式改成war的話,還須要對pom.xml文件進行修改,由於spring-boot-starter-web中包含內嵌的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>複製代碼
在這裏須要移除對嵌入式Tomcat的依賴,這樣打出的war包中,在lib目錄下才不會包含Tomcat相關的jar包,不然將會出現啓動錯誤。
還有一個很關鍵的關鍵點,就是tomcat-embed-jasper中scope必須是provided。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>複製代碼
由於SpringBootServletInitializer須要依賴 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有這個javax.servlet,若是沒用provided,最終打好的war裏面會有servlet-api這個jar,這樣就會跟tomcat自己的衝突了。這個關鍵點一樣適應於下面說的第二種方法。
方法二:
直接添加以下配置便可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>複製代碼
provided的做用上面已經介紹的很透徹了,這裏就不囉嗦了,這種方式的好處是,打包的war包同時適合java -jar命令啓動以及部署到外部容器中。
若是你不喜歡默認的打包名稱,你能夠經過
<build>
<finalName>springBootJsp</finalName>
</bulid>複製代碼
最後啓動tomcat輸入http://localhost:8080/springBootJsp/learn 查看效果,仍是美美噠
上面已經測試過了,正常狀況下包含jsp的頁面是沒法用jar的運行的,由於jsp默認是在webapp目錄下,但是打包成jar是沒有webapp這個目錄結構的。
雖然網上有介紹說經過pom.xml配置,把WEB-INF目錄複製到META-INF/resources下面。可是博主試了一成天仍是訪問不了,最後放棄了。各位如何有興趣能夠繼續嘗試,畢竟war也能夠經過java -jar命令來啓動的不是麼。
我相信全網都找不到一篇有我這篇這麼詳細的介紹Spring Boot使用jsp的文章。有不少人問我,爲何個人不少文章這麼簡單易懂,我每次都是哭着回覆他們四個字:主題閱讀,天知道我參考了多少篇網上的文章,外加多少本相關書籍中關於這個章節的內容,反覆對比提煉,最後才產出對應的博文。說真的,我很羨慕大家在這個信息爆炸的時代,恰好看到一篇本身要學習的技術的好文章,少走多少彎路。
說了這麼多煽情的話,哪位大兄弟帶一波節奏啊,很久沒收到打賞了d=====( ̄▽ ̄*)b
想要查看更多Spring Boot乾貨教程,可前往:Spring Boot乾貨系列總綱
( ̄︶ ̄)↗[相關示例完整代碼]
最近有網友按照我文章中所示跟着操做,發現就算去掉tomcat-embed-jasper
依賴中的<scope>provided</scope>
,啓動類右鍵啓動的時候訪問頁面仍是404,研究下了,若是你也是用IDEA開發,那麼請檢查以下圖所示是否選擇了User classpath of module
選項:
一直以爲本身寫的不是技術,而是情懷,一篇篇文章是本身這一路走來的痕跡。靠專業技能的成功是最具可複製性的,但願個人這條路能讓你少走彎路,但願我能幫你抹去知識的蒙塵,但願我能幫你理清知識的脈絡,但願將來技術之巔上有你也有我,但願大爺你看完打賞點零花錢給我。
訂閱博主微信公衆號:嘟爺java超神學堂(javaLearn)三大好處: