Spring Boot 最佳實踐(二)集成Jsp與生產環境部署

1、簡介

提起Java不得不說的一個開發場景就是Web開發,也是Java最熱門的開發場景之一,說到Web開發繞不開的一個技術就是JSP,由於目前市面上仍有不少的公司在使用JSP,因此本文就來介紹一下Spring Boot 怎麼集成JSP開發,以及生產環境的詳細部署方法。html

2、集成JSP

開發環境

  • Spring Boot 2.0.4 RELEASE
  • Tomcat 9.0.10
  • IDEA(Intellij IDEA簡稱,下文統一使用)2018.2
  • Windows 10

JSP集成步驟

  1. 建立JSP目錄
  2. application.properties配置Jsp信息
  3. pom.xml添加依賴組件
  4. 編寫Spring MVC代碼
  5. 運行程序

具體集成方法以下:java

1.建立JSP目錄

在src/main目錄下建立目錄webapp/WEB-INF/jsp用於存放jsp頁面,以下圖:web

2.application.properties配置Jsp信息

application.properties爲全局配置文件,裏面能夠設置不少信息,好比設置日誌、設置緩存、設置Spring、Spring SESSION等信息,咱們本文只須要設置JSP的目錄文件,以及文件後綴,代碼以下:spring

spring.mvc.view.prefix=/WEB-INF/jsp
spring.mvc.view.suffix=.jsp
複製代碼

更多application.properties設置信息,查看官方文檔:docs.spring.io/spring-boot…apache

3.pom.xml添加JSP配置

在pom.xml須要添加3個組件:json

  • spring-boot-starter-web (用於運行web項目)
  • jstl (JavaServer Pages Standard Tag Library,JSP標準標籤庫,用於程序中解析JSP)
  • tomcat-embed-jasper (內置tocat對Jsp支持的依賴,用於編譯Jsp)

具體代碼以下:瀏覽器

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

<!--JavaServer Pages Standard Tag Library,JSP標準標籤庫-->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>

<!--內置tocat對Jsp支持的依賴,用於編譯Jsp-->
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
	<scope>provided</scope>
</dependency>
複製代碼

注意:tomcat-embed-jasper的scope(做用域)值爲provided,表示打包的時候不用打包進去,其餘設備會提供,若是打包進去會和外部Tomcat提供的jar衝突,致使項目啓動失敗。spring-mvc

scope(做用域)值列表表明含義解釋以下:
  • compile:默認值 他表示被依賴項目須要參與當前項目的編譯,還有後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候一般須要包含進去
  • test:依賴項目僅僅參與測試相關的工做,包括測試代碼的編譯和執行,不會被打包,例如:junit
  • runtime:表示被依賴項目無需參與項目的編譯,不事後期的測試和運行週期須要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用運行和測試階段
  • provided:打包不會包含進去,別的設施會提供。事實上該依賴理論上能夠參與編譯,測試,運行等週期。至關於compile,可是打包階段作了exclude操做
  • system:從參與度來講,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地文件系統拿。須要添加systemPath的屬性來定義路徑
4.編寫Spring MVC代碼

通過前3步的配置,項目配置部分已經完成的差很少了,接下來就是代碼的編寫了,代碼的編寫和Spring MVC同樣,分爲兩部分Java類編寫與標識註解,JSP模板建立與編寫。爲了更好的演示Spring Boot 的功能,咱們會盡量的簡化業務邏輯,在這個示例中咱們建立一個Cat類,設置標籤hi="Hello Cat",在頁面輸出標籤便可。緩存

a).Cat.java代碼
package com.hellospringboot.hellospringboot;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/cat") //建立路由規則http://xxxx/cat
public class Cat {
    /** * 默認路由方法 * * @return */
    @RequestMapping("")
    public ModelAndView index() {
        ModelAndView modelAndView = new ModelAndView("/index"); //設置對應JSP的模板文件
        modelAndView.addObject("hi", "Hello,Cat"); //設置${hi}標籤的值爲Hello,Cat
        return modelAndView;
    }
}
複製代碼

Spring MVC註解解讀tomcat

  • @Controller 標識在一個類上,標識的類就是Spring MVC的控制器類,分發處理器會掃描使用了該註解的類是否使用了@RequestMapping 註解,@Controller只是定義了一個控制器類,只用使用了@RequestMapping 註解,纔是真正處理請求的處理器;
  • @RequestMapping 標識在類或者方法上,用來處理請求地址的註解,一共有6個屬性:
    1. value 對應請求的實際地址
    2. method 請求的類型:get、post、put、delete 等,ex:@RequestMapping(value = "/test", method = RequestMethod.PUT)
    3. consumes 指定請求上的內容類型,好比application/json、text/html等
    4. produces 指定返回的數據類型,類型必須是Request Headers中accept包含的類型
    5. params 過濾請求,只有請求中包含某個參數,纔會執行,好比@RequestMapping(value = "",params = "flag"),只有參數中包含flag纔會執行,否則不能訪問,http://localhost:8080/cat?true=flag這個地址是訪問不到的,正確的地址是http://localhost:8080/cat?flag=true才能夠正常訪問
    6. headers 和params相似,只有請求headers裏面包含某個key才能夠訪問方法
