SpringBoot第十二篇:整合jsp

做者:追夢1819 原文:http://www.javashuo.com/article/p-ktqegxee-by.html 版權聲明:本文爲博主原創文章,轉載請附上博文連接! <br>html

引言

  SpringBoot 雖然官方推薦使用 thymelaf 模板引擎,可是也支持jsp,只不過須要作一些修改。本文將講解 JSP 在 SpringBoot 中的應用。java

  說句題外話,本章的話題,比較複雜,也寫得比較累。由於 SpringBoot 並不推薦使用 JSP。據個人瞭解,SpringBoot 和 JSP 整合的項目少之又少。從而,網上這方面的資料比較少。已經存在的資源,內容基本上都是亂七八糟,或者是遠離主題的一些東西。git

  本章在理解的基礎上,作了一一求證,但願不會誤導讀者,浪費讀者的時間。同時,有更加了解這一塊的讀者,歡迎聯繫做者一塊兒交流交流。github

<br>web

版本信息

  • JDK:1.8
  • SpringBoot :2.1.4.RELEASE
  • maven:3.3.9
  • 外部Tomcat : 9.0
  • IDEA:2019.1.1

<br>spring

使用內嵌Tomcat

建立項目,咱們先看看項目的結構:apache

首先,引入 maven 依賴:api

<!--對 web 的支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--解析jsp-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

<!--jstl標籤-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <scope>provided</scope>
</dependency>

  注意,跟 jsp 相關的兩個依賴將其設置爲 <scope>provided</scope>。這裏咱們講解一下 scope 的概念:tomcat

  依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:springboot

  • **compile:**編譯依賴範圍。若是沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。典型的例子是spring-code,在編譯、測試和運行的時候都須要使用該依賴;
  • test: 測試依賴範圍。使用次依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將沒法使用此依賴。典型的例子是Jnuit,它只有在編譯測試代碼及運行測試的時候才須要;
  • **provided:**已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在運行時候無效。典型的例子是servlet-api,編譯和測試項目的時候須要該依賴,但在運行項目的時候,因爲容器以及提供,就不須要Maven重複地引入一遍。

其次,須要在配置文件 application.properties 中配置SpringBoot 對 jsp 的支持,SpringBoot 默認不支持 jsp。

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

而後,建立測試接口:

@Controller
public class JSPController {
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    public String index(Model model){
        model.addAttribute("name","SpringBoot");
        return "index";
    }
}

啓動類不變:

@SpringBootApplication
public class JspDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(JspDemoApplication.class, args);
    }
}

  最後,須要注意的是,要運行的是 war,而不是 jar,由於 jar 默認不會將 jsp 複製進去。故,咱們須要在 pom.xml 文件中,修改包的類型:

<packaging>jar</packaging> 修改成 <packaging>war</packaging>

  啓動時要注意,項目打包方式是war包,不要經過 main 方法啓動。這裏用的容器是SpringBoot 內嵌的Tomcat,能夠進入 war 包的目錄下,經過命令啓動:java -jar xxx.war ,訪問 http://localhost:8082/index,能夠獲得對應的頁面。

<br>

外部容器

使用外部的 Tomcat 容器時,不能直接部署上面的 war 包,須要對以上程序進行改造。

一、修改啓動類

集成 SpringBootServletInitializer ,並繼承如下方法:

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
	return application.sources(DemoApplication.class);
}

  外部容器是以相似於web.xml文件配置的方式來啓動Spring應用上下文,並不是 main 函數。以上的的改造相似在web.xml中配置負責初始化Spring應用上下文的監聽器。

二、修改相關的依賴

項目部署在外部容器中,會與內嵌的 Tomcat 衝突,須要解決,否則啓動會報錯。本文列舉兩個解決方案:

1) 移出內嵌的 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>

並將解析 jsp 的 jar 包 scope 設置爲 provided,即:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

2) 添加如下依賴(推薦)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

做者推薦這種解決方案,它同時適合命令行啓動,以及部署到外部容器中。

<br>

總結

  本文是分析 SpringBoot 中使用 JSP。JSP相對於模板引擎來講,性能更好。可是,儘管如此,做者並不推薦這種作法,而儘可能使用模板引擎 Thymelaf。不瞭解的讀者能夠閱讀上一章。   源碼:個人GitHub <br>

原文出處:https://www.cnblogs.com/yanfei1819/p/10953600.html

相關文章
相關標籤/搜索