<%= ... %>out.print(...)。<%= 2 + 2 %> <%= user.getName() %> <%= user.getName() + " Welcome" %>
編譯後:
out.print(2 + 2); out.print(user.getName()); out.print(user.getName() + " Welcome");
<% ... %>service() 方法中。<table>
<%
List<Student> list = (List<Student>) request.getAttribute("students");
for (Student s : list) {
%>
<tr><td><%= s.getId() %></td><td><%= s.getName() %></td></tr>
<%
}
%>
</table>
<%! ... %>service() 內部。<%!
private String sharedVar = "init";
public void helperMethod() { /* ... */ }
%>
編譯後:
public class XXX_jsp extends HttpJspBase {
private String sharedVar = "init";
public void helperMethod() { ... }
public void _jspService(...) { ... }
}
| 指令 | 作用 | 常用屬性 |
|---|---|---|
<%@ page ... %> | 頁面屬性設置、導包 | import、contentType、pageEncoding、errorPage、isELIgnored |
<%@ include ... %> | 靜態包含其他文件(編譯期合併) | file="header.jsp" |
<%@ taglib ... %> | 引入標簽庫(JSTL、自定義標簽) | uri、prefix |
<%@ page import="java.util.*, java.sql.*" %> <%@ page contentType="text/html;charset=UTF-8" %> <%@ page pageEncoding="UTF-8" %> <%@ page errorPage="/error.jsp" %> <%@ page isELIgnored="false" %>
注意:page 指令建議放在頁面最頂部。
<%@ include file="common/header.jsp" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
| 對象 | 類型 | 說明 |
|---|---|---|
| request | HttpServletRequest | 請求對象,獲取參數、屬性、Header |
| response | HttpServletResponse | 響應對象,設置狀態、Header、Cookie、重定向 |
| out | JspWriter | 輸出流,out.print() 寫內容到頁面 |
| session | HttpSession | 會話,跨請求存儲用戶狀態 |
| application | ServletContext | 全局上下文,整個 Web 應用共享 |
| pageContext | PageContext | 頁面上下文,訪問其他 8 大對象、作用域操作 |
| page | Object | 當前頁面實例(this),極少直接用 |
| config | ServletConfig | Servlet 初始化參數 |
| exception | Throwable | 錯誤頁面中可用,捕獲異常信息 |
| 作用域 | 對象 | 生命周期 | 適用場景 |
|---|---|---|---|
| page | pageContext | 單次請求頁面渲染期間 | 頁面內臨時數據 |
| request | request | 一次請求(含 forward) | 請求傳遞數據 |
| session | session | 用戶會話(默認 30 分鐘無操作失效) | 用戶登錄狀態、購物車 |
| application | application | 整個 Web 應用生命周期 | 全局配置、緩存、計數器 |
${user.name} 替代 <%= user.getName() %>,自動處理 null、支持巢狀屬性、隱式對象(param、header、cookie、initParam 等)。<c:forEach>、<c:if>、<fmt:formatDate> 等標簽替代腳本片段,頁面更純淨。掌握三種代碼塊區別(表達式輸出、腳本邏輯、聲明成員)、三大指令用途、九大內置對象類型與作用域,是 JSP 開發的基石。現代開發建議:盡量使用 EL + JSTL 替代腳本片段,業務邏輯下沉到 Controller/Service,JSP 僅負責展示。