JSP(JavaServer Pages)本質是Servlet的特殊形式:靜態模板數據(HTML)+ 動態生成邏輯(Java代碼)。容器首次訪問時將JSP翻譯為Servlet類,後續直接執行編譯後的class文件。JSP 1.1規範引入XML兼容語法,但傳統<% ... %>風格仍廣泛使用。
| 類型 | 語法 | 作用 | 關鍵屬性/示例 |
|---|---|---|---|
| 指令 | <%@ directive %> |
頁面級配置,不產生輸出 | page(language、import、session、buffer、errorPage)、include、taglib |
| 聲明 | <%! declaration %> |
定義類成員:字段、方法、內部類 | <%! private int count = 0; public void init() {...} %> 每項以分號結尾 |
| 腳本片段 | <% scriptlet %> |
業務邏輯代碼,可穿插HTML | <% for(int i=0;i<10;i++) { %> HTML <% } %> 變量作用域為_service方法局部 |
| 表達式 | <%= expression %> |
輸出值到響應流,自動toString | <%= new Date() %> 末尾無分號,相當於out.print() |
| 註釋 | <%-- comment --%> |
僅在JSP源碼可見,不輸出到客戶端 | 區別於HTML註釋<!-- -->(會輸出到瀏覽器) |
<html>
<head><title>JSP Demo</title></head>
<body>
<%@ page language="java" contentType="text/html;charset=UTF-8" %>
<%! private int counter = 0; %>
<%
counter++;
String msg = "訪問次數:" + counter;
%>
<p>處理前:<%= msg %></p>
<p>處理後:計數器值 = <%= counter %></p>
<%-- 這是JSP註釋,瀏覽器不可见 --%>
</body>
</html>
執行流程:
page指令設置頁面屬性counter(線程不安全,僅演示)import:導入包/類,可多次使用或逗號分隔session:true/false,是否自動創建HttpSessionbuffer:8kb/none/自定義,輸出緩衝區大小autoFlush:緩衝區滿時true刷新/false拋異常errorPage:異常轉發目標頁面isErrorPage:當前頁是否為錯誤處理頁(可用exception隱式對象)isELIgnored:是否忽略EL表達式<%@ include file="header.jsp" %> —— 翻譯階段合併文本,共享變量作用域,性能高但無法動態傳參。<jsp:include page="header.jsp" flush="true" /> —— 請求階段分別編譯、包含響應,可傳參<jsp:param>,靈活但有額外開銷。引入標簽庫:<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>,後續使用<c:if>、<c:forEach>等標簽替代腳本片段,實現「業務邏輯Java化、頁面展示標簽化」。
| 對象 | 類型 | 作用域 | 用途 |
|---|---|---|---|
| request | HttpServletRequest | 請求 | 獲取參數、Header、屬性 |
| response | HttpServletResponse | 頁面 | 設置狀態、Header、Cookie、重定向 |
| session | HttpSession | 會話 | 用戶狀態、購物車、登錄態 |
| application | ServletContext | 應用 | 全局配置、共享數據、資源路徑 |
| out | JspWriter | 頁面 | 輸出響應體,帶緩衝 |
| pageContext | PageContext | 頁面 | 統一訪問所有作用域、轉發/包含 |
| config | ServletConfig | 頁面 | 初始化參數 |
| page | Object | 頁面 | 當前Servlet實例(this) |
| exception | Throwable | 錯誤頁 | 異常信息(需isErrorPage="true") |
${expr} + JSTL/自定義標簽。isELIgnored="false"或web.xml配置。pageEncoding="UTF-8" + 過濾器設置請求/響應編碼。掌握JSP五大元素、指令屬性、隱式對象、作用域機制,是理解Java Web請求響應本質的基石。雖然生產環境已轉向現代模板引擎或前後端分離,但JSP作為Servlet規範的標準視圖技術,其翻譯編譯機制、生命周期、作用域體系仍是面試高頻考點與排查問題的關鍵背景知識。