在 JSP 中嘗試寫:
<a href="<%= request.getContextPath() %>/user/login">登錄</a>
<form action="<%= request.getContextPath() %>/submit">...</form>
雖然能運行,但屬於**腳本小程式**,不符合現代 JSP 最佳實務(JSP 2.0+ 推薦 EL + JSTL,禁用 scriptlet)。
<a href="${pageContext.request.contextPath}/user/login">登錄</a>
<form action="${pageContext.request.contextPath}/submit">...</form>
| 方式 | 優點 | 缺點 |
|---|---|---|
| `<%= request.getContextPath() %>` | 直觀、舊版相容 | Scriptlet,混合 Java/HTML,難維護、不支援頁面編譯優化、安全審查不通過 |
| `${pageContext.request.contextPath}` | 標準 EL、無 Java 代碼、自動轉義、IDE 提示、可在靜態分析通過 | 需啟用 EL(`isELIgnored="false"`,預設開啟) |
| ` | 自動補全 contextPath、支援參數編碼、最規範 | 需引入 JSTL 標籤庫 |
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<a href="<c:url value='/user/login'/>">登錄</a>
<form action="<c:url value='/submit'/>" method="post">...</form>
| 框架 | 語法 |
|---|---|
| Spring MVC (JSP) | ` |
| Thymeleaf | `@{/user/login}` (自動含 contextPath) |
| JSF | `#{request.contextPath}/user/login` |
在 ``、`