【问题标题】:Jsf composite components attribute doesn't workJsf 复合组件属性不起作用
【发布时间】:2012-09-21 06:39:08
【问题描述】:

我正在尝试创建复合组件。我在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" />

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

【问题讨论】:

    标签: jsf-2 composite-component


    【解决方案1】:

    (不是一个真正的答案,但评论太长了。只是想分享一些可能有帮助的想法......请在适当的情况下编辑或替换)

    你没有描述你遇到的行为,所以我猜测组件内部的值不会随着你传入的值而改变。

    我在相同的设置中遇到了类似的问题,但是当我直接传入“true”或“false”时(如您的示例所做的那样),它起作用了。只有当我交出一个 EL 表达式时,组件内部的值才不再设置,而不管表达式的计算结果如何。就我而言,我在属性上设置了显式类型,例如type="java.lang.Boolean" 删除这个定义就行了。

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用这种方法。

      <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}"/>
      

      这是 hack,但工作)

      【讨论】:

        【解决方案3】:

        我也经历过一次组件的奇怪行为。原来是

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

        所以尝试将属性重命名为ident。也许其他常见的属性如requiredvalue 也是一个问题......

        我遇到的具体的、更有趣的情况如下:

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

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

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

        【讨论】:

          【解决方案4】:

          尝试使用另一个属性: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>
          

          【讨论】:

            猜你喜欢
            • 2013-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-02
            • 2014-05-10
            • 2013-02-02
            • 1970-01-01
            • 2012-01-09
            相关资源
            最近更新 更多