如何将验证器属性从 JSF2 复合组件传递给 h:inputText?

Posted

技术标签:

【中文标题】如何将验证器属性从 JSF2 复合组件传递给 h:inputText?【英文标题】:How to pass the validator property to a h:inputText from a JSF2 composite component? 【发布时间】:2012-03-15 03:55:09 【问题描述】:

我们有一个作为 JSF 2 组件创建的文本输入组件,它封装了标签和编辑字段 (h:inputText),它还负责布局。 我们目前的问题是让 inputField 的验证器属性暴露在我们的复合组件上。我们在 cc:interface 部分声明了属性,但是在 cc:implementation 中声明内部 h:inputText 时添加validator="#validator" 的问题是,当不使用该字段时,它会在运行时失败。

我想以与 h:inputText 相同的方式执行此操作,而无需注册自定义验证器。

对于这类问题是否有一些已知的解决方案?我们尝试创建一个自定义标签以在复合组件内部使用,但它过于复杂并且最终无法正常工作,所以我想问问专家是否有一种简单的方法。

注意:我想在我的复合组件的验证器属性中使用方法绑定表达式,就像原来的 h:inputText 一样。 感谢您的帮助!

【问题讨论】:

【参考方案1】:

我有一些带有特定掩码、验证和转换器的组件。

首先,我定义了一个名为“defaultText”的组件,如下所示:

</cc:interface>
    <cc:attribute name="value"/>
    <cc:editableValueHolder name="mycomp" targets="input"/>
</cc:interface>
<cc:implementation>
    <p:inputMask id="input" value="#cc.attrs.value"/>
</cc:implementation>

(为了节省空间,我还提供了一些其他属性)。看到 editableValueHandler 了吗?这是您定义将链接您的转换器/验证器的组件的地方。

所以,我使用我的“defaultText”组件来构建其他组件,例如,“text.xhtml”:

</cc:interface>
    <cc:attribute name="value"/>
    <cc:attribute name="mask"/>
    <cc:attribute name="jsfConverter"/>
    <cc:attribute name="jsfValidator"/>
</cc:interface>
<cc:implementation>
    <foo:defaultText id="dt" value="#cc.attrs.value" mask="#cc.attrs.mask">
        <c:if test="#!empty cc.attrs.jsfConverter">
            <f:converter converterId="#cc.attrs.jsfConverter" for="mycomp"/>
        </c:if>
        <c:if test="#!empty cc.attrs.jsfValidator">
            <f:validator validatorId="#cc.attrs.jsfValidator" for="mycomp"/>
        </c:if>
    </foo:defaultText>
</cc:implementation>

&lt;composite:editableValueHolder&gt; 定义任何验证器/转换器 (&lt;f:validator for="mycomp"&gt;) 都将关联到 &lt;p:inputMask id="input"&gt;

然后我在我的页面上使用我的文本组件:

<foo:text value="#dummyMBean.text" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>

【讨论】:

以上是关于如何将验证器属性从 JSF2 复合组件传递给 h:inputText?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2——在 f:ajax 上具有可选监听器属性的复合组件

JSF 2 复合组件渲染问题

JSF 2 - 如何将 Ajax 侦听器方法添加到复合组件接口?

EL作为属性传递给数据表内的复合组件时未解析

jsf 2.0 自定义组件/标签不复合

将数据从 Java/JSF2 bean 传递到 Javascript/jQuery 组件作为返回值的最佳方法