spring boot 默認採用 thymeleaf 模板引擎,其默認的配置就支持 thymeleaf 。html
而後不少的工程之前就使用 jsp 來編寫,切換到 thymeleaf 的代價太大,實在沒有必要,在找了網上的一些資料後,作了一下 spring-boot 與 jsp 的集成配置。java
整個配置的關鍵點有幾個:web
若是以 war 方式打包,應用類須要繼承 SpringBootServletInitializer
,纔會被容器正確加載。spring
從 start.spring.io
下載一個支持 web 的項目骨架代碼後,開始進行定製。apache
spring boot 默認的模板目錄爲 src/resources/templates
,而通常遺留項目(包括使用 maven)時,可能會用 WebContent
或 src/webapp
目錄做爲資源目錄,而後把 jsp 放到 WEB-INF/jsp
目錄下以防止被直接讀取。tomcat
假設如今放在 src/webapp/WEB-INF/jsp
目錄下,所以,首先須要調整相應的配置,在 application.properties (或 application.yml),修改以下:mvc
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
這樣就能指定從src/webapp
目錄加載視圖文件,並以 .jsp
做爲後綴,這些配置會被 spring boot 中的配置屬性 bean WebMvcProperties
接收。app
WebMvcProperties
除了視圖的前綴、後綴外,還包含日期格式之類的一些配置。webapp
事實上,並不須要顯式地配置視圖解析類,spring boot 會自動找到合適的試圖解析器和解析類。若是打開了 debug ,可見到加載了對應的 bean WebMvcAutoConfiguration
。jsp
在 WebMvcAutoConfiguration
這個自動化配置的類中,會配置一個 InternalResourceViewResolver
的 bean :
@Bean @ConditionalOnMissingBean public InternalResourceViewResolver defaultViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix(this.mvcProperties.getView().getPrefix()); resolver.setSuffix(this.mvcProperties.getView().getSuffix()); return resolver; }
可見,在缺省狀況下,就會建立一個默認的 view resolver 來進行視圖的解析。 InternalResourceViewResolver
的構造函數,在發現 classpath 下存在 jstl 類庫時,會自動以 JstlView
類做爲視圖。
public InternalResourceViewResolver() { Class<?> viewClass = requiredViewClass(); if (InternalResourceView.class == viewClass && jstlPresent) { viewClass = JstlView.class; } setViewClass(viewClass); }
默認生成的項目結構中,會採用 tomcat 做爲嵌入式的容器,可是並無包含支持 jsp 的組件,所以,須要增長依賴:
runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
若是使用到 jstl ,因爲部分容器是不帶 jstl 的,所以還須要增長 jstl 的依賴。
compile('javax.servlet:jstl')
最後,彙總一下修改的內容:
build.gradle
增長 tomcat jasper 和 jstl
compile('javax.servlet:jstl') runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
修改 application.properties
修改 prefix 和 suffix
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
編寫 jsp 和 controller 類
controller
@Controller class IndexController { @GetMapping("/") fun index(): String { return "index" } }
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>Index</title> </head> <body> <h1>Hello, world!</h1> </body> </html>
打包運行