Spaltenüberschriften weg sobald Column als Composite Component

Tatsu

Mitglied
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:
HTML:
        <!-- 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)
HTML:
       <!-- 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
 

Anhänge

  • CCP.png
    CCP.png
    11,4 KB · Aufrufe: 38
Zuletzt bearbeitet:

JimPanse

Bekanntes Mitglied
<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

Mitglied
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):
HTML:
<!-- 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
 

Anhänge

  • CCP5.png
    CCP5.png
    64,7 KB · Aufrufe: 43

JimPanse

Bekanntes Mitglied
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
Code:
<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

Code:
<?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

Code:
?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

Code:
<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

Mitglied
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
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben