Когда уместно устанавливать переменную области запроса в JSP?

По моему опыту, редко / никогда не требуется устанавливать 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) ничего из этого не является проблемой, потому что переменные всегда имеют только область действия страницы.

РЕДАКТИРОВАТЬ:

Возможно, есть лучшее решение, чем (B) :

(C) Использование статического include

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) , не требует использования переменной с областью действия запроса. Есть ли причина для использования области запроса, которую я пропустил?

5
задан Spencer Small 28 September 2011 в 19:18
поделиться