5

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>

(B)よりも(A)を使用する理由はありますか? 私の答えはノーです。理由は次のとおりです。

  • ( 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>

otherPage.jsp

<c:set var="item" value="${currentItem}"/>
<%@ include page="itemLink.jsp" %>

<%-- 'itemUrl' has page scope --%>
<a href="${itemUrl}">Item Link</a>

(B)(C)も、リクエストスコープの変数を使用する必要はありません。見逃したリクエストスコープを使用する理由はありますか?

4

1 に答える 1

4

あなたが提示したこのセクション


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

itemLink.jspにitemUrlの値のみがあり、他には何もない場合にのみ機能します(追加のhtmlコンテンツはありません)が、そのような場合はほとんどありません。

one.jspのリクエストスコープにCarオブジェクトがあり、このページのリンクから、この同じCarオブジェクトを必要とするtwo.jspに移動する場合を考えてみます。

それで


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

仕事をします。これはmethod(B)では不可能です。

更新: メソッド(B)では不可能な理由について:スニペットにjsp:includeにJSP(テキスト)の応答が含まれ、それがitemUrlに設定されます。複雑なオブジェクト(CarやArrayListなどの非テキスト)をリクエストスコープの属性に割り当てる必要がある場合はどうなりますか?通常、 JSP応答はhtmlテキストです。

代替案を提案するだけで、このようにレンダリングしてみませんか?



<%-- Accepts a parameter named 'item' --%>
<c:set var="urlTemplate" value="${param['item'].urlTemplate}" />
<c:choose>
<c:when test="${empty urlTemplate}">
<a href 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:out value="${itemUrl}"/>
</c:otherwise>
</c:choose>



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

とにかく、必要な状況はほとんどありません c:setでした。通常、スコープ属性の設定はサーブレット/コントローラによって行われます。JSPは、スコープ属性を取得して表示するだけです。JSPがスコープ属性を設定している場合、保守はかなり困難になります。c:setまた、の使用をページスコープの属性の設定のみに制限することをお勧めします。

于 2011-09-28T18:57:58.997 に答える