JSF 2.0 + AJAX Problem

dadom110

Erfahrenes Mitglied
Hallo Zusammen,

hab ein "nettes" Problem mit der seid JSF 2.0 zur verfügung stehenden Möglichkeit AJAX zu verwendent.

Mein kleines Beispiel ist ein simples Master-Detail-Szenario:
- eine Liste mit Einträgen
- Auswahl eines Eintrags läd das dahinterliegende Objekt in ein Formular
- änderungen am ausgewählten Objekt durchführen > speichern

Das Problem:
Beim ERSTEN submit des Änderungsformulars (nach ein Eintrag aus der Liste ausgewählt wurde) wird weder das Model aktualisiert, noch die Action-Method aufgerufen. Beim ZWEITEN submit (also ohne das ausgewählte Item zu verändern, einfach die Änderungen noch mal ins Textfeld schreiben) werden die Daten sowohl in die Bean übertragen, also auch die Action-Method aufgerufen...

> ohne Ajax geht es wie erwartet auch beim ersten mal...? Hier mal ein Mini-Beispiel

Simple Java Bean:
Code:
public class DemoBean
{


  public DemoBean(String id, String text)
  {
    super();
    this.id = id;
    this.text = text;
  }

  private String id;

  public String getId()
  {
    return id;
  }

  public void setId(String id)
  {
    this.id = id;
  }

  private String text;


  public String getText()
  {
    return text;
  }


  public void setText(String text)
  {
    this.text = text;
  }
}

ManagedBean
Code:
@ManagedBean(name = "demoHandler")
@SessionScoped
public class DemoHandler
{

  private HashMap<String, DemoBean> map = new HashMap<String, DemoBean>();

  private DemoBean                  selectedBean;

  @PostConstruct
  private void init()
  {
    map.put("ID1", new DemoBean("ID1", "Ich bin Id 1"));
    map.put("ID2", new DemoBean("ID2", "Ich bin Id 2"));
    map.put("ID3", new DemoBean("ID3", "Ich bin Id 3"));
    map.put("ID4", new DemoBean("ID4", "Ich bin Id 4"));
  }

  public DemoBean getSelectedBean()
  {
    return selectedBean;
  }

  public void setSelectedBean(DemoBean selectedBean)
  {
    this.selectedBean = selectedBean;
  }

  public Set<String> getIds()
  {
    return this.map.keySet();
  }

  public String getSelectedBeanId()
  {
    return selectedBean == null ? null : selectedBean.getId();
  }

  public void setSelectedBeanId(String selectedBeanId)
  {
    this.selectedBean = map.get(selectedBeanId);
  }

  public String printout()
  {
    System.out.println(this.selectedBean.getText());
    return null;
  }

}


Und die Seite:
Code:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
</h:head>
<h:body>
	<h:form id="sForm">
		<h:selectOneListbox value="#{demoHandler.selectedBeanId}">
			<f:selectItems value="#{demoHandler.ids}"/>
			<f:ajax render=":out" execute="sForm"/>
		</h:selectOneListbox>
	</h:form>
	
	
	<h:panelGrid id="out"> 
		<h:form>
			<h:inputText value="#{demoHandler.selectedBean.text}" />
			<h:commandButton value="Save" action="#{demoHandler.printout()}" />
		</h:form>
	</h:panelGrid>
</h:body>
</html>

Mir sind inzwischen die Ideen ausgegangen :(

Danke schon mal für die Mühe und hoffe auf den entscheidenten Tipp
Dom
 
Zuletzt bearbeitet:
Würde auch nicht schaden den ganzen Abschnitt zu lesen ;)

...und es nach zu vollziehen. Das Beispiel entspricht nicht ganz dem was ich eigentlich vor haben. Das JSFAtWork Beispiel nutzt Ajax an der Stelle nur um einen Bereich der Webseite ein und aus zu blenden, das "Formular-Objekt" welches bearbeitet wird, bleibt dabei aber gleich.

Ich hingegen nutze in meinem Mini-Beispiel den AjaxRequest um das Objekt hinter den Eingabefeldern zu ändern und genau das scheint JSF nicht zu gefallen, bzw. bereitet beim "submit" Probleme. Ich hatte zwischendurch mal einen LifecycleListener eingehängt, und beim ersten submit des Formulars erkennt JSF scheinbar nicht das es sich um einen legitimen Post gegen einen bestehenden Komponentbaum handelt. Er scheint in der RestoreView Phase festzustellen das es sich um eine Neue Ansicht handelt und geht (ohne die Verarbeitung der Post Parameter) in die RenderResponse Phase...

Grüße
Dom
 
Hm, also ich hab dein Beispiel nachgebaut.

Die action von deinem Button ist invalide EL die "()" müssen weg.
HTML:
<h:commandButton value="Save" action="#{demoHandler.printout}" />
Sonst kann das nicht funktionieren.

Danach klappt alles. Ich habe eine hübsche errorpage bekommen, als ich die Seite angesurft habe. Verwendest Du die mojarra oder myfaces (die habe ich) Implementierung? Evtl. liegt das abweichende Fehlerhandling daran ... ?
 
Zurück