JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite

T

transdenzentral

Gast
Hallo Leute,

ich habe folgendes KSKB, was die Problematik darstellt. Vielleicht kurze Erklärung, bevor ich das eigentliche Problem schildere.

Setup:

  • Tomcat 7.0
  • Primefaces 3.4.1
  • Eclipse Juno
  • Test Browser: Firefox 16.0.2

Es gibt im Prinzip zwei Beans:

  • einmal ein einfacher Login (der eigentlich der Einfachheit halber nichts tut, außer die nächste Seite zurückgeben).
  • einmal eine Bean für die Tabelle, die ein paar Dummy Daten initalisiert, ein einfaches Datenmodell enthält und eben einen ausgewählten Datensatz speichern soll.

Dazu noch 2 XHTML Seiten

  • index.hxtml: Enthält einfach einen Button, der auf die LoginBean zugreift und auf die table.xhtml weiterleitet.
  • table.xhtml: Zeigt eine Tabelle an und soll über das Selektieren eines Datensatzes, diesen in das entsprechende Datenfeld der SomeSampleDataTableBean schreiben. Wenn man auf den darunterliegenden Button klickt, soll auf diesem Wert gearbeitet werden. (Den Fall, dass nichts ausgewählt ist und man trotzdem drauf drückt, sei mal zu vernachlässigen)

Die Problematik ist folgende (lässt sich in zwei Fälle aufteilen):

  1. Gehe ich direkt über den Browser auf die table.xhtml Seite, so geht das Selektieren einer Tabellenzeile sofort - in diesem Fall klappt alles, wie ich es erwarte.
  2. Gehe ich indirekt, also zuerst über die index.xhtml Seite (per Button Interaktion), auf die table.xhtml Seite, so wird das erste Selektieren einer Tabellenzeile praktisch "verschluckt" und die Selektion praktisch vom System nicht angenommen. Beim zweiten Selektieren klappt dann alles, wie ich es erwarte.

Prinzipiell geht es mir also um den 2.) Fall. Was mach ich falsch? Habe ich einen Denkfehler? Gibt's eine Lösung, sodass das funktioniert, wie ich mir das vorstelle?

Vielen Dank,
transdenzentral


Hier das KSKB:
Java:
package de.test.beans;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@SuppressWarnings("serial")
@ManagedBean
@SessionScoped
public class SimpleLoginBean implements Serializable {

	public SimpleLoginBean() {

	}

	public String login() {
		return "table.xhtml";
	}
}

Java:
package de.test.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.test.data.SomeSampleData;
import de.test.data.SampleTableDataModel;

@ManagedBean
@SessionScoped
@SuppressWarnings("serial")
public class SomeSampleDataTableBean implements Serializable {

	private final SampleTableDataModel dataModel;

	private SomeSampleData selectedData;

	public SomeSampleDataTableBean() {
		// fill with dummy data...
		List<SomeSampleData> dummy = new ArrayList<SomeSampleData>();
		String[] names = new String[] { "Test 1", "Test 2", "Test 3", };
		long a = 0;
		for (String name : names) {
			SomeSampleData q = new SomeSampleData(a);
			q.setName(name);
			dummy.add(q);
			a++;
		}
		// end of dummy data...
		dataModel = new SampleTableDataModel(dummy);

	}

	public void showSelected() {
		System.out.println("Selected: " + selectedData.getName());
	}

	public SampleTableDataModel getDataModel() {
		return dataModel;
	}

	public SomeSampleData getSelectedData() {
		return selectedData;
	}

	public void setSelectedData(SomeSampleData selectedData) {
		this.selectedData = selectedData;
	}
}


Java:
package de.test.data;

import java.util.List;

import javax.faces.model.ListDataModel;

import org.primefaces.model.SelectableDataModel;

public class SampleTableDataModel extends ListDataModel<SomeSampleData> implements
		SelectableDataModel<SomeSampleData> {

	public SampleTableDataModel(List<SomeSampleData> data) {
		super(data);
	}

	@Override
	@SuppressWarnings("unchecked")
	public SomeSampleData getRowData(String rowKey) {

		List<SomeSampleData> data = (List<SomeSampleData>) getWrappedData();
		for (SomeSampleData object : data) {
			if (object.getId().equals(Long.parseLong(rowKey))) {
				return object;
			}
		}
		return null;
	}

	@Override
	public Object getRowKey(SomeSampleData data) {
		return data.getId();
	}

}

Java:
package de.test.data;
import java.io.Serializable;

@SuppressWarnings("serial")
public class SomeSampleData implements Serializable{

