JSP Scriptlet 中可直接使用 Java switch 語句,適合「單一變數對多個定值」的分支情境。本文說明語法、貫穿特性、字串支援(Java 7+)、Enum 搭配,並推薦 JSTL <c:choose> 替代腳本片段。
<%@ page contentType="text/html;charset=UTF-8" %>
<%
int day = 3; // 0=Sun ... 6=Sat
switch (day) {
case 0: out.println("星期日"); break;
case 1: out.println("星期一"); break;
case 2: out.println("星期二"); break;
case 3: out.println("星期三"); break;
case 4: out.println("星期四"); break;
case 5: out.println("星期五"); break;
case 6: out.println("星期六"); break;
default: out.println("無效日期");
}
%>
關鍵字: break 終止貫穿;default 捕獲未匹配值。
<%
int temp = 64;
switch (temp) {
case 60: case 61: case 62:
out.println("太冷"); break;
case 63: case 64: case 65:
out.println("涼爽"); break;
case 66: case 67: case 68: case 69:
out.println("舒適"); break;
case 70: case 71: case 72: case 73: case 74: case 75:
out.println("溫暖"); break;
default:
out.println("炎熱");
}
%>
多個 case 連寫共用同一區塊,減少重複代碼。
<%
String method = "GET";
switch (method) {
case "GET": out.println("查詢"); break;
case "POST": out.println("新增"); break;
case "PUT": out.println("修改"); break;
case "DELETE": out.println("刪除"); break;
default: out.println("不支援");
}
%>
編譯器內部透過 hashCode + equals 實現,效能優於連續 if-else。
public enum OrderStatus { NEW, PAID, SHIPPED, DONE, CANCELLED }
// JSP
<%
OrderStatus status = OrderStatus.PAID;
switch (status) {
case NEW: out.println("新訂單"); break;
case PAID: out.println("已付款"); break;
case SHIPPED: out.println("已出貨"); break;
case DONE: out.println("完成"); break;
case CANCELLED:out.println("取消"); break;
}
%>
Enum switch 編譯期檢查完整性,避免漏寫 case。
<c:choose> 替代方案(推薦)<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<c:choose>
<c:when test="${day == 0}">星期日</c:when>
<c:when test="${day == 1}">星期一</c:when>
<c:when test="${day == 2}">星期二</c:when>
<c:when test="${day == 3}">星期三</c:when>
<c:when test="${day == 4}">星期四</c:when>
<c:when test="${day == 5}">星期五</c:when>
<c:when test="${day == 6}">星期六</c:when>
<c:otherwise>無效日期</c:otherwise>
</c:choose>
優點:無 Scriptlet、EL 運算式可讀、支援複雜條件(${user.role == 'ADMIN' and user.active})。
| 場景 | 建議 |
|---|---|
| 整數/Enum/字串 等值多分支 | Java switch(Scriptlet)或 JSTL choose |
| 範圍判斷、複合條件 | if-else / JSTL choose |
| 高效能熱路徑 | Controller 處理完傳結果,JSP 只顯示 |
| 現代專案 | 禁用 Scriptlet,全面 JSTL/EL/Thymeleaf |
break 導致非預期貫穿。case 後接變數而非常量(需為編譯期常量)。switch(String) 編譯失敗。out.println 產生換行,HTML 輸出建議用 out.print 配合標籤。