b).JSP端代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>
    ${hi}
</h1>
</body>
</html>
複製代碼

這個jsp只作了一件事,把java類裏面的${hi}標籤的值顯示出來。

5.運行程序

到此爲止,若是您使用的是IDEA開發工具,那麼如今就能夠運行調試程序了,直接運行Index.jsp或者啓動文件,或者啓動文件(Application.java)便可,而後在瀏覽器輸入:http://localhost:8080/cat 便可查看。

3、生產環境部署

部署步驟

  1. 下載安裝Tomcat
  2. 入口類繼承SpringBootServletInitializer重寫configure方法
  3. 配置pom.xml
  4. IDEA生成war文件
  5. 配置Tomcat運行項目
1.下載安裝Tomcat

下載地址:tomcat.apache.org/download-90…

以下圖所示:

Windows下載:64-bit Windows zip | Linux下載:tar.gz

注意:若是是Windows版下載的免安裝版若是放到C盤的話,注意給文件夾分配足夠的權限,否則啓動以後訪問頁面顯示400或者505相似的問題。

2.入口類繼承SpringBootServletInitializer重寫configure方法

若是要進行生產環境部署,須要單獨配置一下Spring Boot 的入口類,須要繼承SpringBootServletInitializer類,重寫configure方法,由於默認狀況外部Tomcat不能讀取到Spring Boot 入口類的main方法啓動程序加載,使用須要繼承,代碼以下:

package com.hellospringboot.hellospringboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/** * 啓動類,程序入口 */
@SpringBootApplication
public class HelloSpringBootApplication extends SpringBootServletInitializer{
	/** * 重寫configure方法,加載啓動類 * @param application * @return */
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(HelloSpringBootApplication.class);
	}
	/** * Spring Boot 默認main方法 * @param args */
	public static void main(String[] args) {
		SpringApplication.run(HelloSpringBootApplication.class, args);
	}
}

複製代碼
3.配置pom.xml

須要配置一下pom.xml,排除一下內置tomcat的jar包,防止打包以後與外面Tomcat jar 包衝突,致使項目啓動失敗,配置以下:

<!--排除內置tomcat jar包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
複製代碼

主要的代碼是provided,設置打包不會包含進去,由其餘設施提供。

4.IDEA生成war文件
步驟一:修改生成jar爲war格式

找到:

jar

修改成:

war

爲何須要修改jar包格式爲war,由於若是打包爲jar包的時候,不會包含JSP文件,因此訪問的時候回404,而打包爲war的時候回包含JSP文件,因此須要把打包格式修改成war.

jar和war的區別?

  • jar(java application archive)java應用程序庫,一般爲開發引用的通用類
  • war(web application archive)web應用程序

因此從jar和war的區別來看,網頁程序打包成war格式也是很合適的。

若是須要修改生成文件的文件名稱,能夠設置build下的finalName屬性,代碼以下:

<build>
    <finalName>name</finalName>
</build> 
複製代碼
步驟二:使用IDEA生成war包

選擇菜單欄Build => Build Artifacts.. => 點擊Rebuild,便可生成war包,如圖:

生成完以後,在項目的target目錄下找到生成war文件,以下圖:

5.配置Tomcat運行項目
步驟一:把war文件複製到tomcat的webapps目錄下
步驟二:配置conf/server.xml

在Host標籤內添加Context設置,docBase屬性填寫war文件名稱,配置以下:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">	
	<Context path="" docBase="springbootjsp" debug="0" privileged="true" reloadable="true" />
	<!--
	其餘代碼
	-->
</Host>
複製代碼
步驟三:啓動tomcat

運行bin/shutdown.bat文件,啓動tomcat

輸入地址:http://localhost:8080/cat 訪問。

到此項目部署成功,雖然本人部署到Windows服務器了,Linux也是同樣的步驟。

4、知識擴展:Spring Boot 模板推薦

雖然上文咱們詳細介紹了JSP在Spring Boot 中使用,可是Spring Boot官方並不推薦使用JSP(緣由見下文)。

Spring Boot推薦模板引擎:

  • Thymeleaf
  • Freemarker
  • Mustache
  • Groovy Templates

以下圖所示:

Spring爲何不推薦使用JSP?

Spring官方不推薦使用JSP的緣由有這麼幾個:

  1. 官方文檔JSP沒有Thymeleaf好;
  2. Thymeleaf健康的開源項目,幾乎每月都有更新,而JSP已經好幾年沒有實質性的進展;
  3. Thymeleaf有迅速響應的用戶論壇。

更多詳情,點擊查看:spring.io/blog/2012/1…

總結:按照官方的說法,若是你有數百個JSP頁面,咱們並不建議您應該當即拋棄它們,從新使用Thymeleaf,可是,若是您開始開發一個新項目,強烈鼓勵您比較其餘模板引擎和JSP,以確認哪個更適合您。

5、參考資料

開發Web應用之JSP篇:tengj.top/2017/03/13/…

歡迎掃碼,加入圈子討論交流

相關文章
相關標籤/搜索