	private String name;
	private Long id;

	public SomeSampleData(long id) {
		super();
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Questionnaire [name=" + name + "]";
	}

	public Long getId() {
		return id;
	}

}

HTML:
<!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:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui">

<h:head></h:head>
<h:body>
<h:form id="login">
<p:commandButton id="loginButton" value="Login" action="#{simpleLoginBean.login()}"></p:commandButton>
</h:form>

</h:body>
</html>

HTML:
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
	<h:form id="test">

		<p:dataTable id="sample" var="data"
			value="#{someSampleDataTableBean.dataModel}"
			selection="#{someSampleDataTableBean.selectedData}"
			selectionMode="single">
			<f:facet name="testdata"></f:facet>
			<p:ajax event="rowSelect" update="@form" />
			<p:column>#{data.name}</p:column>
		</p:dataTable>
	</h:form>

	<h:form id="testButton">
		<p:commandButton id="command"
			action="#{someSampleDataTableBean.showSelected()}" value="Test"></p:commandButton>
	</h:form>

</h:body>
</html>
 
Zuletzt bearbeitet von einem Moderator:

sence

Bekanntes Mitglied
Guten Morgen,

anbei 2 Fragen)
- hat es einen Grund, wieso du ein Datamodel verwendest ?
- warum soll die Datatable neu gerendert werden, wenn eine "row" selektiert wird,
sehe keine implementierte Funktion, die bei Auswahl einer Row irgend etwas modifiziert an der Datatable, dass diese
neu gerendert werden müsste.

bei Primefaces 3.4.1 kannst du auf das Modell zurückgreifen:
PrimeFaces - ShowCase

wenn du es aber dennoch wissen willst, schau dir mal die Ajax Response an, welche beim ersten mal (wo es nicht funktioniert)
zurück gegeben wird.


------------------------------------
Wenn du eine Aktion ausführen möchtest, implementiere dir die folgenden Listener:
<p:ajax event="rowSelect" listener="#{tableBean.onRowSelect}"
update=":form:display :form:growl" oncomplete="carDialog.show()" />
<p:ajax event="rowUnselect" listener="#{tableBean.onRowUnselect}" update=":form:growl"/>

(hier wird nicht die Datatable geupdated, sondern der Dialog und der growl -> FacesMessage)


Grüße
 
Zuletzt bearbeitet:
T

transdenzentral

Gast
Hi du,

hat es einen Grund, wieso du ein Datamodel verwendest ?

Ja, es hat einen Grund, warum ich ein DataModel verwende. Dieser ist aber mehr auf die eigentliche Anwendung zugeschnitten. Deshalb kommt das für das KSKB etwas verloren rüber ;)

warum soll die Datatable neu gerendert werden, wenn eine "row" selektiert wird,
sehe keine implementierte Funktion, die bei Auswahl einer Row irgend etwas modifiziert an der Datatable, dass diese
neu gerendert werden müsste.

Darin liegt vielleicht des eigentliche Problem. Ich möchte die ausgewählte Reihe (hinter der ja ein Objekt steht) in ein Datenfeld der Bean schreiben über
HTML:
selection="#{someSampleDataTableBean.selectedData}

Das Ganze floppt allerdings (auch wenn man das Beispiel von PF 3.4.1. im eigenen Projekt ausprobiert), denn es wird kein Wert an diese Stelle geschrieben und man freut sich über "null" ;) - Hintergrund ist also, dass die Selektion von Daten nicht wie gewünscht funktioniert (vielleicht habe ich auch einen kompletten Denkfehler).

Fakt ist, dass das von Dir verlinkte Beispiel in konkreter Form bei mir überhaupt nicht funktioniert, da in dem Datenfeld für die Selektion dann immer "null" steht.

Ich hatte das vorher auch über die besagten Listener gelöst (vgl. InstantRowSelect Beispiel im ShowCase), aber ich finde es doch irgendwie "hässlich", wenn ich da rumcasten muss, um das ausgewählte Objekt irgendwo zwischen zu speichern.

Die Dokumentation sagt dazu ja das im Anhang zu findende... - versteh also eigentlich nicht, warum das Ganze nicht funktioniert :D
 

Anhänge

  • pfDoku.PNG
    pfDoku.PNG
    35,2 KB · Aufrufe: 45
Zuletzt bearbeitet von einem Moderator:

sence

Bekanntes Mitglied
adde testweise nen System.out.println() in die Setter methode des Selectierten Objekten, wenn es nicht leer ist.

