我最不喜欢编写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,并使用绑定属性将它们绑定在表单中.谁能建议更好的方法呢?
因为我必须创建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上.
| 归档时间: |
|
| 查看次数: |
3129 次 |
| 最近记录: |