/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>
/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>
这种组合给出了:
GRAVE: Error Rendering View[/test.xhtml]
java.lang.IllegalStateException: Component ID form:composite:j_id2 has already been found in the view.
用这棵树:
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>
但是,如果我以这种方式更改复合组件:
/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>
在<h:panelGroup>
中添加<f:facet>
可以解决问题。
坏树索引或我错过了什么?我在Glassfish 3.1.1下使用mojarra 2.1.3和PrimeFaces 3.0.M4-SNAPSHOT。
答案 0 :(得分:7)
根据JSF2文档,<f:facet>
标记只能有一个子标记。如果要在facet标记中嵌套许多元素,则应首先将它们包装在<h:panelGroup>
之类的其他容器中,然后将该单个父容器放在<f:facet>
中。
你到底做了什么!
JavaServer Faces 2.0, The Complete Reference - 作者:Ed Burns,Chris Schalk
(ISBN-10:0071625097 | ISBN-13:978-0071625098)
页码:538
摘要:
f:facet 标记表示具有特殊功能的嵌套组件 与其封闭标签的关系。例如,说明了 表的“头”将由JSF组件提供。这个元素 将JSF操作所代表的组件添加到其正文中作为 具有指定名称的facet表示的组件 最接近的JSF组件父动作元素。此标记仅允许一个 要嵌套的组件本身。 使用多个组件作为 facet,将它们创建为简单容器组件的子项。对于 例如,在其中嵌套相应的HTML库组件操作 正文 panelGroup 组件。
答案 1 :(得分:0)
关于错误JSF1007,请查看:artilce