tauchen irgendwelche Fehler in der catalina.out auf, wenn sich die Row nicht selektieren lässt beim ersten mal ?
welches implementierung und Version von JSF 2 verwendest du ?
 
T

transdenzentral

Gast
  • JSF 2.1
  • Apache MyFaces 2.1.5

Ich habe mal in der dahinterliegenden Bean die besagten Syso Statements eingebaut.

Java:
public SomeSampleData getSelectedData() {
		System.out.println("getSelectedData()");
		return selectedData;
	}

	public void setSelectedData(SomeSampleData selectedData) {
		System.out.println("setSelectedData()");
		this.selectedData = selectedData;
	}

Unter Verwendung diese table.xhtml wird der Setter des selektierten Objekts nicht aufgerufen:

HTML:
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
	<h:form id="test">

		<p:dataTable id="sample" var="data"
			value="#{someSampleDataTableBean.dataModel}" selectionMode="single"
			selection="#{someSampleDataTableBean.selectedData}">
			<f:facet name="testdata"></f:facet>

			<p:column>#{data.name}</p:column>
		</p:dataTable>
	</h:form>

	<h:form id="testButton">
		<p:commandButton id="command"
			action="#{someSampleDataTableBean.showSelected()}" value="Test"></p:commandButton>
	</h:form>

</h:body>
</html>

Verwende ich dann
Code:
<p:ajax event="rowSelect"
				update="#{someSampleDataTableBean.selectedData}" />
bzw.
Code:
<p:ajax event="rowSelect"
				update="@form" />

wird der Setter immer aufgerufen. Allerdings auch nur, wenn ich beim ersten Mal direkt auf die Seite komme (URL: localhost:8080/Primefaces-KSKB/table.xhtml).

Komme ich über die index.xhtml auf die table.xhtml stellt sich das besagte Problem ein, dass die erste Selektion nicht zieht.


Fehlermeldungen gibt es in dieser Situation keinen.
 

jwiesmann

Bekanntes Mitglied
Ist glaube ich nen Bug .. du musst in der DataTable eine rowKey mit angeben.
Der sollte wenn möglich unique sein!
[XML]

<p:dataTable id="sample" var="data"
value="#{someSampleDataTableBean.dataModel}" selectionMode="single"
selection="#{someSampleDataTableBean.selectedData}" rowKey="#{data.id}">
<f:facet name="testdata"></f:facet>

<p:column>#{data.name}</p:column>
</p:dataTable>

[/XML]
 
T

transdenzentral

Gast
@jwiesmann

Das funktioniert leider gar nicht. Der rowKey sollte auf Grund des DataModel eigentlich nicht gebraucht werden (Primefaces Dokumentation).

Problem bleibt also weiterhin bestehen ...
 
Zuletzt bearbeitet von einem Moderator:

Nogothrim

Aktives Mitglied
muss der Testbutton sein eigenes Form haben? Versuch mal den Button in das Tabellenform mit reinzunehmen, oder gib dem Testbutton mal ein process=":test" Attribut. Was macht eigentlich die "testdata" facet?.
 
Zuletzt bearbeitet:
T

transdenzentral

Gast
muss der Testbutton sein eigenes Form haben? Versuch mal den Button in das Tabellenform mit reinzunehmen, oder gib dem Testbutton mal ein process=":test" Attribut. Was macht eigentlich die "testdata" facet?.

Die Facet ist der Tabellenkopf (vgl. Showcase PF. Ich hatte nur vergessen etwas reinzuschreiben bzw. den Namen auch wirklich auf "header" zu setzen für das KSKB.


Code:
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
	<h:form id="test">

		<p:dataTable id="sample" var="data"
			value="#{someSampleDataTableBean.dataModel}"
			selection="#{someSampleDataTableBean.selectedData}"
			selectionMode="single">

			<f:facet name="header">Testdata</f:facet>

			<p:column>#{data.name}</p:column>

			<f:facet name="footer">
				<p:commandButton id="command2"
					action="#{someSampleDataTableBean.showSelected()}" value="Test"></p:commandButton>
			</f:facet>
		</p:dataTable>
	</h:form>


</h:body>
</html>

Aber selbst, wenn ich den Button reinziehe in die Tabelle, wird der erste Klick (wenn man vom Index kommt) verschluckt.

Ob in selbiger Form oder außerhalb spielt also imho keine Rolle?! (im eigentlichen Projekt liegt der Button allerdings auch in einer anderen Form...)
 

jwiesmann

Bekanntes Mitglied
Ist zwar etwas von hinten durch die Brust, aber funktioniert vielleicht sowas:

Java:
String uri = "index.xhtml";
FacesContext.getCurrentInstance().getExternalContext().redirect(uri);

Weiß zwar noch nicht obs weiterhelfen kann, aber einen Versuch kann man ja machen :D
 

Nogothrim

Aktives Mitglied
hab deinen Code mal fast original ausprobiert, bei mir geht alles, auch nach redirect :)
Ich benutze allerdings Mojarra 2.1.10 und PF 3.4.2. Erfahrungen mit Myfaces hab ich nicht. Es kann durchaus sein, dass es was mit der jsf-impl zu tun hat. Bin bisher immer mit der Version, die PF auch im Showcase fährt ganz gut klarkgekommen.
Wenn etwas erst beim zweiten Request funktioniert, ist meistens immer was mit dem AJAX request komisch oder er findet irgendwelche ids nicht. Versuch mal bitte den Loginbutton mit ajax="false" aufzurufen.
 
