组件ID形式:composite:j_id2已在视图中找到

Mic*_*tti 5 duplicates composite-component jsf-2

/test.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:composite="http://java.sun.com/jsf/composite/components">
    <f:view>

        <h:head>
            <title>Default Title</title>
        </h:head>

        <h:body>
            <h:form id="form">
                <composite:test id="composite"/>
            </h:form>
        </h:body>

    </f:view>

</html>
Run Code Online (Sandbox Code Playgroud)

/resources/components/test.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:composite="http://java.sun.com/jsf/composite/components"
      xmlns:p="http://primefaces.org/ui">

    <head>
        <title>(For validation only)</title>
    </head>

    <body>
    <cc:interface>
    </cc:interface>

    <cc:implementation>

        <p:panel header="header foo bar">

            <p:panel>
                <f:facet name="header">
                    <h:outputText value="foo"/>

                    <h:outputText value="bar"/>
                </f:facet>
            </p:panel>

        </p:panel>

    </cc:implementation>

</body>

</html>
Run Code Online (Sandbox Code Playgroud)

这种组合给出:

GRAVE: Error Rendering View[/test.xhtml]
java.lang.IllegalStateException: Component ID form:composite:j_id2 has already been found in the view.  
Run Code Online (Sandbox Code Playgroud)

用这棵树:

GRAVE: JSF1007: Duplicate component ID form:composite:j_id2 found in view.
GRAVE: +id: j_id1
 type: javax.faces.component.UIViewRoot@47080ae5
  +id: javax_faces_location_HEAD
   type: com.sun.faces.component.ComponentResourceContainer@2daf59b3
    +id: j_id3
     type: javax.faces.component.UIOutput@532a0e33
    +id: j_id4
     type: javax.faces.component.UIOutput@6e0a60ec
    +id: j_id5
     type: javax.faces.component.UIOutput@6b615e64
    +id: j_id6
     type: javax.faces.component.UIOutput@457c2e4f
    +id: j_id7
     type: javax.faces.component.UIOutput@5bc4682c
    +id: j_id8
     type: javax.faces.component.UIOutput@3b934fc5
  +id: j_idt37
   type: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  +id: j_idt38
   type: <html xmlns="http://www.w3.org/1999/xhtml">

  +id: j_idt39
   type: javax.faces.component.UIOutput@610364d1
    +id: j_idt40
     type: 
            <title>Default Title</title>

  +id: j_idt55
   type: javax.faces.component.UIOutput@25d00719
    +id: form
     type: javax.faces.component.html.HtmlForm@7c820db3
      +id: composite
       type: javax.faces.component.UINamingContainer@3e51a2a1
        +id: j_id2
         type: javax.faces.component.UIPanel@445a2d11
          +id: j_idt52
           type: org.primefaces.component.panel.Panel@618c17fd
            +id: j_idt53
             type: org.primefaces.component.panel.Panel@347b1513
              +id: j_id2
               type: javax.faces.component.UIPanel@7c44da25
                +id: j_idt50
                 type: javax.faces.component.html.HtmlOutputText@7ca4ad4f
                +id: j_idt54
                 type: javax.faces.component.html.HtmlOutputText@1f6e5d77
  +id: j_idt47
   type: 
</html>
Run Code Online (Sandbox Code Playgroud)

但是,如果我以这种方式更改复合组件:

/resources/components/test.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:composite="http://java.sun.com/jsf/composite/components"
      xmlns:p="http://primefaces.org/ui">

    <head>
        <title>(For validation only)</title>
    </head>

    <body>
    <cc:interface>
    </cc:interface>

    <cc:implementation>

        <p:panel header="header foo bar">

            <p:panel>
                <f:facet name="header">
                    <h:panelGroup>
                        <h:outputText value="foo"/>

                        <h:outputText value="bar"/>
                    </h:panelGroup>
                </f:facet>
            </p:panel>

        </p:panel>

    </cc:implementation>

</body>

</html>
Run Code Online (Sandbox Code Playgroud)

添加<h:panelGroup>in <f:facet>可以解决问题.坏树索引或我错过了什么?我在Glassfish 3.1.1下使用mojarra 2.1.3和PrimeFaces 3.0.M4-SNAPSHOT.

Mar*_*shi 7

根据JSF2文档,<f:facet>标签只能有一个孩子.如果你想要在facet标签中嵌套很多元素,你应该首先将它们包装在其他容器中<h:panelGroup>,然后将该单个父容器放入<f:facet>.

正是你所做的!

这是参考:

JavaServer Faces 2.0,完整参考 - 作者:Ed Burns,Chris Schalk

(ISBN-10:0071625097 | ISBN-13:978-0071625098)

页面编号:538

抽象:

F:小标签意味着有其封闭标签的特殊关系嵌套的组件.例如,声明表的"标题"由JSF组件提供.此元素将JSF操作表示的组件作为具有指定名称的facet添加到由最接近的JSF组件父操作元素表示的组件中.此标记仅允许一个组件本身嵌套.要将多个组件用作构面,请将它们创建为简单容器组件的子项.例如,将相应的HTML库组件操作嵌套在bodyGroup组件中.