JSF DataTable refreshen mit Ajax?

membersound

Bekanntes Mitglied
Hallo,

ich möchte eine <h:datatable> dynamisch nach dem Erstellen neuer Elemente refreshen.
Dafür habe ich 3 Ansätze, und wüsste gerne welcher zu Bevorzugen ist:

1. mit @Observes
Java:
public class Facade {

 private List<Customer> customerList;

 public void createNew() {
  service.create(newCustomer);
  event.fire(newCustomer);
 }
 
 public void onCustomerChanged(@Observes(notifyObserver = Reception.IF_EXISTS) final Customer newCustomer) {
  findAll();
 }

 @PostConstruct
 public void findAll() {
  customerList = service.findByNamedQuery("Customer.ALL");
 }

 public List<Customer> getCustomerList() {
  return customerList;
 }
}

2. oder aber lasse die observer weg, und rufe die findAll() direkt aus der create methode aus auf:
Java:
public void createNew() {
  service.create(newCustomer);
  findAll();
}

3. mit ajax
Java:
public void createNew() {
  service.create(newCustomer);
}

<h:form>
<h:commandButton id="register" action="#{facade.createNew()}" value="Register">
<f:ajax execute="@form" render = ":customerTable" />
</h:commandBUtton>
</h:form>

<h:datatable id="customerTable" var="_customer" value="facade.customerList">...

Das Problem hier ist: Ansatz 3 gefällt mir am besten, da kein zusätzliche Code in der Javaklasse notwendig ist. Nur funktioniert der Ajax-Ansatz so nicht! Denn da ich die findAll() methode hierbei weder über observer noch explizit aufrufe, wird customerList immer erst beim post-construct erneuert. Das führt dazu: ich füge Customer1 hinzu - nicht passiert. Ich füge Cust2 hinzu - die table wird aktualisiert und zeigt Cust1. usw.


Wie bekomme ich den Ansatz mit Ajax wie gewollt zum laufen?

Danke
 

sence

Bekanntes Mitglied
möglichkeit 3 würde ich bevorzugen.
nach dem hinzufügen des neuen Customers, wird dieser auch der Liste hinzugefügt ?
(das sehe ich aus der Klasse nicht, da du es über Service machst)

i.d.r müsste es so gehen wie du es beschrieben hast.
Habe einige Webapplikationen, die so laufen.
ggf zeig mal bitte deine Service Klasse.
 

membersound

Bekanntes Mitglied
Nein, also die create Methode im Service persistiert den Customer bloß:
Java:
public Class service {

	public Customer create(Customer c) {
		this.em.persist(c);
		this.em.flush();
		this.em.refresh(c);
		return c;
	}

}

Das Problem ist ja folgendes: wenn ich ohne Ajax arbeite, dann wird mit dem Buttonslick meine komplette Page neu geladen. Dh über das @PostConstruct wird damit automatisch ein findAll() ausgeführt, sodass die CustomerList geupdatet wird.
Wenn ich aber mit Ajax arbeite, dann entfällt das neuladen der Page ja. Dh das PostConstruct bringt mir da nichts mehr, weil ja nur ein Teil der Page neu gerendert wird. Was ich ja auch beabsichtige - nämlich nur eine Tabelle mit CustomerDetails.
Dh aber auch: ich muss mich selbst darum kümmern, dass die findAll() innerhalb der createNew() Methode in der Facade ausgeführt wird. Denn sonst wird meine customerList ja nicht geupdatet.

Sprich: nach meinem obigen Beispiel muss ich 2) + 3) aus meinem Ausgangsposting kombinieren. Richtig? Oder geht es besser/einfacher?

Oder anders gesagt: ich würde mir das gerne sparen, immer mich darum kümmern zu müssen dass die customerList geupdatet wird.
Ich muss ja quasi für jede Methode in meiner Facade, die etwas am Customer-Objekt ändert, die findAll() Methode ausführen. Was je nach Umfang zu einer ganzen Menge doppeltem Code führt. In meinem Beispiel zugegeben vernachlässigbar klein, aber mir geht es hier ja eher ums Prinzip. Denn funktionieren tut es so ja auch. Ist mMn eben nur irgendwie unelegant.

Java:
@Named
@RequestScoped
public class Facade {

	@Inject
	private Service<Customer> service;

	@Inject
	private Customer newCustomer;

	private List<Customer> customerList;

	@PostConstruct
	public void findAll() {
		customerList = service.findByNamedQuery("Customer.ALL");
	}

	public void createNew() {
		service.create(newCustomer);
		findAll();
	}
}
 

sence

Bekanntes Mitglied
Hallo,

du must nur das neue Customer Objekt deiner Liste in der Klasse Facade hinzufügen nachdem du es persistent gemacht hast.
customerList.add(newCustomer);
somit brauchst du nicht noch einmal die Komplette Datenbank abzufragen, spart auch performance :)
und bei delete:
customerList.remove(oldCustomer);
 

membersound

Bekanntes Mitglied
Ok das ist schonmal gut zu wissen, danke!

Aber dh auch, im muss mich immer selbst drum kümmern die Liste uptodate zu halten? Das kann man nicht "automatisieren"?
 

sence

Bekanntes Mitglied
Guten Morgen,

habe eben noch einmal in die Bücher geschaut und nichts gefunden :(
wirst leider nicht herum kommen deine Liste anschließend selbst du aktualisieren.
Denke das die
liste.add(Object);
liste.remove(Object);
Funktionaufrufe nicht so wild sind (nur pro Vorgang einen Funktionaufruf -> createCustomer und deleteCustomer)

Wenn du das Objekt manuell deiner Liste hinzufügst, benötigst du auch keine erneute sql Abfrage, ebenso beim delete.
spart kosten und Zeit :)

Grüße und Danke für das Danke
lg Sence
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JSF Datatable, nichts geht ohne vorher zu refreshen... Web Tier 4
K jsf 1.2 tomahawk t:dataTable generic use Web Tier 3
W JSF DataTable - Filter Funktion funktioniert nicht Web Tier 3
W JSF einfache DataTable PrimeFaces Web Tier 1
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
T JSF Primefaces: DataTable Ajax Update - Weiterleitung von anderer Seite Web Tier 11
F Primefaces Datatable => Inplaces Web Tier 3
F Primefaces Datatable Web Tier 6
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
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
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
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
D JSF Ajax mit Facelets (PrimeFaces) Web Tier 4
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
S Framework, AJAX Drag and Drop Hilfe? Web Tier 2
H Welches Ajax Framework Web Tier 8
7 Struts und Ajax. Problem mit Actions Web Tier 2
F AJAX: Inhalt nachladen + load icon Web Tier 2
I AJAX - Problem Web Tier 18
I AJAX update Web Tier 2
T <f:ajax> in JSF2.0 Komponente ein- und ausblenden Web Tier 4
D [JSF] Center per Ajax wechseln Web Tier 3
D Ajax und Validation ohne große Umstrukturierung Web Tier 3
G Probleme mit Ajax Login (jsp) Web Tier 5
I Ajax DOM speichern Web Tier 27
V Image Map und Ajax-Richfaces Web Tier 5
J Ajax in MyFaces? Web Tier 6
K Orientierungslosigkeit: Webservice+Ajax(echo2)+Session-Management Web Tier 4
S Beschleunigung Verarbeitung, ...Ajax Client-Side? Web Tier 3
C RichFaces Ajax ReRender funktioniert nicht. Web Tier 2
T Ajax / Javascript Plugin für Eclipse Web Tier 1
G AJAX und J2EE Web Tier 6

Ähnliche Java Themen

Neue Themen


Oben