Когда уместно установить переменную области запроса в JSP? - PullRequest
5 голосов
/ 28 сентября 2011

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

1 Ответ

4 голосов
/ 28 сентября 2011

Этот раздел вы представили


<c:set var="itemUrl"><br/>  <jsp:include page="itemLink.jsp"><br/>    <jsp:param name="item" value="${currentItem}"/><br/>  </jsp:include><br/></c:set>

будет работать только в том случае, если itemLink.jsp имеет только значение для itemUrl и ничего больше (без дополнительного html-содержимого). Но вряд ли это так.

Рассмотрим случай, когда у вас есть объект Car в области запроса в вашем one.jsp, а ссылка на этой странице приводит вас к two.jsp, которому нужен этот же объект Car.

Тогда


<c:set var="myCar" value="${requestScope.car}" scope="request"/> 

сделает работу. Это было бы невозможно с методом (B).

Обновление: Что касается того, почему это невозможно сделать с помощью метода (B): В вашем фрагменте jsp: include включает в себя ответ JSP (текст), а затем ему присваивается значение itemUrl. Что, если вам необходимо присвоить сложный объект (нетекстовый, например, Car или ArrayList) атрибуту области запроса? Ответ JSP - это , как правило, HTML-текст.

Просто выдвигая альтернативу, почему бы не сделать так?


<br/><%-- Accepts a parameter named 'item' --%><br/><c:set var="urlTemplate" value="${param['item'].urlTemplate}" /><br/><c:choose><br/>  <c:when test="${empty urlTemplate}"><br/>    <a href value="/missingProductUrl.jsp"/><br/>  </c:when><br/>  <c:otherwise><br/>    <c:url var="itemUrl" scope="request" value="${urlTemplate}"><br/>      <c:param name="id" value="${param['item'].id}"/><br/>    </c:url><br/>    <c:out value="${itemUrl}"/><br/>  </c:otherwise><br/></c:choose><br/>

<br/><br/><jsp:include page="itemLink.jsp"><br/>  <jsp:param name="item" value="${currentItem}"/><br/></jsp:include><br/>

Все сказали, у меня вряд ли были ситуации, когда требовался c:set. Обычно установка любых атрибутов области видимости выполняется сервлетом / контроллером. JSP просто получит атрибут scoped и покажет его. Если бы JSP устанавливали атрибуты области действия, это было бы довольно сложно поддерживать. И было бы лучше ограничить использование c:set только настройкой атрибутов области страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...