首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JSP 核心技術全解析:運行原理、九大內置對象、指令詳解與錯誤處理

     編輯:Java 綜合教學

JSP 核心技術全解析:運行原理、九大內置對象、指令詳解與錯誤處理

什麼是 JSP?

JSP (JavaServer Pages) 是一種動態網頁開發技術,允許在靜態 HTML 中嵌入 Java 代碼(腳本塊)、表達式語言(EL)及標準/自定義標簽庫。JSP 本質上是 Servlet 的一種特殊形式,由容器自動翻譯、編譯為 Servlet 類執行。

運行原理

  1. 客戶端請求 .jsp 頁面。
  2. Web 容器(如 Tomcat)檢查是否已編譯;首次訪問或文件修改後,將 JSP 翻譯為 _jspServlet.java。
  3. 編譯為 _jspServlet.class,加載實例化並初始化。
  4. 調用 _jspService(HttpServletRequest, HttpServletResponse) 處理請求,輸出響應。
  5. 後續請求直接復用 Servlet 實例,直至 JSP 文件修改觸發重新編譯。

九大內置對象(隱含對象)

在 <% ... %> 腳本塊中可直接使用,無需聲明:

對象類型作用域常用場景
requestHttpServletRequestrequest獲取參數、Header、屬性;請求轉發
responseHttpServletResponsepage設置狀態碼、Header、Cookie、重定向
sessionHttpSessionsession用戶登錄狀態、購物車等會話數據
applicationServletContextapplication全局配置、緩存、計數器等跨用戶共享數據
outJspWriterpage向響應體寫入文本/HTML
pageContextPageContextpage訪問其他 8 大對象、頁面屬性管理、標簽開發核心
configServletConfigpage獲取 JSP 初始化參數(<init-param>)
pageObject (this)page當前 Servlet 實例引用,僅能調用 Object 方法,極少使用
exceptionThrowablepage僅在 isErrorPage="true" 的錯誤頁可用,封裝拋出的異常

JSP 指令

指令不產生輸出,而是指導容器如何處理頁面。三大指令:

1. page 指令

<%@ 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 表達式(默認)。

2. include 指令(靜態包含)

<%@ include file="/common/header.jsp" %>
  • 翻譯階段合併文件,共享同一 Servlet,變量名衝突風險高。
  • 適合靜態片段(頭部、尾部、側邊欄)。

3. taglib 指令

<%@ 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 / 自定義標簽庫,替代腳本塊,實現邏輯與視圖分離。

動作元素 vs 指令

特性指令 (@)動作 (jsp:)
處理階段翻譯期請求期
典型標簽page, include, taglibjsp: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>

web.xml 全局配置(推薦)

<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 可防止用戶直接訪問。
  • 容器使用 請求轉發 到錯誤頁,保留原請求屬性。

最佳實踐建議

  1. 盡量避免腳本塊:使用 JSTL + EL + 自定義標簽,保持頁面整潔。
  2. 禁用不必要的 Session:靜態頁、登錄頁、API 端點設置 session="false"。
  3. 統一編碼:pageEncoding="UTF-8" + contentType="text/html; charset=UTF-8" + 過濾器強制編碼。
  4. 錯誤頁友好化:區分業務異常與系統異常,記錄完整堆棧,用戶端展示友好提示。
  5. 標簽庫優於 Include:動態包含 <jsp:include> 避免變量污染,復雜片段封裝為標簽文件(.tag)。

總結

JSP 雖屬上一代視圖技術,但在存量系統維護、簡單頁面渲染、傳統企業級應用中仍廣泛存在。深入理解其翻譯機制、內置對象生命周期、指令與動作差異、錯誤處理體系,對排查頁面異常、優化性能、重構遷移至 Thymeleaf/Freemarker/前後端分離架構均有重要指導意義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved