根据我的经验,很少/从不需要设置scope="request"
EL 变量。
例如,我有一个页面,给定一个item
参数,根据其属性构造一个特定于该项目的 URL。此页面包含在需要呈现项目链接的任何页面中。
(A) 使用请求范围的变量
itemLink.jsp
<%-- Accepts a parameter named 'item' --%>
<c:set var="urlTemplate" value="${param['item'].urlTemplate}" />
<c:choose>
<c:when test="${empty urlTemplate}">
<c:set var="itemUrl" scope="request" value="/missingProductUrl.jsp"/>
</c:when>
<c:otherwise>
<c:url var="itemUrl" scope="request" value="${urlTemplate}">
<c:param name="id" value="${param['item'].id}"/>
</c:url>
</c:otherwise>
</c:choose>
其他页面.jsp
<jsp:include page="itemLink.jsp">
<jsp:param name="item" value="${currentItem}"/>
</jsp:include>
<%-- 'itemUrl' has request scope --%>
<a href="${itemUrl}">Item Link</a>
(B) 没有请求范围的变量
itemLink.jsp
<%-- Accepts a parameter named 'item' --%>
<c:set var="urlTemplate" value="${param['item'].urlTemplate}" />
<c:choose>
<c:when test="${empty urlTemplate}">
<c:set var="itemUrl" value="/missingProductUrl.jsp"/>
</c:when>
<c:otherwise>
<c:url var="itemUrl" value="${urlTemplate}">
<c:param name="id" value="${param['item'].id}"/>
</c:url>
</c:otherwise>
</c:choose>
<c:out value="${itemUrl}"/>
其他页面.jsp
<c:set var="itemUrl">
<jsp:include page="itemLink.jsp">
<jsp:param name="item" value="${currentItem}"/>
</jsp:include>
</c:set>
<%-- 'itemUrl' has page scope --%>
<a href="${itemUrl}">Item Link</a>
有什么理由使用(A)而不是(B)吗?我的回答是否定的,理由如下:
使用(A),您需要记住在同一请求期间处理的任何其他页面都会看到
itemUrl
,因此您应该避免名称冲突。它还使得跟踪 EL 变量的来源变得更加困难,因为除了搜索在同一请求期间处理的所有页面之外,无法找到请求范围变量的设置位置。使用(B),这些都不是问题,因为变量只有页面范围。
编辑:
也许有比(B)更好的解决方案:
(C) 使用静态包含
itemLink.jspf
<%-- Accepts a parameter named 'item' --%>
<c:set var="urlTemplate" value="${param['item'].urlTemplate}" />
<c:choose>
<c:when test="${empty urlTemplate}">
<c:set var="itemUrl" value="/missingProductUrl.jsp"/>
</c:when>
<c:otherwise>
<c:url var="itemUrl" value="${urlTemplate}">
<c:param name="id" value="${param['item'].id}"/>
</c:url>
</c:otherwise>
</c:choose>
其他页面.jsp
<c:set var="item" value="${currentItem}"/>
<%@ include page="itemLink.jsp" %>
<%-- 'itemUrl' has page scope --%>
<a href="${itemUrl}">Item Link</a>
仍然存在替代方案(B)和(C)都不需要使用请求范围变量的情况。使用我错过的请求范围有什么原因吗?