當客戶經過前端頁面提交請求後,咱們之前是怎麼作的?後端接收請求數據,處理請求,把響應結果交給模板引擎JSP,最後將渲染後的JSP轉爲HTML,響應給客戶端顯示。JSP的好處就是當咱們查出一些數據轉發到JSP頁面之後,咱們能夠用JSP輕鬆實現數據的顯示,及交互等。JSP支持很是強大的功能,包括能寫Java代碼。html
可是呢,咱們如今的這種狀況是,第一:SpringBoot這個項目首先是以jar的方式,不是war。第二:咱們用的仍是嵌入式的Tomcat(簡化版的,即不支持JSP),因此呢,SpringBoot默認是不支持JSP的。若是咱們直接用純靜態頁面的方式,那給咱們開發會帶來很是大的麻煩,所以咱們不得已選擇,除了JSP外的其餘模板引擎。前端
模板引擎的做用就是,咱們來寫一個頁面模板, 好比有些值,是動態的,咱們在經過寫一些表達式,來動態的顯示這些值,就像咱們早前經常使用的JSP。模板引擎的做用其實都同樣,只不過呢,不一樣模板引擎之間,他們可能這個語法有點不同。Spring Boot支持FreeMarker、Groovy、Thymeleaf和Mustache四種模板解析引擎,官方推薦使用Thymeleaf。java
對於模版引擎而言,SpringBoot
默認存放模版文件的路徑爲src/main/resources/templates
,固然也能夠經過配置文件進行修改的。git
固然了,使用JSP也是能夠的,但官方已經不建議使用JSP
了,本文也會講解下SpringBoot
下JSP
的支持的,由於有不少老的項目仍是使用JSP模板的
居多。(不推薦使用JSP也是由於JSP須要編譯轉換,而其餘模板引擎則無需編譯轉換)程序員
JSP(全稱Java Server Page),是web開發最先期的模板引擎產品,隨着時代的更新,已漸漸老去,固然目前還未徹底退出市場。SpringBoot微服務架構,全部項目都是以jar文件方式打包部署,嵌入式的Tomcat(簡化版,不支持JSP),因此SpringBoot默認是不支持JSP的,那麼若是想要整合JSP,就須要獨立引入整合依賴,和基礎配置。github
SpringBoot
默認存放模版文件的路徑爲src/main/resources/templates,但因爲SpringBoot默認是不支持JSP的,因此咱們不能將JSP文件放在templates目錄下。
web
1 <!-- SpringBoot整合JSP:SpringBoot默認整合Tomcat,因此不須要指定JSP版本 --> 2 <dependency> 3 <groupId>org.apache.tomcat.embed</groupId> 4 <artifactId>tomcat-embed-jasper</artifactId> 5 </dependency> 6 <!-- JSP依賴JSTL --> 7 <dependency> 8 <groupId>javax.servlet</groupId> 9 <artifactId>jstl</artifactId> 10 </dependency>
至於web.xml配置文件,是可要可不要了。spring
1 spring: 2 # 配置整合JSP 3 mvc: 4 view: 5 # 配置視圖解析器前綴 6 prefix: /WEB-INF/ 7 # 配置視圖解析器後綴 8 suffix: .jsp
由於是返回頁面 因此不能是@RestController
// @RestController 該註解會將任何返回值都做爲JSON暴露,不通過視圖解析器 @Controller // SpringBoot整合JSP,不能使用@RestController public class PersonController { @RequestMapping({"/indexJSP","/listJSP"}) public String getIndexJSP() { System.out.println("JSP訪問測試。。。。。"); return "index"; } }
1.說明:在完成上面的步驟以後,運行項目就能夠訪問jsp界面,可是別高興的太早,當你打成一個jar包的時候,你會發現你不能訪問jsp了,緣由是SpringBoot打包時,是不會主動打包webapp目錄的,你須要在你的pom文件手動配置把webapp的文件打包進去。詳情參考附錄。
2.常見錯誤:沒有手動重啓服務器!致使沒法解析,錯誤代碼500,顯示信息:template might not exist or might not be accessible by any of the configured Template Resolvers(模板可能不存在,或者任何配置的模板解析程序都沒法訪問)
3.若是隻是整合JSP,不整合使用其餘模板,那麼請不要引入其餘模板依賴,也無需配置其餘模板信息,不然會錯錯錯!!!(SpringBoot默認支持的模板引擎,天然也有對應的默認配置,一旦你添加了對應的依賴,SpringBoot將遵循約定大於配置,自動注入,那你的JSP也就沒法訪問了)。apache
FreeMarker 是一款模板引擎: 即一種基於模板和要改變的數據, 並用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員能夠嵌入他們所開發產品的組件。官網參考後端
在Spring Boot中使用FreeMarker 只需在pom中加入FreeMarker 的starter便可。
1 <!-- SpringBoot整合Freemarker --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-freemarker</artifactId> 5 </dependency>
1 spring: 2 # Freemarker配置詳解(都含有默認配置) 3 freemarker: 4 # 模板加載路徑(默認配置就是templates下,能夠手動配置,多值使用「,」分割) 5 template-loader-path: 6 - classpath:/templates/ 7 # 配置緩存,開發階段應該配置爲false 由於常常會改,部署後建議開啓 8 cache: false 9 # 配置編碼設置 10 charset: UTF-8 11 # 建議模版是否存在 12 check-template-location: true 13 # Content-Type 值 14 content-type: text/html 15 # 模板後綴:默認爲ftlh(這裏測試更改成了html),若是你設置了模板後綴,那麼新建的模板文件必須爲指定後綴 16 # suffix: .html 17 # 是否啓用Freemarker 18 enabled: true 19 # 詳解配置能夠查看FreeMarkerProperties類
配置說明:這裏是向廣大朋友概述/舉例常見配置,並非全部的都須要,SpringBoot含有默認配置,詳情參考
org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties
類,上面的配置中,實際僅配置關閉緩存便可。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Insert title here</title> 6 </head> 7 <body> 8 Hello Freemarker!!! 9 <#-- FreeMarker註釋:獲取數值(注意:這裏的${}是FreeMarker語法,相似於EL,要清楚這不是EL表達式,且這裏的值不是null,不然會報錯) --> 10 ${name } 11 </body> 12 </html>
1 @Controller // 由於是返回頁面 因此不能是@RestController 2 public class FreemarkerController { 3 4 @RequestMapping("/indexFtlh") 5 private String freemarkerShowIndex(String name, Model model) { 6 // 將接受的參數經過model共享(實際保存在request中) 7 model.addAttribute("name", name); 8 return "indexFtlh"; 9 } 10 }
常見錯誤:沒有 手動重啓服務器!致使沒法解析,錯誤代碼500,顯示信息:template might not exist or might not be accessible by any of the configured Template Resolvers(模板可能不存在,或者任何配置的模板解析程序都沒法訪問)
Thymeleaf
是一個XML/XHTML/HTML5
模板引擎,可用於Web與非Web環境中的應用開發。Thymeleaf
的主要目標在於提供一種可被瀏覽器正確顯示的、格式良好的模板建立方式,所以也能夠用做靜態建模。在Spring Boot中使用Thymeleaf只需在pom中加入Thymeleaf的starter便可。
Thymeleaf官方網站,GitHup(Thymeleaf)
1 <!-- SpringBoot整合Thymeleaf --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-thymeleaf</artifactId> 5 </dependency>
1 <properties> 2 <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> 3 <thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version> 4 </properties>
1 Spring: 2 #開啓模板緩存(默認值:true) 3 thymeleaf: 4 cache: false 5 # 在呈現效果前檢查模板是否存在. 6 check-template: true 7 # 檢查模板位置是否正確(默認值:true) 8 check-template-location: true 9 # Content-Type的值(默認值:text/html) 10 servlet: 11 content-type: text/html 12 # 開啓MVC Thymeleaf視圖解析(默認值:true) 13 enabled: true 14 # 模板編碼 15 encoding: UTF-8 16 # 要被排除在解析以外的視圖名稱列表 17 # excluded-view-names: 18 # 要運用於模板之上的模板模式。另見StandardTemplate-ModeHandlers(默認值:HTML5) 19 mode: HTML5 20 # 在構建URL時添加到視圖名稱前的前綴(模板加載路徑:默認值:classpath:/templates/) 21 prefix: classpath:/templates/ 22 # 在構建URL時添加到視圖名稱後的後綴(默認值:.html) 23 suffix: .html 24 # Thymeleaf模板解析器在解析器鏈中的順序。默認狀況下,它排第一位。順序從1開始,只有在定義了額外的TemplateResolver Bean時才須要設置這個屬性。 25 # template-resolver-order: 26 # 可解析的視圖名稱列表 27 # view-names: 28 # -
1 <!DOCTYPE html> 2 <html xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Insert title here</title> 6 </head> 7 <body> 8 <div th:text="${url}"></div> 9 </body> 10 </html>
在html頁面中引入thymeleaf命名空間,即,此時在html模板文件中動態的屬性使用th:命名空間修飾 。(避免thymeleaf語法報錯,標註警告等問題)
如下簡單瞭解:詳情請參閱博主模板語法筆記。
th屬性
html有的屬性,Thymeleaf基本都有,而經常使用的屬性大概有七八個。其中th屬性執行的優先級從1~8,數字越低優先級越高。
th:text :設置當前元素的文本內容,相同功能的還有th:utext,二者的區別在於前者不會轉義html標籤,後者會。優先級不高:order=7
th:value:設置當前元素的value值,相似修改指定屬性的還有th:src,th:href。優先級不高:order=6
th:each:遍歷循環元素,和th:text或th:value一塊兒使用。注意該屬性修飾的標籤位置,詳細日後看。優先級很高:order=2
th:if:條件判斷,相似的還有th:unless,th:switch,th:case。優先級較高:order=3
th:insert:代碼塊引入,相似的還有th:replace,th:include,三者的區別較大,若使用不恰當會破壞html結構,經常使用於公共代碼塊提取的場景。優先級最高:order=1
th:fragment:定義代碼塊,方便被th:insert引用。優先級最低:order=8
th:object:聲明變量,通常和*{}一塊兒配合使用,達到偷懶的效果。優先級通常:order=4
th:attr:修改任意屬性,實際開發中用的較少,由於有豐富的其餘th屬性幫忙,相似的還有th:attrappend,th:attrprepend。優先級通常:order=5
1 @Controller 2 public class HtmlController { 3 4 @RequestMapping("/indexHtml") 5 public String indexHtml(Model model) { 6 model.addAttribute("url","XSGE我的網站:http://www.xsge123.com"); 7 System.out.println("ceshi"); 8 return "indexHtml"; 9 } 10 }
常見錯誤:沒有 手動重啓服務器!致使沒法解析,錯誤代碼500,顯示信息:template might not exist or might not be accessible by any of the configured Template Resolvers(模板可能不存在,或者任何配置的模板解析程序都沒法訪問)
SpingBoot整合JSP,打包問題:兩種總結
1.網上不少說法是,在pom.xml中配置打包地址(這種方法可行)實現以下:
A,修改pom文件,在插件中配置JSP資源路徑。
B,修改SpringBoot打包插件版本爲(1.4.2.RELEASE)
C,運行Mavne命令打包
1 <!-- SpringBoot打包插件 --> 2 <build> 3 <plugins> 4 <plugin> 5 <groupId>org.springframework.boot</groupId> 6 <artifactId>spring-boot-maven-plugin</artifactId> 7 <version>1.4.2.RELEASE</version> 8 </plugin> 9 </plugins> 10 11 <resources> 12 <resource> 13 <directory>src/main/java</directory> 14 <includes> 15 <include>**/**</include> 16 </includes> 17 </resource> 18 <resource> 19 <directory>src/main/resources</directory> 20 <includes> 21 <include>**/**</include> 22 </includes> 23 <filtering>false</filtering> 24 </resource> 25 <!-- 打包時將jsp文件拷貝到META-INF目錄下--> 26 <resource> 27 <!-- 指定resources插件處理哪一個目錄下的資源文件 --> 28 <directory>src/main/webapp</directory> 29 <includes> 30 <include>**/**</include> 31 </includes> 32 <!--注意這次必需要放在此目錄下才能被訪問到--> 33 <targetPath>META-INF/resources</targetPath> 34 <filtering>false</filtering> 35 </resource> 36 </resources> 37 </build>
不少人可能都在網上看到過相似的配置,但幾乎沒有明確版本!然而,這種配置方式在SpringBoot版本升級後,官方便提出不推薦使用,在SpringBoot1.4.x版本以後,推薦整合JSP時打包爲war包方式,SpringBoot項目整合內置Tomcat插件,因此咱們打包的war文件,無需考慮安裝服務器問題,就把它看成一個jar文件同樣運行便可
Java -jar 文件名.jar/war
2.無需在pom中過多配置,修改打包方式爲war便可。
A,修改打包方式爲war
B,運行Maven命令打包
C,啓動jar測試訪問
<packaging>war</packaging>