JSP 簡述與基礎語法


JSP

  • 在很多動態網頁中,絕大部分內容都是固定不變的,只有局部內容需要動態產生和改變。爲了彌補 Servlet 的缺陷,Sun 公司在 Servlet 的基礎上推出了 JSP(Java Server Pages)。
  • JSP 是簡化 Servlet 編寫的一種技術,它將 Java 代碼和 HTML 語句混合在同一個文件中編寫,頁面動態資源使用 Java 代碼,頁面靜態資源使用 HTML 標籤。
  • 簡單來說:可以在 HTML 標籤中嵌套 Java 代碼
  • 作用:簡化書寫,展示動態頁面

1. 引入 JSP

  • 動態展示當前時間 demo.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 種方法:
  1. <% 代碼 %>
    腳本片段,生成在 service 方法中,每次請求的時候都會執行。
  2. <%! 代碼 %>
    聲明片段,在 Java 代碼中聲明成員,放在 JSP 生成 Java 文件中的成員位置(可以用在全局中)。
  3. <%= 代碼 %>
    輸出腳本片段,相當於 out.print("代碼") 方法,輸出到 JSP 頁面。注意不能分開 <%=

out.print()out.write() 的區別:

  • out.print() 支持一切類型輸出;
  • out.write() 僅支持字符類型輸出,如果傳遞的是整型,則會按 ASCII 碼錶轉換成字符類型輸出。

b. 註釋

  • JSP 中一共支持 3 種註釋方法:
  1. HTML 註釋:<!-- 僅能註釋靜態資源 -->
  2. JSP 特有的註釋:
    <%-- 可以註釋所有註釋 --%>
  3. Java 註釋(JSP 腳本內使用)
    // 單行
    /* 多行 */
    /**文檔 */

a. 註釋作用範圍

  • 安全性:JSP 註釋最高,HTML 註釋最低。
註釋 JSP 源碼 Java 源碼 HTML 源碼
HTML 可見 可見 可見
Java 可見 可見 不可見
JSP 可見 不可見 不可見

4. JSP 指令

  • 作用:用於配置 JSP 頁面,導入資源文件。
  • 格式:<%@ 指令名稱 屬性名1="屬性值1" 屬性名2="屬性值2" ... %>
  • 三大指令:
    1. page:配置 JSP 頁面;
    2. include:頁面包含(靜態);
    3. 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. 指令頁面

  • 1/0 導致了 Exception:
<%@ 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。
  • top.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 指令引入

  • JSP 文件首行添加:
<%@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 常用內置對象

  1. pageContext
    (1)當前頁面的域對象
    (2)獲取其他 8 個內置對象
  2. request
    (1)接收用戶請求(參數)
    (2)一次請求中域對象
  3. response
    (1)設置響應(包含字節流、字符流)
  4. 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. 動態包含

  • <jsp:include>
<%@ 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>
  • b.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b</title>
</head>
<body>
<%
    System.out.println("b.jsp執行了");

    // request域傳遞
    System.out.println(request.getAttribute("username"));

    // param標籤傳遞
    System.out.println(request.getParameter("name"));
    System.out.println(request.getParameter("age"));
%>
</body>
</html>

原文鏈接:https://qwert.blog.csdn.net/article/details/105672636

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章