Jsf复合组件属性不起作用

时间:2012-09-21 06:39:08

标签: jsf-2 composite-component

我正在尝试创建复合组件。我在composite:interface部分中定义了4个属性。这是代码

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface >
    <composite:attribute name="id" />
    <composite:attribute name="maxlength" />
    <composite:attribute name="required"/>
    <composite:attribute name="value" />
</composite:interface>

<composite:implementation  xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
        <p:inputTextArea id="#{cc.attrs.id}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} /  #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>

        <h:outputText id="#{cc.attrs.id}_counter"/>
</composite:implementation>
</html>

这是我使用我的组件的页面

     <kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="true"/>
<p:message for="gpAdres" />

奇怪的部分是必需的属性不起作用,但其他人工作正常。我无法找到它为什么会这样。

4 个答案:

答案 0 :(得分:4)

(不是一个真正的答案,但评论的时间太长。只是想分享一些可能有帮助的想法......如果合适,请编辑或替换)

您没有描述您遇到的行为,因此我猜测组件内的值不会随您传入的值而改变。

我在相同的设置中遇到了类似的问题,但是当我直接传入“true”或“false”时(如您的示例所示),它可以正常工作。只有当我移交EL表达式时,无论表达式的计算结果如何,组件内的值都不会再设置。在我的例子中,我在属性上设置了显式类型,例如type="java.lang.Boolean"删除此定义就可以了。

我的猜测是,当强制该属性期望布尔值时,它无法处理EL并将其解析为默认值Boolean(除非设置了default="false",否则它似乎为真)。

通过不设置类型,组件似乎可以保留EL并将其传递给下一个目标,例如任何h:tag的渲染属性。

似乎不是您的确切问题,但也许它有助于追踪问题?

答案 1 :(得分:0)

您可以使用此方法。

<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="true" rendered="#{yourBooleanExpression}"/>
<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="false" rendered="#{!yourBooleanExpression}"/>

这是黑客,但工作)

答案 2 :(得分:0)

我也经历过一次奇怪的组件行为。事实证明,

中的值 id 存在问题
<composite:attribute name="id" />

因此,尝试将属性重命名为 ident 。也许其他常见名称属性如requiredvalue也是一个问题...

具体,更有趣的情况是:

<composite:attribute name="id" requred="true" />

的工作。注意requred中的拼写错误。当我修复拼写错误时,组件不再起作用,抱怨我没有为必需的标记id属性指定值,尽管我确实提供了一个值。解决方案是重命名复合属性:

<composite:attribute name="ident" required="true" />

答案 3 :(得分:0)

尝试使用另一个属性:id是为复合标记保留的,所以你应该尝试这个:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface >
    <composite:attribute name="inputTextId" />
    <composite:attribute name="maxlength" />
    <composite:attribute name="required"/>
    <composite:attribute name="value" />
</composite:interface>

<composite:implementation  xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
        <p:inputTextArea id="#{cc.attrs.inputTextId}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} /  #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>

        <h:outputText id="#{cc.attrs.inputTextId}_counter"/>
</composite:implementation>
</html>