# Aktualisieren von <h:message> erzwingen?



## lorion42 (2. Feb 2010)

Ich bin gerade dabei eine Webanwendung in JSF 2.0 zu schreiben.
Es ist im Prinzip nur ein einfaches Formular, durch das ein komplexer Vorgang im Hintergrund gestartet wird. Der Vorgang kann ein paar Minuten dauern. Deshalb wollte ich den User über Zwischenergebnisse der Berechnung informieren.

Ajax bietet sich hier ja an. Doch wichtig ist, dass die Seite auch funktionieren soll, wenn kein JavaScript aktiviert ist. Deshalb ist Polling über Ajax keine so gute Idee.

Schön wäre es jetzt, wenn es möglich ist, aus den Java Klassen heraus auf die Elemente des xhtml Dokuments zugreifen zu können und so z.B. einen <h:message> Tag zum Neurendern zu bringen. Denn das Erzeugen einer neuen Message im FacesContext wird nicht sofort angezeigt. Gibt es da eine Möglichkeit?

Oder fällt jemandem eine andere Möglichkeit ein, durch die auch ohne JavaScript die letztendliche Lösung angezeigt wird? (für die Zwischenergebnisse ist JavaScript-Freiheit nicht so wichtig)


----------



## MrWhite (2. Feb 2010)

Das funktioniert ohne AJAX nicht ohne weiteres. Du brauchst AJAX-Push.

Einzige Alternative die ich kenne, aber für nicht mehr zeitgemäß halte:

Baue ein Meta-tag ein, dass die Seite alle x Sekunden neu lädt. Wahrscheinlich musste aber dann den Message-Part in eine separate Seite auslagern, die in einem IFrame oder so angezeigt wird.


```
<meta http-equiv="refresh" content="5; URL=http://de.selfhtml.org/">
```

(SELFHTML: HTML/XHTML / HTML-Kopfdaten / Meta-Angaben zum Inhalt)


----------



## mandreo (2. Feb 2010)

Du kannst mit FacesContext auch direkt auf den OuputStream schreiben.


```
FacesContext context = FacesContext.getCurrentInstance();

try {

 HttpServletResponse resp = (HttpServletResponse) context.getExternalContext.getResponse();
 resp.setContextType("text/plain");
 PrintWriter pWrite = resp.getWriter();
 writer.println("... text ...");
 ...
 context.responseComplete();

} catch (IOException e) { }
```

Vielleicht hilft dir das weiter.


----------



## lorion42 (2. Feb 2010)

mandreo hat gesagt.:


> Du kannst mit FacesContext auch direkt auf den OuputStream schreiben.


Hmm, dann wäre die Response aber doch auch abgeschlossen und ich könnte keine zweite Antwort senden, oder?



MrWhite hat gesagt.:


> Das funktioniert ohne AJAX nicht ohne weiteres. Du brauchst AJAX-Push.


Na gut dann sag mir, wie du es mit Ajax lösen würdest.
Zwischenergebnisse können auch ruhig nur für Leute angezeigt werden, die JavaScript haben. Es sollte nur nicht passieren, dass Leute ohne Javascript nur ein Zwischenergebnis bekommen und dann ist die Anfrage weg.


----------



## MrWhite (3. Feb 2010)

Für die Leute ohne JavaScript machst du ein Popup auf, dass besagtes meta-Tag entält.

Ansonsten:

Let me google that for you


----------



## lorion42 (3. Feb 2010)

MrWhite hat gesagt.:


> Ansonsten:
> 
> Let me google that for you


Das hatte ich schon längst gemacht, aber es brachte mich auch nicht weiter. (Die meisten Tutorials behandeln nur Dinge, die mit <f:ajax> eindeutig besser funktionieren) Ich werde meine Applikation jetzt nicht nur wegen einem eher unwichtigen Polling auf Icefaces umstellen. Alles andere ist in JSF 2.0 mMn eleganter als in Icefaces.
Vermutlich werde ich gezwungen sein ein kleines JavaScript zu schreiben, dass das Polling betreibt.


----------



## MrWhite (3. Feb 2010)

Ajax Push != Polling!

Ansonsten gibt es haufenweise JavaScript Frameworks die so etwas bereit stellen. Richfaces und ICEFaces etc. kann man ausserdem sehr einfach integrieren. Man muss ja nur eine JAR mehr ausliefern... und hat eine Komponente, die das kann.


----------



## rainwebs (11. Feb 2010)

Das stimmt so leider nicht, daß JSF 2 besser ist als ICEfaces. Wenn Du Dir beides genauer anschaust, dann wird Dir auffallen, daß JSF 2 die meisten AJAX-Sachen sehr rudimentär macht und Du vieles von Hand in die Seite bauen darfst, was ICEfaces transparent für Dich miterledigt.

Heute noch Seiten zu bauen, die ohne JavaScript auskommen sollen, halte ich nicht mehr für zeitgemäß. Damit verabschiedest Du Dich von Web 2.0. Das Meta-Tag Polling würde ich lassen. Das wirkt nur unprofessionell auf den Anwender.


----------

