如何打破clientID的暴政?

Ala*_*ect 1 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}" />
Run Code Online (Sandbox Code Playgroud)

请注意,我没有明确的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);
Run Code Online (Sandbox Code Playgroud)

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

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

Bal*_*usC 8

因为我必须创建UIComponent属性,getter和setter,并在绑定属性的表单中绑定它们.谁能建议更好的方法呢?

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

<p:inputText value="#{editUser.user.fullName}"
             binding="#{compFullName}"/>
<p:message for="#{compFullName.clientId}" />
Run Code Online (Sandbox Code Playgroud)

为了使代码更加自我记录,我建议HashMap在请求范围中添加faces-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>
Run Code Online (Sandbox Code Playgroud)

<p:inputText value="#{editUser.user.fullName}"
             binding="#{components.fullName}"/>
<p:message for="#{components.fullName.clientId}" />
Run Code Online (Sandbox Code Playgroud)

添加消息应该由一个Converter或一个人来完成,或者将Validator它们分别作为一个ConverterException或一个ValidatorException.它将自动结束于正确的消息持有者.或者,如果它是非正式消息,只需将其添加到UIComponent已作为方法参数可用的客户端ID上.

也可以看看: