JSP表达式语言和动态属性名称

aro*_*oth 7 java jsp jstl el

我正在尝试做一些似乎应该相对简单并且碰到一点墙的东西.

假设我有一个产品列表,我将其作为名称下的请求属性公开products.我们还要说每个产品都有一个id字段,并且我还有一堆请求属性以表格形式设置,selectedProduct_<product-id>以指示选择哪些.

我知道有更好的方法来表示这些信息,例如将所有选定的ID放入a Map并进行检查,但我们假设我无论出于何种原因都无法访问该方法.

所以我想做的是products只有在selectedProduct_...为当前产品设置属性时才迭代并发出一些标记.就像是:

<c:forEach var="product" items="${products}">
    <c:if test="${! empty selectedProduct_${product.id}}">
        <div class="productId">${product.id}</div>
    </c:if>
</c:forEach> 
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用,因为它会消失${! empty selectedProduct_${product.id}}.

如果我将product-id硬编码到表达式中,将会起作用,例如:

${! empty selectedProduct_17}

...假设'17'是有效的产品ID.显然这不实用,但希望它说明了我想要实现的目标.基本上我需要:

  1. 确定selectedProduct_...循环中每次迭代使用的正确值forEach.<c:set var="key" value="selectedProduct_${product.id}"/>除了我不确定如何key使用它来获取具有该名称的request属性的值(没有在<% %>块中作弊和运行文字Java代码)之外,还有一些简单的事情.
  2. 获取名称我在#1中确定的请求属性的值.这似乎是棘手的部分.

这可能使用纯JSP/JSTL吗?我知道我可以在其中运行一些Java代码<% %>来解决这个问题,但这似乎是非常糟糕的形式.当然存在更优雅的解决方案?

Jas*_*ies 17

您可以使用隐式对象:

有些对象允许访问使用范围对象中描述的各种范围变量.

  • pageScope:将页面范围的变量名称映射到它们的值
  • requestScope:将请求范围的变量名映射到它们的值
  • sessionScope:将会话范围的变量名映射到它们的值
  • applicationScope:将应用程序范围的变量名映射到它们的值
当表达式按名称引用其中一个对象时,将返回相应的对象而不是相应的属性.例如,$ {pageContext}返回PageContext对象,即使现有的pageContext属性包含其他值也是如此.

所以,例如:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/>
${requestScope[selectedProductAttrName]}
Run Code Online (Sandbox Code Playgroud)