Spring Boot 項目中使用JSP

1    第2-2課:Spring Boot 項目中使用JSP

JSP(Java Server Pages,Java 服務器頁面)是一個簡化的 Servlet 設計,它是由 Sun Microsystems 公司倡導、許多公司參與一塊兒創建的一種動態網頁技術標準。JSP 技術相似 ASP 技術,它是在傳統的網頁 HTML(標準通用標記語言的子集)文件(.html)中插入 Java 程序段(Scriptlet)和 JSP 標記(tag),從而造成 JSP 文件,後綴名爲(*.jsp)。用 JSP 開發的 Web 應用是跨平臺的,既能在 Linux 下運行,也能在其餘操做系統上運行。html

JSP 其實就是 Java 爲了支持 Web 開發而推出的類前端 Servlet,能夠在 JSP 中寫 Java 或者 Html 語法等,後端根據 JSP 語法渲染後返回到前端顯示,在沒有模板引擎以前 JSP 是 Java 程序員開發人員的首選,到如今仍然有不少公司使用 JSP 開發後臺管理系統。本課內容將介紹如何在 Spring Boot 項目中使用 JSP。前端

1.1     快速上手

1.1.1   項目結構

首先看一下添加 JSP 支持後的項目結構:java

spring-boot-jsp
-src+
-main    +
-java         +
-resources         +
-webapp         +
-WEB-INF              +
-jsp                 +
-welcome.jsp                    +
-test    +
-pom.xml+

對比之前的項目結構 main 目錄下多了 webapp 目錄,用來存放目錄 jsp 文件。程序員

1.1.2   配置文件

須要在配置文件中指定 jsp 的位置和後綴。web

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
  • spring.mvc.view.prefix 指明 jsp 文件在 webapp 下的哪一個目錄
  • spring.mvc.view.suffix 指明 jsp 以什麼樣的後綴結尾

1.1.3   引入依賴包

<dependency>
<groupId></groupId>   org.springframework.boot
<artifactId></artifactId>   spring-boot-starter-web
</dependency>
<dependency>
<groupId></groupId>   javax.servlet
<artifactId></artifactId>   jstl
</dependency>
<dependency>
<groupId></groupId>   org.apache.tomcat.embed
<artifactId></artifactId>   tomcat-embed-jasper
</dependency>

spring-boot-starter-web 包依賴了 spring-boot-starter-tomcat 不須要再單獨配置。引入 jstl 和內嵌的 tomcat,jstl 是一個 JSP 標籤集合,它封裝了 JSP 應用的通用核心功能。tomcat-embed-jasper 主要用來支持 JSP 的解析和運行。spring

1.1.4   編寫頁面

簡單寫一個頁面:apache

<!DOCTYPE html>
<html lang="en">
 
<body>
    Time:  ${time}
<br>   
    Message: ${message}
</body>
 
</html>

很簡單的一個頁面,展現後端傳到頁面的時間和消息。後端

1.1.5   後端程序

@Controller
publicclass WelcomeController {
 
@GetMapping"/"   ()
public String welcome(Map<String, Object> model)    {
"time"new        model.put(,Date());
"message""hello world"        model.put(,);
return"welcome"       ;
    }
 
}

time 獲取當前時間,message 賦值爲 hello world。瀏覽器

1.1.6   測試

cmd 進入項目跟路徑下:tomcat

cd...\spring-boot-jsp

執行如下命令啓動:

mvncleanspring-boot:run

啓動完成後,在瀏覽器中訪問地址:http://localhost:8080/,返回信息以下:

TimeSatAug:26:35CST:11 132018
Messagehelloworld:

說明項目運行成功。

1.2     經常使用示例

頁面中經常使用的展現後端傳值、if 判斷、循環等功能,可使用 jstl 語法處理,也能夠直接寫 Java 代碼來實現這些邏輯,在 jsp 頁面中這兩種方式都支持。但不建議在 jsp 頁面中編寫大量的 Java 代碼,從而致使前端業務複雜,可讀性差等問題。下面經過一些小的示例來學習。

在 WelcomeController 類中定義一個 user() 的方法,設置一些值從後端傳遞到前端:

"/user"@GetMapping()
StringMapStringObjectpublicuser(<,> model, HttpServletRequest request) {
"username""neo"    model.put(,);
"salary"666    model.put(,);
"count"6    request.getSession().setAttribute(,);
return"user"   ;
}

將參數和值以鍵值對的方式存儲在 Map 中,jsp 頁面能夠直接根據屬性名來獲取值,也能夠經過 request 來傳遞後端屬性和值,返回值會以鍵值對的方式傳遞到 user.jsp 頁面。

在 user.jsp 文件頭部添加兩個標籤:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html lang="en">

引入第一個標籤是爲了讓頁面支持中文展現,第二個標籤引入表示頁面使用 jstl 語法來處理頁面邏輯。

1.2.1   Java 代碼

能夠直接在 jsp 頁面中使用 Java 代碼,若是是一行 Java 代碼使用<%= %>的語法,若是是多行 Java 代碼則使用<% %>的語法,示例以下:

