По моему опыту, редко / никогда не нужно устанавливать 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>
otherPage.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}"/>
otherPage.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) , ни одна из этих проблем не является проблемой, поскольку переменные имеют только область видимости страницы.
EDIT:
Возможно, есть лучшее решение, чем (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>
otherPage.jsp
<c:set var="item" value="${currentItem}"/>
<%@ include page="itemLink.jsp" %>
<%-- 'itemUrl' has page scope --%>
<a href="${itemUrl}">Item Link</a>
Это все еще тот случай, когда ни альтернатива, (B) или (C) , не требует использования переменной области запроса. Есть ли какая-то причина для использования области запроса, которую я пропустил?