我将值表达式存储在带有 f:attribute 标签的 JSF 组件中,例如:
<h:inputText ...>
<f:attribute name="myId1" value="#{bean.prop1}" />
<f:attribute name="myId2" value="#{bean.prop2}" />
<f:attribute name="myId3" value="#{bean.prop3}" />
</h:inputText>
有没有办法以编程方式访问所有这些值表达式? (不知道名称 myId1、myId2、...)
JSF 2.1 规范的第 9.4.2 节说这些值存储在“组件的 ValueExpression Map”中。
这是完整规范中唯一出现的术语“ValueExpression Map”。
我如何访问该 map ?
在 Jboss/Mojarra 实现的 UIcomponent 方法 getValueExpression() 中,映射
getStateHelper().get(UIComponentBase.PropertyKeys.bindings)
用于获取单值表达式。
我猜那张 map 是“ValueExpression Map”的超集?
我可以确定所有实现和所有继承的(标准)组件都使用该映射来存储 ValueExpressions?
谢谢。
最佳答案
从理论上讲,您应该可以通过 UIComponent#getAttributes()
看到它们。 :
Map<String, Object> attributes = component.getAttributes();
for (Map.Entry<String, Object> entry : attributes.entrySet()) {
System.out.printf("name=%s, value=%s%n", entry.getKey(), entry.getValue());
}
但是,这并不像您期望的那样工作。它只返回静态属性。这似乎永远不会被修复/实现。另见 JSF issue 636 .我建议坚持使用带有预定义前缀和增量数字后缀的属性,就像您在示例中所展示的那样。这也是我一直用来将附加信息从组件传递到自定义验证器和转换器的方法。您可以按如下方式收集它们:
Map<String, Object> attributes = component.getAttributes();
List<Object> values = new ArrayList<Object>();
for (int i = 1; i < Integer.MAX_VALUE; i++) {
Object value = attributes.get("myId" + i);
if (value == null) break;
values.add(value);
}
System.out.println(values);
关于jsf - JSF 组件的 "ValueExpression Map",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684465/