spring-boot 與 jsp 集成(使用 gradle)

spring-boot 與 jsp 集成(使用 gradle)

spring boot 默認採用 thymeleaf 模板引擎,其默認的配置就支持 thymeleaf 。html

而後不少的工程之前就使用 jsp 來編寫,切換到 thymeleaf 的代價太大,實在沒有必要,在找了網上的一些資料後,作了一下 spring-boot 與 jsp 的集成配置。java

整個配置的關鍵點有幾個:web

  1. 肯定 jsp 目錄
  2. 讓 spring-boot 採用正確的 view 解析類
  3. 使用支持 jsp 的容器插件

若是以 war 方式打包,應用類須要繼承 SpringBootServletInitializer ,纔會被容器正確加載。spring

start.spring.io 下載一個支持 web 的項目骨架代碼後,開始進行定製。apache

肯定 jsp 目錄

spring boot 默認的模板目錄爲 src/resources/templates ,而通常遺留項目(包括使用 maven)時,可能會用 WebContentsrc/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

使用正確的 view 解析類

事實上,並不須要顯式地配置視圖解析類,spring boot 會自動找到合適的試圖解析器和解析類。若是打開了 debug ,可見到加載了對應的 bean WebMvcAutoConfigurationjsp

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);
}

採用支持 jsp 的容器

默認生成的項目結構中,會採用 tomcat 做爲嵌入式的容器,可是並無包含支持 jsp 的組件,所以,須要增長依賴:

runtime('org.apache.tomcat.embed:tomcat-embed-jasper')

若是使用到 jstl ,因爲部分容器是不帶 jstl 的,所以還須要增長 jstl 的依賴。

compile('javax.servlet:jstl')

運行

最後,彙總一下修改的內容:

  1. build.gradle

    增長 tomcat jasper 和 jstl

    compile('javax.servlet:jstl')
     runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
  2. 修改 application.properties

    修改 prefix 和 suffix

    spring.mvc.view.prefix=/WEB-INF/jsp/
     spring.mvc.view.suffix=.jsp
  3. 編寫 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>
  4. 打包運行

相關文章
相關標籤/搜索