如何将验证器属性从 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>
<composite:editableValueHolder>
定义任何验证器/转换器 (<f:validator for="mycomp">
) 都将关联到 <p:inputMask id="input">
。
然后我在我的页面上使用我的文本组件:
<foo:text value="#dummyMBean.text" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>
【讨论】:
以上是关于如何将验证器属性从 JSF2 复合组件传递给 h:inputText?的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2——在 f:ajax 上具有可选监听器属性的复合组件