JSP
- 在很多動態網頁中,絕大部分內容都是固定不變的,只有局部內容需要動態產生和改變。爲了彌補 Servlet 的缺陷,Sun 公司在 Servlet 的基礎上推出了 JSP(Java Server Pages)。
- JSP 是簡化 Servlet 編寫的一種技術,它將 Java 代碼和 HTML 語句混合在同一個文件中編寫,頁面動態資源使用 Java 代碼,頁面靜態資源使用 HTML 標籤。
- 簡單來說:可以在 HTML 標籤中嵌套 Java 代碼。
- 作用:簡化書寫,展示動態頁面
1. 引入 JSP
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>${NAME}</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String currentTime = simpleDateFormat.format(date);
%>
<h3><% out.write(currentTime);%></h3>
</body>
</html>
2. JSP 工作原理
- JSP 本質上是一個 Servlet。
- index_jsp.class 繼承自 org.apache.jasper.runtime.HttpJspBase,而 HttpJspBase 則繼承自 HttpServlet。
- JSP 底層是由
out.write()
方法輸出的:
3. JSP 腳本和註釋
a. 腳本
- JSP 通過腳本方式來定義 Java 代碼。一共有 3 種方法:
<% 代碼 %>
腳本片段,生成在 service 方法中,每次請求的時候都會執行。
<%! 代碼 %>
聲明片段,在 Java 代碼中聲明成員,放在 JSP 生成 Java 文件中的成員位置(可以用在全局中)。
<%= 代碼 %>
輸出腳本片段,相當於 out.print("代碼")
方法,輸出到 JSP 頁面。注意不能分開 <%=
。
out.print()
與 out.write()
的區別:
out.print()
支持一切類型輸出;
- 而
out.write()
僅支持字符類型輸出,如果傳遞的是整型,則會按 ASCII 碼錶轉換成字符類型輸出。
b. 註釋
- HTML 註釋:
<!-- 僅能註釋靜態資源 -->
- JSP 特有的註釋:
<%-- 可以註釋所有註釋 --%>
- Java 註釋(JSP 腳本內使用)
// 單行
/* 多行 */
/**文檔 */
a. 註釋作用範圍
註釋 |
JSP 源碼 |
Java 源碼 |
HTML 源碼 |
HTML |
可見 |
可見 |
可見 |
Java |
可見 |
可見 |
不可見 |
JSP |
可見 |
不可見 |
不可見 |
4. JSP 指令
- 作用:用於配置 JSP 頁面,導入資源文件。
- 格式:
<%@ 指令名稱 屬性名1="屬性值1" 屬性名2="屬性值2" ... %>
- 三大指令:
page
:配置 JSP 頁面;
include
:頁面包含(靜態);
taglib
:導入資源文件。
a. page 指令
- 設置格式:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
contentType
相當於 response.setContentType();
設置響應體的 MIME 類型和編碼方式;
- language:目前僅支持 Java 語言。
import
導入 Jar 包:<%@ page import="java.util.Date" %>
errorPage
當前頁面報錯後,跳轉指定錯誤提示頁面;
isErrorPage
聲明當前 JSP 頁面是一個異常處理頁面,打開異常開關
false
:(默認)
true
:可以操作 Exception 異常對象
i. 異常處理頁面
- 相當於替代
HTTP Status 500
頁面。
- 500.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>500</title>
</head>
<body>
<h4>服務器繁忙,請稍後重試....</h4>
<%
out.print(exception.getMessage());
%>
</body>
</html>
ii. 指令頁面
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="500.jsp" %>
<html>
<head>
<title>demo2</title>
</head>
<body>
<h3>page指令</h3>
<%
new Date();
new SimpleDateFormat();
Integer age = 1 / 0;
%>
</body>
</ht ml>
b. include 指令(靜態包含)
- demo.jsp.java 包含頭部信息,即合併輸出了開發中的兩個文件:top.jsp、demo.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>top.jsp</title>
</head>
<body>
<div style="border: skyblue dashed 5px;height: 100px">頭部</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo3</title>
</head>
<body>
<%@include file="top.jsp"%>
<div style="border: red solid 5px;height: 400px">我是include靜態包含,主體..</div>
</body>
</html>
c. taglib 指令(動態包含)
- 導入 Apache 提供的 JSTL 標準標籤庫的步驟:
i. 導入 Jar 包
ii. 通過 taglib 指令引入
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- URI(Uniform Resource Identifier, 通一資源標誌符),表示的是 web 上每一種可用的資源,如 HTML 文檔、圖像、視頻片段、程序等,這些資源都由一個 URI 進行定位的。
- URL 是 URI 的一個子集。它是 Uniform Resource Locator 的縮寫,譯爲 “統一資源定位符”。通俗地說,URL 是 Internet 上描述信息資源的字符串,主要用在各種 WWW 客戶程序和服務器程序上。採用 URL 可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。 URL 是 URI 概念的一種實現方式。
5. JSP 內置對象
- 作用:在 JSP 頁面中不需要獲取和創建,可以直接使用的對象。
- JSP 中一共有 9 個內置對象:
變量名 |
真實類型 |
作用 |
pageContext |
PageContext |
當前頁面中共享數據(域對象) |
request |
HttpServletRequest |
一次請求中共享數據(域對象) |
session |
HttpSession |
一次會話中共享數據(域對象) |
application |
ServletContext |
整個 web 應用共享數據(域對象) |
response |
HttpServletResponse |
響應對象 |
page(相當於類中的 this) |
Object |
當前頁面(Servlet)對象 |
out |
JSPWriter |
輸出對象 |
config |
ServletConfig |
Servlet 配置對象 |
exception |
Throwable |
異常對象(默認關閉,需要手動開啓,與 isErrorPage類似) |
a. JSP 常用內置對象
- pageContext
(1)當前頁面的域對象
(2)獲取其他 8 個內置對象
- request
(1)接收用戶請求(參數)
(2)一次請求中域對象
- response
(1)設置響應(包含字節流、字符流)
- out
(1)專門在 JSP 中處理字符流:
print();
// 可以輸出一切類型
write();
// 只能輸出字符類型
b. JSP 四大域的應用場景
- PageContext:這個域是在當前 JSP 頁面上共享數據。這個域往往是用於 JSTL 標籤庫。
- Request 域:一次請求內去共享數據。如果某個數據僅用於本次請求的時候即可使用 Request 域。 以後一般都是 Servlet 存儲數據的時候使用,然後轉發給 JSP。
- Session 域:一次會話中共享數據,一般用於存儲登陸者信息。
- ServletContext:服務器啓動的時候存在,服務器關閉的時候銷燬。 一般沒有使用該域的場景,因爲該域共享數據的生命週期太長了,非常消耗內存。統計頁面訪問次數可用監聽器。
6. JSP 動作標籤
- 作用:簡化 JSP 頁面編碼。
- 常用動作標籤:
<jsp:include>
:動態頁面包含(之前介紹的 <%@include file="top.jsp"%>
是靜態頁面包含)。
相當於 request.getRequestDispatcher().include(request,response);
<jsp:forward>
:請求轉發(頁面跳轉)。
相當於 request.getRequestDispatcher().forword(request,response);
<jsp:param>
:參數傳遞(forward 的子標籤)
使用 request.getAttribute()
獲取 request 域的數據
使用 request.getParameter()
獲取參數(不常用)
a. 動態包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo6</title>
</head>
<body>
<jsp:include page="top.jsp"></jsp:include>
<div style="border: green solid 5px;height: 400px">jsp的動態包含,主體</div>
</body>
</html>
- top.jsp、demo.jsp 分別輸出爲兩個 Java 文件,編譯後也互不關聯,最後合併到 response 輸出。
b. 靜態包含和動態包含區別
- 在開發中,推薦使用靜態包含,以提升訪問性能。
- 注意:不能出現重名的變量。
c. 請求轉發 & 參數傳遞
<jsp:forward>
& <jsp:param>
- a.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>a</title>
</head>
<body>
<%
System.out.println("a.jsp執行了");
request.setAttribute("username", "request域存值了");
%>
<jsp:forward page="b.jsp">
<jsp:param name="name" value="jack"></jsp:param>
<jsp:param name="age" value="18"></jsp:param>
</jsp:forward>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>b</title>
</head>
<body>
<%
System.out.println("b.jsp執行了");
System.out.println(request.getAttribute("username"));
System.out.println(request.getParameter("name"));
System.out.println(request.getParameter("age"));
%>
</body>
</html>
原文鏈接:https://qwert.blog.csdn.net/article/details/105672636