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

Java Web 核心技術:JSP 運行原理、語法指令與九大隱式對象詳解

     編輯:Java 綜合教學

1. JSP 是什麼?

JSP(JavaServer Pages)是 Sun 定義的動態 Web 技術,本質是 Servlet 的擴展。最大特點:像寫 HTML 一樣寫動態頁面,在靜態模板中嵌入 Java 代碼片段,最終由容器翻譯為 Servlet 執行。

2. 運行原理:從 .jsp 到 .class

  1. 用戶首次請求 index.jsp。
  2. 容器(如 Tomcat 的 Jasper 引擎)將其翻譯為 Servlet 源碼 index_jsp.java。
  3. 編譯為字節碼 index_jsp.class。
  4. 實例化該 Servlet 類(繼承 HttpJspBase → HttpServlet),調用 _jspService() 處理請求。
  5. 後續請求直接復用已編譯的 Servlet 實例(除非源文件修改)。

翻譯生成的文件結構

翻譯後 Servlet 關鍵結構

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements JspSourceDependent, JspSourceImports {
    // 隱式對象聲明
    private JspWriter out;
    private HttpServletRequest request;
    private HttpServletResponse response;
    private HttpSession session;
    private ServletContext application;
    private ServletConfig config;
    private PageContext pageContext;
    private Object page = this;
    private Throwable exception;

    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        // 初始化隱式對象
        // 輸出靜態模板內容:out.write("...")
        // 執行嵌入 Java 代碼:out.println(new Date().toLocaleString());
        // 處理異常、釋放 PageContext
    }
}

3. JSP 基本語法元素

語法格式用途翻譯位置
表達式<%= expression %>輸出值到響應體out.print(expression)
腳本片段<% java statements %>執行任意 Java 代碼直接放入 _jspService() 方法體
聲明<%! declarations %>定義類成員(字段、方法)類級別,不在 _jspService 內
註釋<%-- comment --%>JSP 註釋,不輸出到客戶端編譯時移除
HTML 註釋<!-- comment -->客戶端可見註釋原樣輸出

示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><title>JSP Demo</title></head>
<body>
    <%-- 這是 JSP 註釋 --%>
    <% String user = "Admin"; %>
    <h1>Welcome, <%= user %></h1>
    <%! 
        private int counter = 0;
        public int getCounter() { return ++counter; }
    %>
    <p>Page views: <%= getCounter() %></p>
</body>
</html>

4. JSP 指令

page 指令

<%@ page 
    language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="java.util.*, java.text.*"
    session="true"
    buffer="16kb"
    autoFlush="true"
    isErrorPage="false"
    errorPage="/error.jsp"
    isELIgnored="false"
%>

常用屬性:import 導包、session 是否創建 Session、buffer 緩沖區大小、errorPage 異常轉發頁面、isELIgnored 是否忽略 EL 表達式。

include 指令(靜態包含)

<%@ include file="/common/header.jsp" %>

編譯階段合併文件,適合靜態片段(頭部、底部、側邊欄)。動態包含請用 <jsp:include page="..." />。

taglib 指令

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>

引入標準標簽庫(JSTL)或自定義標簽庫,替代腳本片段,實現邏輯與視圖分離。

5. 九大隱式對象

容器自動實例化,無需聲明即可在腳本片段/表達式中直接使用:

對象名類型作用域主要用途
outJspWriterpage輸出響應內容,帶緩沖區
requestHttpServletRequestrequest獲取請求參數、頭、屬性
responseHttpServletResponsepage設置狀態碼、頭、重定向、Cookie
configServletConfigpage獲取初始化參數
sessionHttpSessionsession用戶會話數據存取
applicationServletContextapplication全局共享數據、資源路徑、屬性
pageObjectpage當前 Servlet 實例
pageContextPageContextpage頁面上下文,訪問所有作用域、轉發、包含
exceptionThrowablepage僅在 isErrorPage="true" 頁面可用,異常信息

pageContext 通用訪問方法

pageContext.getOut()          // → out
pageContext.getRequest()      // → request
pageContext.getResponse()     // → response
pageContext.getSession()      // → session
pageContext.getException()    // → exception
pageContext.getServletConfig()// → config
pageContext.getServletContext()// → application
pageContext.getPage()         // → page
pageContext.setAttribute("key", val, PageContext.REQUEST_SCOPE); // 設置屬性
pageContext.findAttribute("key"); // 按作用域查找

6. 最佳實踐與演進

  • 避免腳本片段:使用 JSTL (<c:forEach>、<c:if>) + EL 表達式 (${user.name}) 實現邏輯視圖分離。
  • 採用 MVC 架構:JSP 僅作為 View,Controller 用 Spring MVC,Model 用 POJO/DTO。
  • 前後端分離:現代項目多採用 Vue/React + Spring Boot REST API,JSP 逐漸退出主流舞台,但維護老項目仍需掌握。
  • 標簽文件:將重複片段封裝為 .tag 文件,放入 /WEB-INF/tags/,通過 taglib 引入復用。

7. 參考資源

  • 《Head First Servlets & JSP》經典入門
  • Tomcat 官方文檔:Jasper 配置、JSP 編譯參數
  • JSTL 1.2 標準標簽庫參考
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved