Spe*_*all 5 jsp scope jstl dynamic-scope lexical-scope
根据我的经验,很少/永远不需要设置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>
Run Code Online (Sandbox Code Playgroud)
<jsp:include page="itemLink.jsp">
<jsp:param name="item" value="${currentItem}"/>
</jsp:include>
<%-- 'itemUrl' has request scope --%>
<a href="${itemUrl}">Item Link</a>
Run Code Online (Sandbox Code Playgroud)
<%-- 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}"/>
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
有没有理由使用(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>
Run Code Online (Sandbox Code Playgroud)
<c:set var="item" value="${currentItem}"/>
<%@ include page="itemLink.jsp" %>
<%-- 'itemUrl' has page scope --%>
<a href="${itemUrl}">Item Link</a>
Run Code Online (Sandbox Code Playgroud)
仍然存在这样的情况:(B)和(C)都不需要使用请求范围的变量.是否有一些理由使用我错过的请求范围?
您介绍的这一部分
<c:set var="itemUrl">
<jsp:include page="itemLink.jsp">
<jsp:param name="item" value="${currentItem}"/>
</jsp:include>
</c:set>
Run Code Online (Sandbox Code Playgroud)
仅当 itemLink.jsp 仅具有 itemUrl 的值而没有其他值(无其他 html 内容)时才有效,但这几乎不是一种情况。
考虑这样一种情况,您的 one.jsp 的请求范围内有一个 Car 对象,并且此页面中的链接将您带到需要相同 Car 对象的 Two.jsp。
然后
<c:set var="myCar" value="${requestScope.car}" scope="request"/>
Run Code Online (Sandbox Code Playgroud)
会做的工作。这对于方法(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>
Run Code Online (Sandbox Code Playgroud)
<jsp:include page="itemLink.jsp">
<jsp:param name="item" value="${currentItem}"/>
</jsp:include>
Run Code Online (Sandbox Code Playgroud)
总而言之,我几乎没有遇到过 c:set需要的情况。通常,任何范围属性的设置都是由 servlet/控制器完成的。JSP 只会获取一个作用域属性并显示它。如果 JSP 设置范围属性,那么维护起来会非常困难。最好将 的使用限制c:set为仅设置页面范围的属性。
| 归档时间: |
|
| 查看次数: |
26144 次 |
| 最近记录: |