2010-08-13 63 views
9

這必須很簡單。我正在嘗試將子元素傳遞給JSF組件。我有我的組件聲明:在JSF 2.0組件中包含子元素

<?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:ui="http://java.sun.com/jsf/facelets" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
</composite:interface> 

<composite:implementation> 
    <div style="border: 1px solid black;"> 
     <ui:insert /> 
    </div> 
</composite:implementation> 

</html> 

然後我用這一個頁面的:​​「世界,你好」

<box:box> 
    <p>Hello world!</p> 
</box:box> 

不幸的是,盒子呈現OK(黑色邊框),但文字不包含在其中。我還嘗試使用<ui:insert name="content"><ui:define name="content">Hello World!</ui:define>調用更詳細的語法,但它不起作用。

我可能在哪裏犯錯?

回答

12

好了解更多關於複合元素我想通了。您應該使用<composite:insertChildren />而不是:

<?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:ui="http://java.sun.com/jsf/facelets" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
</composite:interface> 

<composite:implementation> 
    <div style="border: 1px solid black;"> 
     <composite:insertChildren /> 
    </div> 
</composite:implementation> 

</html> 

這是有效的。

0

您必須將內容發送作爲參數:

<?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:ui="http://java.sun.com/jsf/facelets" 
     xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute name="content"/> 
    </composite:interface> 

    <composite:implementation> 
     <div style="border: 1px solid black;"> 
      <h:outputText value="#{cc.attrs.content}" escape="false"/> 
     </div> 
    </composite:implementation> 

</html> 

並在代碼:

<box:box content="<p>Hello world!</p>" /> 

我加入了escape="false",因爲你正在使用的EL表達式中的HTML標籤。

David Geary’s article

+1

是的,這將是一種方式來做到這一點,但它是非常醜陋的設計。另外,如果我想要使用更長的XHTML/JSF代碼作爲子元素呢?將內容作爲字符串屬性傳遞是不方便的。相反,我嘗試過的樣式(使用'')應該可以工作,如http://www.packtpub.com/article/creating-composition-components-in-jsf-2.0所示(請參閱「元素合成組件「)。本書的JSF 2 API和JBoss Seam也介紹了這種方法。但是,在我的測試中,它失敗了。 – 2010-08-13 10:58:40