JSP (JavaServer Pages) 是一種動態網頁開發技術,允許在靜態 HTML 中嵌入 Java 代碼(腳本塊)、表達式語言(EL)及標準/自定義標簽庫。JSP 本質上是 Servlet 的一種特殊形式,由容器自動翻譯、編譯為 Servlet 類執行。
.jsp 頁面。_jspServlet.java。_jspServlet.class,加載實例化並初始化。_jspService(HttpServletRequest, HttpServletResponse) 處理請求,輸出響應。在 <% ... %> 腳本塊中可直接使用,無需聲明:
| 對象 | 類型 | 作用域 | 常用場景 |
|---|---|---|---|
request | HttpServletRequest | request | 獲取參數、Header、屬性;請求轉發 |
response | HttpServletResponse | page | 設置狀態碼、Header、Cookie、重定向 |
session | HttpSession | session | 用戶登錄狀態、購物車等會話數據 |
application | ServletContext | application | 全局配置、緩存、計數器等跨用戶共享數據 |
out | JspWriter | page | 向響應體寫入文本/HTML |
pageContext | PageContext | page | 訪問其他 8 大對象、頁面屬性管理、標簽開發核心 |
config | ServletConfig | page | 獲取 JSP 初始化參數(<init-param>) |
page | Object (this) | page | 當前 Servlet 實例引用,僅能調用 Object 方法,極少使用 |
exception | Throwable | page | 僅在 isErrorPage="true" 的錯誤頁可用,封裝拋出的異常 |
指令不產生輸出,而是指導容器如何處理頁面。三大指令:
<%@ page
import="java.util.*, com.example.model.*"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
session="true"
errorPage="/error.jsp"
isErrorPage="false"
isELIgnored="false"
autoFlush="true"
buffer="8kb"
%>
import:導入包/類,同 Java import。contentType / pageEncoding:響應編碼與頁面源文件編碼,建議統一 UTF-8。session="false":禁用 Session 可節省資源,適用於靜態頁/登錄頁。errorPage / isErrorPage:聲明錯誤處理頁與被處理頁關係。isELIgnored:false 開啟 EL 表達式(默認)。<%@ include file="/common/header.jsp" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
引入 JSTL / 自定義標簽庫,替代腳本塊,實現邏輯與視圖分離。
| 特性 | 指令 (@) | 動作 (jsp:) |
|---|---|---|
| 處理階段 | 翻譯期 | 請求期 |
| 典型標簽 | page, include, taglib | jsp:include, jsp:forward, jsp:useBean, jsp:setProperty |
| 動態性 | 靜態 | 動態(可帶請求時參數) |
<!-- 正常頁面 -->
<%@ page errorPage="/WEB-INF/error.jsp" %>
<!-- 錯誤頁 -->
<%@ page isErrorPage="true" import="java.util.logging.Logger" %>
<h1>系統異常</h1>
<p><%= exception.getMessage() %></p>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/error/500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/WEB-INF/error/npe.jsp</location>
</error-page>
WEB-INF 可防止用戶直接訪問。session="false"。pageEncoding="UTF-8" + contentType="text/html; charset=UTF-8" + 過濾器強制編碼。<jsp:include> 避免變量污染,復雜片段封裝為標簽文件(.tag)。JSP 雖屬上一代視圖技術,但在存量系統維護、簡單頁面渲染、傳統企業級應用中仍廣泛存在。深入理解其翻譯機制、內置對象生命周期、指令與動作差異、錯誤處理體系,對排查頁面異常、優化性能、重構遷移至 Thymeleaf/Freemarker/前後端分離架構均有重要指導意義。