Hallo,
es geht um folgenden Quelltext:
Die Seite funktioniert und macht das, was sie soll - das Problem:
Ist die Seite geöffnet - egal ob mit oder ohne eingegebene Daten - und aktualisiert man sie über die Taste F5 bzw. die entsprechende Webbrowser-Schaltfläche, dann bleiben zwar die Werte in den Eingabefeldern erhalten, jedoch scheint diese Bean neu erzeugt zu werden, da die Attribute wieder auf null stehen und die Methode createArtikel() aufgerufen wird. Bei jedem Neuladen der Seite ergibt sich das gleiche Verhalten.
Warum bleibt diese ManagedBean nicht entsprechend der annotierten Lebensdauer (ViewScoped, also gebunden an die Ansicht, also erst nach Verlassen der Seite ungültig) bestehen?
Weiterhin hätte ich eine Grundsatzfrage zu den Scopes:
Angenommen, ich habe eine ManagedBean, die ein Kunde-Objekt enthält, mit dem ich in einigen folgenden Seiten arbeiten möchte, irgendwann möchte ich auf die Startseite (index.xhtml) (zurück-)navigieren und besagte ManagedBean erneut nutzen, um ein anderes Kunde-Objekt anzulegen usw. Soweit ich es verstanden habe, wäre für diese Bean @SessionScoped angebracht, da ich über mehrere Seiten navigiere und Daten nutzen möchte. Was aber ist, wenn ich von meiner Startseite aus obige ManagedBean neu haben möchte, um z. B. beim Erstellen eines neuen Kunden nicht die Daten von vorher zu haben? Wie geht man in so einem Fall standardmäßig vor? Kann man eine ManagedBean auch für ungültig erklären bzw. explizit neu erstellen lassen?
Danke im Voraus!
es geht um folgenden Quelltext:
Java:
...
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
...
@ManagedBean
@ViewScoped
public class ArtikelAnlegen {
@ManagedProperty(value = "#{index.facade}")
private PersistenceFacade facade;
private Artikel artikel;
private Vector<ArtKategorie> artkategorien;
public ArtikelAnlegen() {
artkategorien = ArtKategorie.listArtKategorien();
}
@PostConstruct
public void postArtikelAnlegen() {
if (artikel == null) {
try {
artikel = facade.createArtikel();
} catch (DAOException e) {
e.printStackTrace();
}
}
}
public void setFacade(PersistenceFacade facade) {
this.facade = facade;
}
public Vector<ArtKategorie> getArtkategorien() {
return artkategorien;
}
public Artikel getArtikel() {
return artikel;
}
public String speichern() {
try {
facade.save(artikel);
facade.commit();
} catch (DAOException e) {
e.printStackTrace();
}
FacesMessage message = new FacesMessage(
"Neuer Artikel erfolgreich angelegt!");
FacesContext.getCurrentInstance().addMessage(null, message);
return "/wartung.xhtml";
}
}
Java:
<?xml version="1.0" encoding="UTF-8"?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Artikel anlegen</title>
</h:head>
<h:body>
<h1>
<h:outputText value="Verkaufssystem" />
</h1>
<h2>
<h:outputText value="Wartungsbereich" />
</h2>
<h3>
<h:outputText value="Artikel anlegen" />
</h3>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="artname">Artikelname</h:outputLabel>
<h:inputText id="artname" value="#{artikelAnlegen.artikel.artname}"
required="true">
<f:ajax event="blur" render="artnameMessage" />
</h:inputText>
<h:message id="artnameMessage" for="artname" />
<h:outputLabel for="kurzbeschr">Kurzbeschreibung</h:outputLabel>
<h:inputTextarea id="kurzbeschr"
value="#{artikelAnlegen.artikel.kurzbeschr}" required="false">
<f:ajax event="blur" render="kurzbeschrMessage" />
</h:inputTextarea>
<h:message id="kurzbeschrMessage" for="kurzbeschr" />
<h:outputLabel for="preis">Preis</h:outputLabel>
<h:inputText id="preis" value="#{artikelAnlegen.artikel.preis}"
required="true">
<f:ajax event="blur" render="preisMessage" />
</h:inputText>
<h:message id="preisMessage" for="preis" />
<h:outputLabel for="selectartkategorie">Artikelkategorie</h:outputLabel>
<h:selectOneMenu id="selectartkategorie"
value="#{artikelAnlegen.artikel.artkatnr}" required="true">
<f:selectItems value="#{artikelAnlegen.artkategorien}" var="artkat"
itemLabel="#{artkat.name}" itemValue="#{artkat.artkatnr}" />
<f:ajax event="blur" render="selectartkategorieMessage" />
</h:selectOneMenu>
<h:message id="selectartkategorieMessage" for="selectartkategorie" />
<h:panelGroup />
<h:commandButton value="Speichern"
action="#{artikelAnlegen.speichern}">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
<h:messages globalOnly="true" layout="table" />
</h:panelGrid>
</h:form>
</h:body>
</html>
Die Seite funktioniert und macht das, was sie soll - das Problem:
Ist die Seite geöffnet - egal ob mit oder ohne eingegebene Daten - und aktualisiert man sie über die Taste F5 bzw. die entsprechende Webbrowser-Schaltfläche, dann bleiben zwar die Werte in den Eingabefeldern erhalten, jedoch scheint diese Bean neu erzeugt zu werden, da die Attribute wieder auf null stehen und die Methode createArtikel() aufgerufen wird. Bei jedem Neuladen der Seite ergibt sich das gleiche Verhalten.
Warum bleibt diese ManagedBean nicht entsprechend der annotierten Lebensdauer (ViewScoped, also gebunden an die Ansicht, also erst nach Verlassen der Seite ungültig) bestehen?
Weiterhin hätte ich eine Grundsatzfrage zu den Scopes:
Angenommen, ich habe eine ManagedBean, die ein Kunde-Objekt enthält, mit dem ich in einigen folgenden Seiten arbeiten möchte, irgendwann möchte ich auf die Startseite (index.xhtml) (zurück-)navigieren und besagte ManagedBean erneut nutzen, um ein anderes Kunde-Objekt anzulegen usw. Soweit ich es verstanden habe, wäre für diese Bean @SessionScoped angebracht, da ich über mehrere Seiten navigiere und Daten nutzen möchte. Was aber ist, wenn ich von meiner Startseite aus obige ManagedBean neu haben möchte, um z. B. beim Erstellen eines neuen Kunden nicht die Daten von vorher zu haben? Wie geht man in so einem Fall standardmäßig vor? Kann man eine ManagedBean auch für ungültig erklären bzw. explizit neu erstellen lassen?
Danke im Voraus!