JSP(JavaServer Pages)是 Servlet 的擴展,允許在 HTML 中嵌入 Java 程式碼。本文系統梳理:JSP 本質、四種註解差異、聲明元素、表達式元素、腳本元素,並附轉換後 Servlet 程式碼對照,建立正確認知模型。
JSP 本質 = Servlet。每個 .jsp 經翻譯 → .java → .class,由容器(Tomcat/Jetty)實例化執行。
out.println(\"...\") 維護困難。| 元素 | 語法 | 用途 | 轉換後 Servlet 位置 |
|---|---|---|---|
| 註解 | <%-- 註解 --%> | 僅伺服器端可見,不輸出到客戶端 | 無(編譯期移除) |
| 聲明 | <%! 變數/方法聲明 %> | 定義類成員變數、方法 | 類別成員區域 |
| 表達式 | <%= 表達式 %> | 輸出值到頁面(自動 toString) | out.print(...) |
| 腳本 | <% Java 代碼 %> | 任意可執行語句(流程控制、呼叫方法) | _jspService() 方法內 |
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body>
<%-- JSP 註解 --%>
<%!
private int counter = 0;
String getSite() { return "https://example.com"; }
%>
<%
for (int i = 0; i < 3; i++) {
out.println("腳本輸出: " + i + "<br/>");
}
%>
表達式輸出計數器:<%= ++counter %><br/>
表達式輸出字串:<%= getSite() %><br/>
表達式輸出物件:<%= this %>
</body></html>
public final class index_jsp extends HttpJspBase {
// 聲明區域 → 類成員
private int counter = 0;
public String getSite() { return "https://example.com"; }
public void _jspService(HttpServletRequest req, HttpServletResponse resp) {
// 腳本區域 → 方法內部
for (int i = 0; i < 3; i++) {
out.println("腳本輸出: " + i + "
");
}
// 表達式 → out.print()
out.print(++counter); out.print("
");
out.print(getSite()); out.print("
");
out.print(this); // 呼叫 toString()
}
}
<%= "hello" %> 正確,<%= "hello"; %> 編譯錯誤。<!-- --> 會輸出到瀏覽器,查看原始碼可見;JSP 註解 <%-- --%> 則完全移除。${expr}、JSTL)。isELIgnored="false"(預設開啟)。<c:forEach>、<c:if> 替代腳本迴圈/判斷。