T

transdenzentral

Gast
hab deinen Code mal fast original ausprobiert, bei mir geht alles, auch nach redirect :)
Ich benutze allerdings Mojarra 2.1.10 und PF 3.4.2. Erfahrungen mit Myfaces hab ich nicht. Es kann durchaus sein, dass es was mit der jsf-impl zu tun hat. Bin bisher immer mit der Version, die PF auch im Showcase fährt ganz gut klarkgekommen.
Wenn etwas erst beim zweiten Request funktioniert, ist meistens immer was mit dem AJAX request komisch oder er findet irgendwelche ids nicht. Versuch mal bitte den Loginbutton mit ajax="false" aufzurufen.

Jo, wenn ich ajax="false" beim Loginbutton setze, dann klappts auch in meiner Konfiguration! Danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JSF einfache DataTable PrimeFaces Web Tier 1
F Primefaces Datatable => Inplaces Web Tier 3
F Primefaces Datatable Web Tier 6
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
A JSF Suche Beispiel für Primefaces Tree als Navigation Web Tier 3
P JSF (Primefaces) SelectOneMenu Value auf Array wird nicht gesetzt Web Tier 0
M JSP PrimeFaces LayoutUnits <- breite lässt sich nicht erzwingen wenn 'center' Web Tier 0
T JSF Primefaces: selectedvalue von "selectmanyCheckbox" geht verloren Web Tier 0
W JSF Primefaces Selection Mode Web Tier 2
FINF_AW_Alex JSF PrimeFaces Dialog verlinken Web Tier 3
W JSF Primefaces Web Tier 5
F JSF Problem mit Primefaces Web Tier 7
F JSF Problem mit Primefaces Web Tier 4
S JQuery und Primefaces (Immer wieder Ärger damit) Web Tier 0
S Primefaces commandButton in einem Dialog/Form/PanelGrid führt actionListener nicht aus Web Tier 4
K JSON in Primefaces Table Web Tier 3
C JSF Zusammenarbeit Primefaces und Tomahawk. Web Tier 2
J JSF Grad der Barrierefreiheit von PrimeFaces, ICEFaces, RichFaces und OpenFaces Web Tier 2
P JSF Primefaces Picklist-Ersatz mit vielen Daten Web Tier 4
S primefaces picklist untereinander anordnen Web Tier 6
T JSF Primefaces beim öffnen eines p:dialog wird eine neue View ManagedBean erstellt Web Tier 2
M onNodeExpand listener in PrimeFaces Web Tier 4
F Primefaces Dialog Web Tier 7
F JSF Primefaces 3.3 treetable Web Tier 9
F PrimeFaces - selectOneMenu Web Tier 2
F PrimeFaces commandButton und actionListener Web Tier 6
F PrimeFaces p:selectOneMenu funktioniert nicht Web Tier 12
M JSF Dynamische Größe bei Primefaces Komponenten Web Tier 2
P PrimeFaces DataGrid Click "simulieren" Web Tier 5
J JSF2+primefaces? Web Tier 20
H JSF JSF 2.0 (Primefaces) commandLinks mit action="mypage.xhtml" ohne die URL im Browser zu ändern Web Tier 8
S JSF Primefaces Thema, Css wird geladen, nur die Bilder nicht, bzw Resource wird nicht aufgelöst Web Tier 5
F Primefaces Einstieg Web Tier 1
R Primefaces: No Library Found For This Namespace Web Tier 4
M Primefaces COmmandBUtton Web Tier 8
D JSF Ajax mit Facelets (PrimeFaces) Web Tier 4
Z Primefaces sieht grausam aus Web Tier 1
Z PrimeFaces (/ JSF) Konfigurationsproblem Web Tier 8
K jsf 1.2 tomahawk t:dataTable generic use Web Tier 3
W JSF DataTable - Filter Funktion funktioniert nicht Web Tier 3
F JSF h:dataTable fix Header und Scroll Body Web Tier 0
D JSF DataTable konvertiert Felder nicht Web Tier 1
K deleteButton in dataTable geht nur halb Web Tier 8
G JSP dataTable header - Datenwerte verwenden? Web Tier 3
F.S.WhiTeY JSF h:dataTable / p:komponente Pagination mit Buchstaben. Web Tier 2
jottyfan JSF dataTable und graphicImage (mit JQuery) Web Tier 4
M JSF Composite components - dynamische dataTable? Web Tier 8
M JSF DataTable refreshen mit Ajax? Web Tier 5
M JSF Datatable, nichts geht ohne vorher zu refreshen... Web Tier 4
P JSF 1.2 commandButton in dataTable Web Tier 2
L JSF Überflüssige Methodenaufrufe - dataTable Web Tier 5
T DataTable Composite-Component und ManyToOne Web Tier 5
J JSF Datatable bestimmte Methode Web Tier 4
T JSF/Richfaces rich:dataTable with rich:datascroller Web Tier 1
O Focus auf Textfeld, in letzter Reihe einer dataTable Web Tier 2
M Frage zur Konfiguration einer RichFaces DataTable Web Tier 4
M Datatable und der Zurückbutton Web Tier 4
K JSF Tomahawk dataScroller mit dataTable Web Tier 4
Y dataTable als dynamisches Grid Web Tier 4
E JSF Datatable erst nach Buttonklick anzeigen Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
V JSF: dataTable Getter wird nie aufgerufen Web Tier 6
S JSF dataTable Position feststellen Web Tier 2
S JSF: colspan und rowspan in datatable Web Tier 4
E JSF Datatable leere Zellen anzeigen Web Tier 2
T richfaces datatable Web Tier 3
A JSF: Datatable Links mit Properties Web Tier 3
S richfaces Datatable horizontal ausgeben Web Tier 2
pkm Probleme mit einem AJAX-Call in einem dynamischen Webprojekt Web Tier 15
S AJAX/RestController Post Problem Web Tier 18
J JSF/JEE6 asynchronie Statusmeldungen per ajax Web Tier 1
J Funktion für AJAX - Problem mit Return Web Tier 14
D Servlet 1 Servlet für alles - Wie Cookies per Ajax? Web Tier 1
J Wicket: Füllen von Textarea via AJAX irgendwo auf der PAGE Web Tier 1
S JSF mit Ajax? Web Tier 3
V Wie baue ich eine Ajax Webanwendung? Suche Beispielanwendung (UML) eines AJAX Service Web Tier 0
P JSF Ajax aktualisiert Seite neu Web Tier 2
L JSF Composit Component mit ajax funktioniert nicht. Web Tier 4
M Ajax Fehler zur Laufzeit Web Tier 5
S JSF SelectOneMenu - Probleme mit AJAX Web Tier 6
S JSF ComboBox mit JSF 2.0/ajax Web Tier 4
Kenan89 Class Funktion mit Ajax rufen Web Tier 13
P JSF tag "ajax" not found Web Tier 3
R JSF Mit Ajax ganze Seite neu laden Web Tier 2
J Ajax ist undefiniert Web Tier 3
P JSF AJAX render wird nicht ausgeführt Web Tier 4
M JSF Ajax Command Link Web Tier 2
X Seite wird mit AJAX neu geladen Web Tier 4
J JSF AJAX-Aufruf ohne Komponente Web Tier 4
S Richfaces 4.0 Ajax Waitingpanel Web Tier 2
G JSF 2x h:selectManyCheckbox ohne duplikate Auswahl/selectManyCheckbox und f:ajax Web Tier 3
P JSF Login per Ajax validieren. Was ist der Beste Weg? Web Tier 4
S Ajax Request verhindert forward? Web Tier 8
P JSF Ajax refresh nach Linkklick Web Tier 4
B Ajax JSON Objekt verschicken Web Tier 3
N Htmlunit Test mit Ajax Web Tier 2
G mit Ajax ein Image vom Server holen Web Tier 2
J JSP und Ajax Web Tier 6
7 Struts+AJAX- Session-Handling? Web Tier 2
H Richfaces - Taglib Problem gelb unterstrichen Ajax Output Web Tier 6

Ähnliche Java Themen

Neue Themen


Oben