如何打破clientID的暴政?

时间:2011-12-01 05:06:59

标签: jsf-2

我最不喜欢编写JSF 2.0表单的部分与处理各种输入元素的 id 属性有关。我一直无法在辅助bean中编写目标组件的clientID,特别是因为PrimeFaces tabView 现在包含 p:tab 元素的id作为clientID的。我浪费了大量时间编码,测试,然后重新编码那些clientID。

它让人联想到旧式汇编语言编程,您必须为分支和循环生成大量标签名称。我已经做了足够的一生。

我尝试的一种方法是仅使用自动生成的 id 属性。例如,我的表单中的一行可能如下所示。

<h:outputLabel value="Full Name:" />
<p:inputText value="#{editUser.user.fullName}"
             binding="#{editUser.compFullName}"/>
<p:message for="#{editUser.compFullName.clientId}" />

请注意,我没有明确的 id 属性。然后在支持bean中:

    String clientID = getCompFullName().getClientId();
    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, 
            "Summary Message For Full Name", "Detail Message Full Name");
    FacesContext.getCurrentInstance().addMessage(clientID, msg);

这总是有效,即使组件具有复杂的clientID,例如当PrimeFaces将 p:tab id插入clientID时。 (从3开始)。重新排列表单永远不会破坏任何内容。

但是,这很费力,因为我必须创建UIComponent属性,getter和setter,并使用绑定属性将它们绑定在表单中。谁能建议一个更好的方法呢?

1 个答案:

答案 0 :(得分:8)

  

因为我必须创建UIComponent属性,getter和setter,并在绑定属性的表单中绑定它们。任何人都可以提出更好的方法吗?

如果你根本不在那里使用它,则不需要将组件绑定到某个支持bean。只需将其绑定到视图:

<p:inputText value="#{editUser.user.fullName}"
             binding="#{compFullName}"/>
<p:message for="#{compFullName.clientId}" />

为了使代码更具自我记录功能,我建议HashMapfaces-config.xml放在请求范围内:

<managed-bean>
    <description>Holder of all component bindings.</description>
    <managed-bean-name>components</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<p:inputText value="#{editUser.user.fullName}"
             binding="#{components.fullName}"/>
<p:message for="#{components.fullName.clientId}" />

添加消息应该由ConverterValidator完成,分别将其作为ConverterExceptionValidatorException进行投标。它将自动结束于正确的消息持有者。或者,如果它是非正式消息,只需将其添加到已作为方法参数可用的UIComponent的客户端ID上。

另见: