JSF复合组件验证

时间:2010-12-02 11:47:54

标签: validation jsf jsf-2 composite-component

我想创建复合组件并将一些验证器附加到它的子节点,但我希望验证中的消息附加到复合组件,而不是它的子节点。

在使用复合组件的页面中,我想要这样的东西:

<zzz:mycomponent id="my" />
<h:message for="my" />

现在它不起作用,因为消息是组件的子组件,而不是组件组件本身。如何为整个组件制作它?

或者甚至更好,我想在复合组件中添加验证器,例如:

<zzz:mycomponent id="my" validator="#{bean.validateComposite}" />

接收类似booleans数组的值作为值,因为在复合组件内部有h:selectBooleanCheckbox个元素。这可能吗?

2 个答案:

答案 0 :(得分:1)

回答这个问题可能很晚,但我应该这样做:

<zzz:mycomponent id="my">
   <f:event type="postValidate" listener="#{bean.doValidation}"/>
</zzz:mycomponent>

然后在“容器”中验证子项后调用doValidation。方法看起来像这样:

public void doValidation(ComponentSystemEvent event) {
    ...
}

您在该方法中有两个选项:

  • 访问子组件(event.getComponent()。getChildren())并对您在这些子项上提交的值执行任何操作。

  • 或者遍历FacesMessages并重新分配clientId,以便将它们放在容器组件上(id = my)

答案 1 :(得分:1)

您必须将下一个代码放在复合定义中

      <cc:interface>
          .....
          <cc:editableValueHolder name="attName" targets="Idcomponent" /><!--It allows to acces to the composite-->
          <cc:facet name="textMessage"/>                                 <!--Define the Facet-->
      </cc:interface>
      <cc:implementation id="#{cc.attrs.id}" >
          ......
          <h:inputText id="Idcomponent" value="#{cc.attrs.value}" required="#{cc.attrs.required}"/>
          <cc:renderFacet name="textMessage"/>
      </cc:implementation>

您可以在JSF页面中使用

      <zzz:textBox id="txbTest" label="#{}" value="#{}" >
           <f:validateLongRange for="attName" minimum="-10" maximum="10"/>
           <f:facet name="textMessage">
                <h:message for="value" style="color: blue"/>
            </f:facet>
      </zzz:textBox>

或另一种选择可能是:

      <zzz:textBox id="txbTest" label="#{}" value="#{}" validator="#{bean.yourValidateMethod}" >
           <f:facet name="textMessage">
                <h:message for="value" style="color: blue"/>
            </f:facet>
      </zzz:textBox>