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

JSP 基礎語法完整指南

     編輯:JSP 入門

JSP 基礎語法完整指南

JSP 頁面由靜態內容 (HTML/文字) 與動態元素 (Scriptlet、宣告、運算式、註解、指令、動作) 組成。掌握基礎語法是開發動態網頁的起點。


1. Scriptlet (腳本程式) — <% ... %>

  • 任意 Java 陳述式、變數宣告、方法呼叫、流程控制
  • 編譯後置於 _jspService() 方法內
  • XML 等價:<jsp:scriptlet> ... </jsp:scriptlet>

範例

<% 
  String name = request.getParameter("name");
  if (name == null || name.isEmpty()) {
    name = "訪客";
  }
  out.println("你好," + name + "!");
%>

2. Declaration (宣告) — <%! ... %>

  • 類別成員層級:欄位 (變數)、方法、內部類別
  • 編譯後置於 Servlet 類別內部,非 _jspService() 內
  • 執行緒不安全:欄位被所有請求共享,避免使用可變欄位
  • XML 等價:<jsp:declaration> ... </jsp:declaration>

範例

<%! 
  private static final String DEFAULT_NAME = "訪客"; // 常數安全
  private int requestCount = 0; // 危險!多執行緒共享
  
  public String greet(String name) {
    return "你好," + (name != null ? name : DEFAULT_NAME) + "!";
  }
%>

<% 
  requestCount++; // 競態條件
  out.println(greet(request.getParameter("name"))); 
  out.println("請求計數:" + requestCount); 
%>

正確做法:使用 Request/Session/Application 範圍屬性

<%
  Integer count = (Integer) application.getAttribute("globalCount");
  if (count == null) count = 0;
  count++;
  application.setAttribute("globalCount", count);
  out.println("全域請求數:" + count);
%>

3. Expression (運算式) — <= ... %>

  • 任意 Java 運算式,結果 自動轉字串輸出 (等同 out.print())
  • 不能以分號結尾
  • XML 等價:<jsp:expression> ... </jsp:expression>

範例

<p>現在時間:<%= new java.util.Date() %></p>
<p>2 + 3 = <%= 2 + 3 %></p>
<input value="<%= request.getParameter("name") %>">

4. Comment (註解) — <%-- ... --%>

類型語法輸出至瀏覽器編譯處理
JSP 註解<%-- 註解 --%>否完全移除,不編譯
HTML 註解<!-- 註解 -->是 (檢視原始碼可見)視為靜態文字輸出
Java 註解<% // 註解 %> 或 <% /* 註解 */ %>否編譯進 Servlet 原始碼

5. 指令 — <%@ ... %>

參考 JSP 指令元素完整指南:page、include、taglib。


6. 動作元素 — <jsp:xxx>

參考 JSP 動作元素完整指南:include、forward、useBean 等。


7. EL 運算式 — ${...}

  • 簡潔存取範圍屬性、請求參數、標頭、Cookie、執行運算
  • 自動處理 null (不拋出 NPE,輸出空字串)
  • 支援 . 和 [] 存取屬性/Map/List
  • 隱含物件:param, header, sessionScope, pageContext 等

範例

<p>用戶:${sessionScope.loginUser.name}</p>
<p>查詢關鍵字:${param.q}</p>
<c:if test="${param.page gt 1}">...</c:if>
<c:forEach items="${requestScope.items}" var="item">${item.name}</c:forEach>

8. 控制流程語句

Scriptlet 中可使用完整 Java 控制結構:

if-else

<% if (user.isAdmin()) { %>
  <a href="/admin">管理後台</a>
<% } else { %>
  <a href="/profile">個人資料</a>
<% } %>

switch-case

<% 
  String role = user.getRole();
  switch (role) {
    case "admin": out.print("管理員"); break;
    case "editor": out.print("編輯"); break;
    default: out.print("一般用戶");
  }
%>

for / while 迴圈

<ul>
<% for (int i = 1; i <= 5; i++) { %>
  <li>項目 <%= i %></li>
<% } %>
</ul>

<%-- JSTL 替代 (推薦) --%>
<c:forEach begin="1" end="5" varStatus="s">
  <li>項目 ${s.count}</li>
</c:forEach>

9. 運算子與字面常數

  • 支援所有 Java 運算子:算術、關係、邏輯、位元、三元、指派
  • 優先序與 Java 相同
  • 字面常數:true/false、整數、浮點數、字串 (單/雙引號)、null

10. 中文編碼標準模板

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>頁面標題</title>
</head>
<body>
  <%-- 內容 --%>
</body>
</html>

11. 完整範例:Hello World

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JSP Hello World</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>您的 IP:<%= request.getRemoteAddr() %></p>
  <p>伺服器時間:<%= new java.util.Date() %></p>
  <%-- JSP 註解:這行不會輸出到瀏覽器 --%>
</body>
</html>

最佳實踐總結

  1. 最小化 Scriptlet:改用 EL + JSTL + JavaBean + Controller Servlet
  2. 避免 Declaration 定義可變欄位:執行緒不安全
  3. 統一 UTF-8 編碼:page 指令 + meta charset + 資料庫連線 + 檔案儲存
  4. 善用 JSP 註解:移除調試碼、說明邏輯,不洩露資訊給瀏覽器
  5. 錯誤頁面配置:errorPage + isErrorPage="true" 統一異常處理
  6. 漸進式遷移:既有專案逐步引入 Controller (Servlet/Framework) 處理業務邏輯,JSP 專注視圖渲染
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved