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。 显然这不实用,但希望它说明了我想要实现的目标。 基本上我需要:
- 确定要用于
forEach
循环中每次迭代的正确selectedProduct_...
值。 像这样简单的事情会做到这一点,除了我不知道如何获取
key
并使用它来获取值的具有该名称的请求属性(没有在块中作弊和运行文字Java代码)。
- 获取名称我在#1中确定的请求属性的值。 这似乎是棘手的部分。
这是否可以使用纯JSP / JSTL? 我知道我可以在运行一些Java代码来解决这个问题,但这似乎是非常糟糕的forms。 当然存在更优雅的解决方案?
您可以使用隐式对象 :
有些对象允许访问使用范围对象中描述的各种范围变量。
- pageScope:将页面范围的变量名称映射到它们的值
- requestScope:将请求范围的变量名映射到它们的值
- sessionScope:将会话范围的变量名映射到它们的值
- applicationScope:将应用程序范围的变量名映射到它们的值
当表达式按名称引用其中一个对象时,将返回相应的对象而不是相应的属性。 例如,$ {pageContext}返回PageContext对象,即使现有的pageContext属性包含其他值也是如此。
所以,例如:
${requestScope[selectedProductAttrName]}