很多初學者以為 JSP 與 Servlet 是兩種截然不同的技術,實則 JSP 經過容器翻譯、編譯後,本質上就是一個繼承自 HttpServlet 的 Java 類。本文通過 Tomcat 實際運行流程與生成代碼,徹底釐清兩者關係。
index.jsp → index_jsp.java(存放於 Tomcat/work/org/apache/jsp/)。index_jsp.java → index_jsp.class(同目錄)。service() 處理請求。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 頁面中直接可用的九大隱式對象來源。
可通過 CATALINA_HOME/conf/web.xml 中 JspServlet 的 init-param 調整行為(如 fork、xpoweredBy、load-on-startup)。
.java / .class 檔案。HttpSession 中的物件序列化到此目錄;重啟時反序列化還原,實現 Session 持久化。<% ... %>)直接內嵌進生成 Servlet 的 _jspService() 方法。