复合属性在jsf自定义组件中返回null

时间:2017-06-09 09:58:47

标签: jsf jsf-2 custom-component

我正在实现我的自定义组件,如下所示。放置此文件web->资源文件夹

<html
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:composite="http://java.sun.com/jsf/composite"
      >
    <h:body>
        <composite:interface>
            <composite:attribute name="width" default="300"/>
            <composite:attribute name="height" default="400"/>
        </composite:interface>
        <composite:implementation>
            <h:inputText style="height: #{composite.attrs.height}px"></h:inputText>
            <span> #{composite.attrs.height}</span>
        </composite:implementation>
    </h:body>
</html>

但是attrs.height什么也没有。

使用自定义组件,如下所示

<my:mycustom  height="40"></my:mycustom>

我在这里犯了什么错误。任何人都可以帮我这样做。

2 个答案:

答案 0 :(得分:0)

我发现了这个问题,使用命名空间作为复合来获取属性(#{composite.attrs.height}) 但这看起来并不正确,而是使用cc代替复合而且它的返回正确。

{cc.attrs.height}

答案 1 :(得分:0)

我知道有点晚了但是,我想回答你的问题,因为这里还没有有效的答案..

即便如此,你已经找到了空值原因,请将此作为答案提出建议。

您找到的内容: {cc.attrs.height} 是正确的,您必须通过“cc”访问属性,它不会更改名称空间,将其作为快速访问关键字比如“会话”,“请求”等等。

让我继续谈谈我的建议......

您的组件定义包含 html body 标记。通常不适用于组件定义。因为组件是页面的一部分,所以可以如下定义和使用它。

注意:您已将文件放在正确的位置,但我建议在资源文件夹中创建一个文件夹“ components ”。然后,它将通过以下命名空间定义在任何页面上可用:

xmlns:components="http://java.sun.com/jsf/composite/components"
  

myFirstComponent.xhtml

<ui:component xmlns=""
              xmlns:ui="http://java.sun.com/jsf/facelets"
              xmlns:composite="http://java.sun.com/jsf/composite" 
              xmlns:p="http://primefaces.org/ui"
              xmlns:f="http://java.sun.com/jsf/core">

    <composite:interface>
        <!-- Your attributes goes here -->
        <composite:attribute name="sampleAttributeName" default="@form"/>
    </composite:interface>

    <composite:implementation>
        <!-- Your implementation goes here -->
    </composite:implementation>
</ui:component>