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