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。前端
首先看一下添加 JSP 支持後的項目結構:java
spring-boot-jsp
-src+
-main +
-java +
-resources +
-webapp +
-WEB-INF +
-jsp +
-welcome.jsp +
-test +
-pom.xml+
對比之前的項目結構 main 目錄下多了 webapp 目錄,用來存放目錄 jsp 文件。程序員
須要在配置文件中指定 jsp 的位置和後綴。web
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
<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
簡單寫一個頁面:apache
<!DOCTYPE html>
<html lang="en">
<body>
Time: ${time}
<br>
Message: ${message}
</body>
</html>
很簡單的一個頁面,展現後端傳到頁面的時間和消息。後端
@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。瀏覽器
cmd 進入項目跟路徑下:tomcat
cd...\spring-boot-jsp
執行如下命令啓動:
mvncleanspring-boot:run
啓動完成後,在瀏覽器中訪問地址:http://localhost:8080/,返回信息以下:
TimeSatAug:26:35CST:11 132018
Messagehelloworld:
說明項目運行成功。
頁面中經常使用的展現後端傳值、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 語法來處理頁面邏輯。
能夠直接在 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 值來選擇前端頁面循環次數。
頁面經常會使用一些邏輯判斷,使用 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 語法能夠支持常見的功能,這裏只是列舉最經常使用的兩個做爲示例。
通常網站的每一個頁面都擁有相同的頁眉和頁腳,這兩部份內容通常不多發生變更,這部份內容特別適合將它提取出來,讓每一個頁面來重複利用。
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,頁面展現效果以下:
若是像其餘項目同樣,直接在 IDEA 中經過 main 方法來啓動項目,在訪問測試的時候會出現 404 not found。
這是由於 Spring Boot JSP 項目須要額外進行一個設置:選擇 Edit Configurations 選項,打開 Run/Debug Configurations:
設置 Working directory 的路徑爲項目根路徑:
而後重啓項目就能夠正常的訪問到頁面內了。
(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 便可。
經過本課的學習咱們掌握瞭如何在 Spring Boot 項目中集成 JSP,Spring Boot 支持使用內嵌的 Tomcat 來運行 JSP,也支持將項目打包成 War 包部署到獨立的 Tomcat 中。實際項目中推薦使用單獨的 Tomcat 來部署使用 JSP 的項目,內嵌的 Tomcat 還不是很穩定,偶爾會出現訪問遲緩的現象。