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

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

假设我有一个产品列表,我在products名称下公开了一个请求属性。 我们还要说每个产品都有一个id字段,并且我还有一堆请求属性以selectedProduct_的forms设置,以指示选择了哪些。

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

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

   
${product.id}

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

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

${! empty selectedProduct_17}

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

  1. 确定要用于forEach循环中每次迭代的正确selectedProduct_...值。 像这样简单的事情会做到这一点,除了我不知道如何获取key并使用它来获取值的具有该名称的请求属性(没有在块中作弊和运行文字Java代码)。
  2. 获取名称我在#1中确定的请求属性的值。 这似乎是棘手的部分。

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

您可以使用隐式对象 :

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

  • pageScope:将页面范围的变量名称映射到它们的值
  • requestScope:将请求范围的变量名映射到它们的值
  • sessionScope:将会话范围的变量名映射到它们的值
  • applicationScope:将应用程序范围的变量名映射到它们的值

当表达式按名称引用其中一个对象时,将返回相应的对象而不是相应的属性。 例如,$ {pageContext}返回PageContext对象,即使现有的pageContext属性包含其他值也是如此。

所以,例如:

  ${requestScope[selectedProductAttrName]}