2013-06-04 18 views
3

我試圖創建基於BalusC's excellent article的複合材料組件。 我無法從支持組件獲取屬性或任何值。代碼:複合材料和cc之間的JSF2區別

<?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:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface componentType="test"> 
    <composite:attribute name="something" /> 
</composite:interface> 

<composite:implementation> 
    <h:outputText value="#{composite.attrs.something}" /> 
    <h:outputText value="#{composite.hello}" /> 
</composite:implementation> 
</html> 

我發現相同的代碼工作,然後我使用「cc」命名空間,而不是「複合」。代碼:

<?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:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:cc="http://java.sun.com/jsf/composite"> 

<cc:interface componentType="test"> 
    <cc:attribute name="something" /> 
</cc:interface> 

<cc:implementation> 
    <h:outputText value="#{cc.attrs.something}" /> 
    <h:outputText value="#{cc.hello}" /> 
</cc:implementation> 
</html> 

的問題是,爲什麼不與「複合」的命名空間的工作呢? 我找不到任何「複合」是JSF保留字或其他信息的信息。

謝謝。

回答

4

您在混淆XML名稱空間和implicit EL object#{cc}中的cc未引用當前正在使用的組合組件XML名稱空間。它只是引用EL範圍內的複合組件實例,並且是一個固定名稱。這個構造運行良好,使用composite XML命名空間。

<?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:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface componentType="test"> 
    <composite:attribute name="something" /> 
</composite:interface> 

<composite:implementation> 
    <h:outputText value="#{cc.attrs.something}" /> 
    <h:outputText value="#{cc.hello}" /> 
</composite:implementation> 
</html> 

(注:我寧願使用<ui:component>代替<?xml?><!DOCTYPE><html>,酷似爲您鏈接那裏的博客文章)

至於XML命名空間,composite是不必要的長和不在所有其他縮寫的XML命名空間中都不太適合,如h,f,c等。這就是爲什麼許多開發人員選擇使用cc而不是composite作爲由JSF本身的documented。請注意,複合標記文檔本身在所有示例中都使用#{cc},並使用composite XML名稱空間。

+2

哦,我明白了。感謝您的解釋。你是我們的JSF英雄;)。 – miro

+0

不客氣。 – BalusC

+0

也感謝註釋。 – miro