疑問:`${pageContext.request.queryString}` 中 `queryString` 是否等同 `HttpServletRequest.getQueryString()`?EL 中為何省略 `get`?
核心規則
- `pageContext` 即 JSP 隱含物件 `pageContext` (型別 `PageContext`)。
- EL 存取屬性遵循 JavaBeans 慣例:`${obj.prop}` → `obj.getProp()` / `obj.isProp()` (boolean)。
- 鏈式存取:`${pageContext.request.queryString}` 依次呼叫 `pageContext.getRequest().getQueryString()`。
常用鏈路速查
| EL 路徑 | 對應 Servlet API |
| `${pageContext.request.method}` | `request.getMethod()` |
| `${pageContext.session.id}` | `session.getId()` |
| `${pageContext.servletContext.contextPath}` | `application.getContextPath()` |
| `${pageContext.response.locale}` | `response.getLocale()` |
注意事項
- **唯讀**:EL 只能讀取屬性 (getter),**無法呼叫帶參數方法** (如 `request.getParameter("id")`),需改用 `${param.id}` 隱含物件。
- **空值安全**:鏈路中任一環為 `null`,整條表達式輸出空字串,**不拋 NPE**。
- **型別轉換**:EL 自動處理基本型別包裝、集合/陣列長度 (`${list.size}` → `list.size()`)。
- **不需下載 EL API 文檔**,《Java EE 7 Tutorial》第 5 章 / Oracle 官方 JSP 2.3 Spec 即為權威參考。
最佳實踐
- 複雜邏輯移至 Java Bean / Controller 準備好資料,JSP 僅用 EL 顯示。
- 避免在 EL 中做運算/判斷,改用 JSTL `` `` 或自訂 EL 函數。
- 啟用 `isELIgnored="false"` (預設開啟),若關閉需在 `web.xml` 或頁面指令開啟。
參考博客:EL 表達式詳解、pageContext 九大隱含物件