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

JSP 本質揭秘:其實就是一個 Servlet

     編輯:Java 綜合教學

JSP 本質揭秘:其實就是一個 Servlet

很多初學者以為 JSP 與 Servlet 是兩種截然不同的技術,實則 JSP 經過容器翻譯、編譯後,本質上就是一個繼承自 HttpServlet 的 Java 類。本文通過 Tomcat 實際運行流程與生成代碼,徹底釐清兩者關係。

一、 訪問 JSP 的完整生命週期

  1. 翻譯:index.jsp → index_jsp.java(存放於 Tomcat/work/org/apache/jsp/)。
  2. 編譯:index_jsp.java → index_jsp.class(同目錄)。
  3. 執行:JVM 載入並實例化該 Class,調用 service() 處理請求。

二、 生成的 Servlet 源碼長什麼樣?

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase {
    // HttpJspBase 繼承 HttpServlet → 確認為 Servlet
    
    // 隱式對象在 _jspService() 方法中初始化
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    // ... 省略其他隱式對象
}

這裡的 pageContext、session、application、config、out、page 等,正是 JSP 頁面中直接可用的九大隱式對象來源。

三、 Jasper 引擎:JSP 的翻譯官

  • Tomcat 內建的 JSP 解析引擎,Tomcat 6 使用 Jasper 2。
  • 核心優化:標籤緩存池、後台編譯、檔案變更自動重編、支援 Eclipse JDT 編譯器。

可通過 CATALINA_HOME/conf/web.xml 中 JspServlet 的 init-param 調整行為(如 fork、xpoweredBy、load-on-startup)。

四、 Tomcat work 目錄的雙重用途

  1. 存放 JSP 翻譯產生的 .java / .class 檔案。
  2. 服務器關閉時,將 HttpSession 中的物件序列化到此目錄;重啟時反序列化還原,實現 Session 持久化。

五、 核心結論

  • JSP = 模板 + 標籤 → 翻譯 → Servlet 原始碼 → 編譯 → Servlet Class。
  • JSP 中的 Java 片段(<% ... %>)直接內嵌進生成 Servlet 的 _jspService() 方法。
  • 理解此機制,有助於排查 JSP 編譯錯誤、效能調優、隱式對象作用域等問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved