【问题标题】:JSP expression language and dynamic attribute namesJSP 表达式语言和动态属性名称
【发布时间】:2012-09-13 07:01:04
【问题描述】:

我正在尝试做一些看起来应该相对简单的事情,并且遇到了一些障碍。

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

我知道有更好的方法来表示此信息,例如将所有选定的 id 放入 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}} 上死了。

如果我将产品 ID 硬编码到表达式中会起作用,例如:

${! empty selectedProduct_17}

...假设“17”是有效的产品 ID。显然这不切实际,但希望它说明了我正在努力实现的目标。基本上我需要:

  1. 确定要用于forEach 循环中每次迭代的正确selectedProduct_... 值。像&lt;c:set var="key" value="selectedProduct_${product.id}"/&gt; 这样简单的东西可以做到这一点,除非我不确定如何获取key 并使用它来获取具有该名称的请求属性的值(没有作弊和在@987654334 中运行文字Java 代码@块)。
  2. 获取我在#1 中确定的名称的请求属性的值。这似乎是棘手的部分。

这可能使用纯 JSP/JSTL 吗?我知道我可以在&lt;% %&gt; 中运行一些Java 代码来解决这个问题,但这似乎是非常糟糕的形式。肯定存在更优雅的解决方案吗?

【问题讨论】:

    标签: java jsp jstl el


    【解决方案1】:

    您可以使用implicit objects:

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

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

    所以,例如:

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

    【讨论】:

    • 2021 年仍然有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多