jsf - JSF 组件的 "ValueExpression Map"

标签 jsf

我将值表达式存储在带有 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/

相关文章:

java - dataTable 中的 JSF/Primefaces selectBooleanCheckbox 组件始终未选中

java - 为什么 UIComponent 中的 encodeXxx 方法接受 FacesContext 参数?

java - 如何使冰居中 :confirmationPanel within a modal ice:panelPopup (ICEfaces)?

jsf - 为什么JSF要处理整个表单

HtmlDataTable(richfaces)渲染上的javascript函数

JSF 1.2 Tomcat 重新部署错误

JSF 动态资源路径

java - 每个 jsf 的 C 都不起作用。日本科学基金会

java - JSF 2.0 自定义验证问题

javascript - 解析错误/page.xhtml : Error Traced[line: 42] Open quote is expected for attribute "{1}" associated with an element type "id"