<h3>一行Java代碼</h3>
<p>
new   今天的日期是: <%=(java.util.Date())%>
</p>
<h3>多行Java代碼</h3>
<p>
   你的IP地址是:
<%
out"Your IP address is ""</br>"   .println(+ request.getRemoteAddr()+);
out"一段代碼 "   .println();
%>
</p>

For 循環是頁面最經常使用的功能之一,通常用在循環展現表格、列表等。

<h3>For循環實例</h3>
<%
intint"count"   count = ()session.getAttribute();
forint1   (fontSize =; fontSize <=count; fontSize++){
%>
         純潔的微笑
<br />
<%}%>

根據後端傳遞的 count 值來選擇前端頁面循環次數。

1.2.2   jstl 語法

頁面經常會使用一些邏輯判斷,使用 jstl 語法很容易實現這些功能。

<h3></h3>標籤c:if
<c:if test="${username !=null}">
<p><p>用戶名爲:username
</c:if>

使用 jstl 標籤的<c:if>來判斷傳遞過來的 username 是否爲空,若是不爲空將 username 展現到頁面。當有多條件判斷時可使用 <c:choose>更方便。 

<h3></h3>標籤c:choose
<c:choose>
<c:when test="${salary <= 0}">   
   太慘了。
</c:when>   
<c:when test="${salary > 1000}">   
   不錯的薪水,還能生活。
</c:when>   
<c:otherwise>   
   什麼都沒有。
</c:otherwise>   
</c:choose>

上述代碼根據 salary 值的大小來輸出不一樣的內容。

jstl 語法能夠支持常見的功能,這裏只是列舉最經常使用的兩個做爲示例。

1.2.3   頁面佈局

通常網站的每一個頁面都擁有相同的頁眉和頁腳,這兩部份內容通常不多發生變更,這部份內容特別適合將它提取出來,讓每一個頁面來重複利用。

JSP 能夠經過 include 指令來實現此效果,include 指令用於在編譯階段包括一個文件,這個指令告訴容器在編譯階段,把其餘外部文件的內容合併到當前 JSP 文件中,可在 JSP 頁面的任何位置使用 include 指令進行編碼。

include 有兩種用法:<%@ include file="relative url"%><jsp:include page="relative url" flush=」true」/>。前者是在翻譯階段執行,後者是在請求處理階段執行;前者叫做靜態包含,後者叫做動態包含,會在執行時檢查包含內容變化。二者使用語法沒有太大區別,下面舉一個簡單示例。

新建一個 footer.jsp 內容以下:

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<body>   
   我是頁尾
</body>   
</html>

在 user.jsp 頁面中引入 footer.jsp:

<h3></h3>佈局
<%@include file="footer.jsp"%>

這樣在訪問 user.jsp 時,會將 footer.jsp 內容展現到 user.jsp 頁面引入的位置。

上述代碼都完成後,總體看一下頁面的效果,啓動項目在瀏覽器中輸入網址:http://localhost:8080/user,頁面展現效果以下:

 

1.3     調試和部署

1.3.1   在 IDEA 中運行

若是像其餘項目同樣,直接在 IDEA 中經過 main 方法來啓動項目,在訪問測試的時候會出現 404 not found。 

 

這是由於 Spring Boot JSP 項目須要額外進行一個設置:選擇 Edit Configurations 選項,打開 Run/Debug Configurations:

 

設置 Working directory 的路徑爲項目根路徑:

 

而後重啓項目就能夠正常的訪問到頁面內了。

1.3.2   在單獨的 Tomcat 中運行

(1)在 pom.xml 裏設置打包格式爲 war。

<packaging></packaging>war

(2)排除內嵌的 Tomcat 依賴

打包時排除掉內嵌的 Tomcat 依賴,避免 jar 包衝突。

<dependency>
<groupId></groupId>   org.springframework.boot
<artifactId></artifactId>   spring-boot-starter-web
<!-- 排除內置容器,排除內置容器導出成 war 包可讓外部容器運行spring-boot項目-->   
<exclusions>   
<exclusion>       
<groupId></groupId>           org.springframework.boot
<artifactId></artifactId>           spring-boot-starter-tomcat
</exclusion>       
</exclusions>   
</dependency>

(3)Servlet 的支持

Spring Boot 項目必須實現 SpringBootServletInitializer 接口的 configure() 方法才能讓外部容器運行 Spring Boot 項目,啓動類同目錄下建立 ServletInitializer 類:

publicclass ServletInitializer extends SpringBootServletInitializer {
@Override   
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)    {
return       application.sources(JspApplication.class);
    }
}

(4)打包發佈,在項目根目錄執行 maven 命令:

packagemvn clean

(5)將 war 包發佈到 Tomcat 便可。

1.4     總結

經過本課的學習咱們掌握瞭如何在 Spring Boot 項目中集成 JSP,Spring Boot 支持使用內嵌的 Tomcat 來運行 JSP,也支持將項目打包成 War 包部署到獨立的 Tomcat 中。實際項目中推薦使用單獨的 Tomcat 來部署使用 JSP 的項目,內嵌的 Tomcat 還不是很穩定,偶爾會出現訪問遲緩的現象。 

相關文章
相關標籤/搜索