JSF Wiederverwendbare Tabelle

miketech

Bekanntes Mitglied
Hallo zusammen,

ich habe in meiner JSF-Anwendung eine Tabelle, die im Grunde an mehreren Stellen in gleicher Art aber mit unterschiedlichen Inhalten auftaucht. Das ist in etwa vergleichbar mit einer Tabelle für Adressen und mal sollen in einer Anwendung die Adressen von Geschäftsleuten, von privaten Personen etc. angezeigt werden.

D.h. ich möchte im Grunde parametrisieren, aus welcher Quelle die Daten stammen, es handelt es sich aber immer um den gleichen Datentyp, der angezeigt werden soll. Es geht mir somit nur, um die Quelle, wo die Daten herkommen. Nun ist die Frage, ob ich die Tabelle jedes mal mit allem drum und dran neuschreiben muss, oder ob ich diese nicht irgendwie wiederverwenden kann. Also angenommen ich erstelle nun eine Composite Component. Aber wie parametrisiere ich das dann?

Hier ist die Tabelle:

HTML:
<ui:component>

    <h:form>
		<p:dataTable styleClass="detailsSpecificsTable" id="annotations"
			var="annotation" selectionMode="single" selection="#{semanticAnnotationsTable.selectedSemanticAnnotation}" 
			value="#{semanticAnnotationsTable.semanticAnnotationsDataModel}">
			
			<p:ajax event="rowSelect"
				listener="#{semanticAnnotationsTable.onRowSelect}" update="@(:button)"
				/>
			
			<f:facet name="header">
				<h:outputText value="Semantic annotations for this element"></h:outputText>
			</f:facet>
			
			<p:column headerText="Type" style="width:100px">
				<h:outputText
					value="#{annotation.semanticAnnotationType}">
				</h:outputText>
			</p:column>
	
			<p:column headerText="Value" style="width:100px">
				<p:inputText value="#{annotation.value}"></p:inputText>
			</p:column>
			
		</p:dataTable>
	</h:form>
	
</ui:component>

D.h. derzeit ist es bereits eine Component, die ich mittels include einbinde.

Die Daten kommen ja aus dem DataModel. Das sieht derzeit so aus:

Code:
	public SemanticAnnotationsDataModel getSemanticAnnotationsDataModel() {
		List<SemanticAnnotationWrapper> semanticAnnotations = architectureManagement.getSemanticAnnotations(details.getArchitectureElementWrapper());
		return new SemanticAnnotationsDataModel(semanticAnnotations);
	}

D.h. zunächst rufe ich die Daten ab und gebe dann ein DataModel auf Basis dieser Daten zurück. Nun müsste ich genau diese erste Zeile dynamisch gestalten. Kann ich irgendwie sowas machen:

Code:
	public SemanticAnnotationsDataModel getSemanticAnnotationsDataModel(SemanticAnnotationWrapper source) {
		return new SemanticAnnotationsDataModel(source);
	}

D.h. die Quelle als Parameter übergeben und das nun noch im XHTML entsprechend ändern? Sowas wie:


HTML:
<ui:component>

    <h:form>
		<p:dataTable styleClass="detailsSpecificsTable" id="annotations"
			var="annotation" selectionMode="single" selection="#{semanticAnnotationsTable.selectedSemanticAnnotation}" 
			value="#{semanticAnnotationsTable.semanticAnnotationsDataModel(source)}">
			
...

Derzeit ist es eine Bean mit RequestScope. Geht das dann noch gut, wenn ich die Tabelle auf einer Seite mehrmals habe? Also erstellt er mir dann mehrere Instanzen der Bean?

Eine Alternative, die mir noch eingefallen ist, wäre für jeden Fall immer das Backend, also die Beans neu zu schreiben und dann nur die Oberfläche zu parametrisieren. Also dann die entsprechende Bean als Parameter zu übergeben. Das ist ja kein Problem. Damit würde ich zumindest eventuelle Kollissionen bei mehreren Tabellen auf einer Seite umgehen. Aber wäre trotzdem gut zu wissen, ob es eine Alternative gibt, die eleganter ist.

Hat jemand eine Idee, wie ich das lösen kann?

Viele Grüße

Mike
 
Zuletzt bearbeitet:

Nogothrim

Aktives Mitglied
Du möchtest glaub ich composite components verwenden, tust da aber irgendwas anderes. ui:component kenn ich nicht, composite components baut man z.B. so:

[XML]
<!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" xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">

<composite:interface>
<composite:attribute name="value" required="true" />
</composite:interface>

<composite:implementation>
<p:dataTable value="#{cc.attrs.value}" var="row">
<p:column>
custom stuff here
</p:column>
</p:dataTable>
</composite:implementation>

</html>
[/XML]
Wenn du so eine xhtml z.B. als myDataTable.xhtml in webapp/resources/components/myNameSpace/myDataTable.xhtml speicherst, kannst du sie überall wiederverwenden.

Du musst dann in anderen xhtml Seiten wo die Komponente verwendet werden soll
[XML]xmlns:myNameSpace="http://java.sun.com/jsf/composite/components/myNameSpace"[/XML]
deklarieren und kannst dann mit <myNameSpace:myDataTable value="#{stuff.list}" /> die Komponente verwenden.
 

miketech

Bekanntes Mitglied
Hi,

ja, das hatte ich auch einmal versucht, das hat nicht wirklich funktioniert, die Seite war immer leer. Irgendwie hat er die Ressource nicht gefunden :) Aber ich probiere es noch einmal.

Wie gehe ich aber dann mit der ManagedBean im Hintergrund um? Wird die dann auch mehrfach instanziiert?

Gruß

Mike
 

Ähnliche Java Themen


Oben