# Spaltenüberschriften weg sobald Column als Composite Component



## Tatsu (20. Mrz 2011)

Hallo,
ich habe das Problem, dass die *Spaltenüberschriften* einer Primefacestabelle (DataTable) *nicht mehr angezeigt* werden, sobald ich meine *Composite Component* anstelle der Primefaces-Column verwende. Sowohl die Überschriften als auch Suchfeld und Sortierfunktion werden nicht mehr angezeigt (siehe auch beigefügter Screenshot). 

*Frage:* Wie muss ich die Composite Componente anpassen, damit die Header angezeigt werden?

*Die Composite Component:*

```
<!-- INTERFACE -->
        <cc:interface componentType="org.primefaces.component.Column" preferred="true" shortDescription="Extended Datatable">
            <cc:attribute name="value" />
            <cc:attribute name="title" />
        </cc:interface>

        <!-- IMPLEMENTATION -->
        <cc:implementation>
            <cc:actionSource name="#{component}">
                <p:column sortBy="#{cc.attrs.value}" filterBy="#{cc.attrs.value}">
<!-- Header wird nicht angezeigt -->
                    <f:facet name="header">
                        <h:outputText value="#{cc.attrs.title}" />
                    </f:facet>
<!-- Spalte (Column) wird angezeigt -->
                    <h:outputText value="#{cc.attrs.value}" />
                </p:column>
            </cc:actionSource>
        </cc:implementation>
```


*Die JSF-Seite:* (ohne Sortierfunktion und Filter, also nur mit Spaltenüberschrift)

```
<!-- Mit Composite Component (funktioniert nicht) -->
        <h:form>
            <p:dataTable value="#{licenseController.licenseList}" var="row">
                <f:facet name="header">
                    Lizenzen
                </f:facet>
                <mc:column title="Product" value="#{row.product.shortname}"/>
            </p:dataTable>
        </h:form>


       <!-- OHNE Composite Component (funktioniert) -->
        <h:form>
            <p:dataTable value="#{licenseController.licenseList}" var="row">
                <f:facet name="header">
                    Lizenzen
                </f:facet>
                <p:column  sortBy="#{row.product.shortname}" filterBy="#{row.product.shortname}">
                    <f:facet name="header">
                        <h:outputText value="Produkt" />
                    </f:facet>
                    <h:outputText value="#{row.product.shortname}" />
                </p:column>
            </p:dataTable>
        </h:form>
```

Ich bin Newbie und verstehe einfach nicht was ich hier falsch mache. Ich habe schon diverse Varianten ausprobiert. In meinen 2 JSF-Büchern und der Primeface-Doku wird nicht näher auf dieses Problem eingegangen. Es ist mir ein Rätsel warum die Spaltenüberschriften nicht angezeigt werden.

Goggle hat auch nicht geholfen. Bin für jedem Tip dankbar.

Viele Grüße

Bastian


----------



## JimPanse (21. Mrz 2011)

<cc:actionSource/> ist falsch! 

"...cc:actionSource:
Dieses Tag definiert einen Namen, unter dem eine interne Komponente verfügbar ist, die ActionSource2 implementiert" 

Ich schätze mal du hast das Bsp aus JSF 2.0@Work -> da wird es aber in Verbindung mit einem toggle-Panel verwendet. Du willst ja lediglich etwas darstellen... d.h. entferne das tag dann sollte es funktionieren


----------



## Tatsu (22. Mrz 2011)

Hallo JimPanse,

ohne actionSource werden nun auch die Zeileninhalte nicht mehr angezeigt. Ich habe mal einen Screenshot angehangen.

*Screenshotbeschreibung:*
Oben: DataTable ohne Composite Component (funktioniert)
Mitte: DataTable mit Composite Component (Zeilen ok, aber keine Header)
Unter DataTable mit Composite Component ohne Action Source (auch keine Zeilen mehr)

*Angepasste Component (ohne actionSource):*

```
<!-- INTERFACE -->
        <cc:interface componentType="org.primefaces.component.Column" preferred="true" shortDescription="Extended Datatable">
            <cc:attribute name="value" />
            <cc:attribute name="title" />
        </cc:interface>

        <!-- IMPLEMENTATION -->
        <cc:implementation>
                <p:column sortBy="#{cc.attrs.value}" filterBy="#{cc.attrs.value}">
                    <f:facet name="header">
                        <h:outputText value="#{cc.attrs.title}" />
                    </f:facet>
                    <h:outputText value="#{cc.attrs.value}" />
                </p:column>
        </cc:implementation>
```

Das Entfernen hat also leider nichts gebracht. Vielmehr sind jetzt auch die Zeilen weg.

Danke und Grüße

Bastian


----------



## JimPanse (22. Mrz 2011)

In unserem Projekt verwenden wir noch die "alten" Variante von composite-components und  die sind mit der neuen JSF 2.0 Version kompatibel d.h. haben wir uns noch nicht die Mühe gemacht zu switchen...

column.xhtml

```
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:cc="http://java.sun.com/jsf/composite">

		<p:column sortBy="#{value}" filterBy="#{value}">
			<f:facet name="header">
				<h:outputText value="#{title}" />
			</f:facet>
			<h:outputText value="#{value}" />
		</p:column>

</ui:composition>
```

deine.taglib.xml


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
                                "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
 <namespace>http://www.deinnamespace.de/my</namespace>

  <tag>
  <tag-name>column</tag-name>
  <source><path>/column.xhtml</source>
 </tag>

</facelet-taglib>
```

web.xml


```
?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
....
 <context-param>
  <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
  <param-value>/WEB-INF/deine.taglib.xml</param-value>
 </context-param>

</web-app>
```

Aufruf


```
<ui:composition template="/WEB-INF/templates/main.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:my="http://www.deinnamespace.de/my"
	xmlns:p="http://primefaces.prime.com.tr/ui">

	<ui:define name="content">

				<p:dataTable value="#{ColumnControllerTest.users}"
					var="user" dynamic="true"
					rows="10" paginatorPosition="bottom"
					rowIndexVar="rowIndex" paginator="true"
					firstPageLinkLabel="#{msg.first}" lastPageLinkLabel="#{msg.last}"
					nextPageLinkLabel="#{msg.next}"
					previousPageLinkLabel="#{msg.previous}">
					<my:column value="#{user.username}" title="Username"/>
					</p:dataTable>
	</ui:define>
</ui:composition>
```

Das funktioniert wunderbar! Mit der neuen Variante habe ich es auch versucht bin aber auch gescheitert! 
Vielleicht hilft die der Code-Schnipsel aber erstmal weiter!


Gruß


----------



## Tatsu (22. Mrz 2011)

Hallo JimPanse,

das ist ja super. Deine Lösung funktioniert auch bei mir perfekt! Vielen Dank für Deine Hilfe.

Es ist übrigens völlig unproblematisch möglich, den DataTable als Composite Component zu implementieren. Nur für die Spalten (Column) scheint das auf die "neue Weise" nicht zu klappen.

Ich habe hier mal eine Variante ausprobiert mit einem DataTable als Composite Component und den Columns wie von Dir beschrieben. Das funktioniert. Die Techniken scheinen sich also kombinieren zu lassen.

Viele Grüße

Bastian


----------

