JSP表达式语言和动态的属性名(JSP expression language and dynami

2019-06-28 07:08发布

我试图做一些事情,似乎应该是相对简单和运行到有点墙。

比方说,我已经得到了我公开为下名称的请求属性的产品清单products 。 我们还假设每个产品具有一id字段,并且我也有一堆请求属性的形式设置selectedProduct_<product-id>以指示选择哪些。

我知道有更好的方式来表示这些信息,如所有的选择IDS放置成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> 

但是,当然,这是不行的,因为它死在${! empty selectedProduct_${product.id}} ${! empty selectedProduct_${product.id}}

如果我硬编码的产品ID到表达,喜欢什么工作是:

${! empty selectedProduct_17}

......假设“17”是一个有效的产品ID。 显然,这是不实际的,但希望它说明了什么,我试图完成。 基本上我需要:

  1. 确定正确的selectedProduct_...值用在每个迭代forEach循环。 有些事情是如此简单<c:set var="key" value="selectedProduct_${product.id}"/>将做到这一点,但我不知道如何再取key ,并用它来获得的价值具有该名称请求属性(没有内部作弊运行字面Java代码<% %>块)。
  2. 获取请求属性的名字我在#1确定的值。 这似乎是最棘手的部分。

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

Answer 1:

您可以通过使用隐式对象 :

有对象允许访问使用范围的对象所描述的各种范围的变量。

  • PAGESCOPE:地图页面范围的变量名称到它们的值
  • requestScope:地图请求范围的变量名称到它们的值
  • sessionScope:地图会话范围的变量名称到它们的值
  • applicationScope:地图应用程序范围的变量名称到它们的值
当表达式引用这些对象的名字中的一个,相应的对象被返回,而不是相应的属性。 例如,$ {的pageContext}返回pageContext对象,即使存在包含一些其它的值的现有的pageContext属性。

因此,举例来说:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/>
${requestScope[selectedProductAttrName]}


文章来源: JSP expression language and dynamic attribute names
标签: java jsp jstl el