JSF Problem - Terminverwaltung - Ändern eines vorhandenen Termins

Status
Nicht offen für weitere Antworten.

Svenni

Mitglied
Hallo,
im Thread http://www.java-forum.org/allgemeine-java-themen/83243-java-server-faces-frage-zu-managedbeans.html habe ich bereits eine prinzipielle Frage zu JSF gepostet (ich habe den Thread aus versehen unter Allgemeines angelegt. Leider kann ich das nicht mehr ändern). Auf den dort beschriebenen Sachverhalt (die Terminverwaltung mit den Klassen Appointment, User, AppointmentHandler, UserHandler) bezieht sich auch meine Frage.

Bisher kann ich Termine anlegen und eine Übersicht der Termine anzeigen.
Die JSP-Seite zum Anlegen sieht u.a. wie folgt aus:
Java:
<h:outputText value="Kurzbeschreibung"/>
<h:inputTextvalue="#{appointmentHandler.appointment.shortdescription}" />
<h:outputText value="Beschreibung"/>
<h:inputTextvalue="#{appointmentHandler.appointment.description}" />

In der Action-Methode, die mit dem Button "Anlegen" verbunden ist wird entsprechend der Termin in der DB abgespeichert. Das funktioniert auch schon, ich kann also auf diese Weise Termine anlegen.

Die Übersicht der Termine ist über eine Tabellen-Ansicht realisiert. Mein UserHandler verfügt dazu neben der Entity für den User über ein DataModel, wie folgt skizziert.

Java:
public class UserHandler {	
	private User user;
	private DataModel resultModel;
        ...

Die JSP zum Anzeigen der Übersicht sieht wie folgt aus (bisschen abgekürzt damits nicht zu lang wird):

Java:
<h:dataTable id="data" style="width: 100%;" styleClass="standardTable" ... var="app" value="#{userHandler.resultModel}">
    <h:column>
        <f:facet name="header">
	    <h:outputText value="Beschreibung" />
	</f:facet>
	<h:outputText value="#{app.description}" />
    </h:column>

    <h:column>
        <f:facet name="header">
	    <h:outputText value="Kurzbeschreibung" />
	</f:facet>
	<h:outputText value="#{app.shortdescription}" />
    </h:column>

   ....
</h:dataTable>

Das DataModel enthält jeweils Appointments. Das Anzeigen funktioniert auf diese Weise auch.

Nun wollte ich auch noch die Möglichkeit zur Verfügung stellen einen Termin ändern zu können. Dazu habe ich bisher einfach einen Button hinzugefügt (als h:column), so dass ich in einer zeile sagen kann: Bitte diesen Termin bearbeiten.

In der action-Methode zu diesem Button bestimme ich die Zeile die markiert ist bzw. den Termin der markiert ist, um ihm dann im AppointmentHandler setzen zu können:

Java:
		Appointment a = (Appointment) this.resultModel.getRowData();		 
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.getApplication().createValueBinding("#{appointmentHandler.appointment}").setValue(fc, a);

Anschließend wird auf einer einzelnen Seite nur der ausgewählte Termin angezeigt, wobei ich die Daten dazu ändern kann. Die Seite ist mehr oder weniger identisch zur Seite zum Anlegen eines Termins (wieder ein Ausschnitt):

Java:
<h:outputText value="Kurzbeschreibung"/>
<h:inputTextvalue="#{appointmentHandler.appointment.shortdescription}" />
<h:outputText value="Beschreibung"/>
<h:inputTextvalue="#{appointmentHandler.appointment.description}" />

Nun stehen in description und shortdescription ja schon Werte drin. Das soll auch so sein, da ich ja die bisherigen Werte in den Textfeldern anzeigen möchte. Der Benutzer soll bei Bedarf aber einen Wert ändern können.

Wenn ich nun den Button zum Speichern drücke, wird die Änderung aber nicht tatsächlich übernommen. Wenn ich die Kurzbeschreibung von "Geburtstag Anne" in "Geburtstag" ändere, bleibt die Kurzbeschreibung des Termins auf "Geburtstag Anne". Ich habe auch mal einige Ausgaben in die Action-Methode eingebaut, um mir die Angaben zum Termin auszugeben, bevor ich den geänderten Termin in der DB speicher. Dort erscheinen die alten Werte und nicht die neuen! Es scheint fast so, als würden zwar die alten Werte in den Textfeldern angezeigt, aber als würden die neu eingetragenen Werte nicht übernommen werden.

Ich habe dann auch mal in getDescription und getShortDescription (von Appointment) Ausgaben eingebaut, da ich wissen wollte wann die Methoden aufgerufen werden. Zunächst hab ich einen Termin angelegt, um zu gucken ob die Ausgaben so sind wie ich es erwarte. Beim Betätigen des Action-Buttons werden wie erwartet die set-Methoden aufgerufen und der neue Termin wird richtig angelegt.

Wenn ich mir dann die Ausgaben beim Bearbeiten ansehe bin ich etwas überrascht. Zunächst werden die getter aufgerufen, da die Inhalte in den Textfeldern dargestellt werden sollen. Das ist ja richtig. Wenn ich aber den Button betätige wird keine (!) setter-Methode aufgerufen. Das verwundert mich doch sehr.

Hat irgendjemand eine Erklärung dafür? Ist es überhaupt legitim in den Managed Beans direkt auf die Entities zuzugreifen? Ich wäre für jegliche Hilfe wirklich sehr sehr dankbar.

Was ich dann noch probiert habe, ist folgendes: Bisher wird bei der Auswahl einer Zeile in der Übersicht ja der ausgewählte Termin bestimmt. Wenn ich dort nun nicht den ausgewählten Termin bestimme, sondern immer einen neuen ("leeren") Termin anlege, dann sollte sich die Bearbeiten-Methode eigentlich so verhalten wie die Anlegen-Methode - nach meinem bisherigen Verständnis. Das tut sie aber nicht, da dann beim Betätigen des Speichern-Buttons ein Fehler kommt das Beschreibung nicht null sein darf (selbst wenn ich einen Wert eingegeben habe).
 

gex

Bekanntes Mitglied
Erstmal: Ja es ist legitim direkt auf das Entity zuzugreifen, ich meine sogar, es müssten gute Gründe (die gibts bestimmt) vorhanden sein dies nicht zu tun.

ValueBinding ist jedoch bereits deprecated, du solltest auf ValueExpression wechseln.
Ich bin mir gerade nicht ganz sicher, ob die folgende Zeile
Code:
fc.getApplication().createValueBinding("#{appointmentHandler.appointment}").setValue(fc, a);
überhaut das Property appointment überschreibt (prüf doch mal ob der Setter für das Property appointment aufgerufen wird). Aber ansonsten debugst du am besten mal alles durch (also auch in die JSF Classes rein).

Hoffentlich konnte ich etwas helfen...
 

Svenni

Mitglied
Danke für deine Antwort. Das Value Binding deprecated ist wusste ich nicht. Ich lese gerade ein JSF-Buch und da stehts noch mit Value Binding drin. Aber danke für den Hinweis.

Ja appointment wird richtig gesetzt. In den Ausgaben sehe ich wie setDescription und setShortdescription sowie setAppointment aufgerufen werden. Auf der Seite auf der man die Sachen ändern können soll erscheinen in den Textfeldern auch die richtigen Werte.

Wenn ich appointment nicht auf das selektierte Element setze, sondern z.B. eine neue Instanz der Entity-Klasse erzeuge und es darauf setze, dann sollte sich die Bearbeiten-Seite doch eigentlich genauso verhalten wie die Seite zum Anlegen eines Termins oder?? (wenn nicht sonst irgendwo ein fehler ist)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S AJAX/RestController Post Problem Web Tier 18
pkm Problem beim Import eines dynamischen Webprojekts als .zip Web Tier 2
O JSF Java Unsigned Applet PrivilegedActionException Problem Web Tier 2
F JSF preRenderView Problem Web Tier 0
J Funktion für AJAX - Problem mit Return Web Tier 14
S Problem mit Checkboxen im Servlet erkennen Web Tier 3
N JSF JSF Selected Item & GesBetrag Problem Web Tier 1
Shams Problem mit der verwirklichung einer Readmethode in einer Chatapplikation Web Tier 3
F JSF Problem mit Primefaces Web Tier 7
F JSF Problem mit Primefaces Web Tier 4
F JSP Problem mit Property Web Tier 0
D Java EE Servlet login Problem Web Tier 1
L java.io.NotSerializableException für domain Objekte - Design Problem? Web Tier 12
T JSF Character Encoding Problem Web Tier 2
T JSF Problem mit JSF und Foreign Key Tabellen Web Tier 8
H JSF Problem mit Converter Web Tier 2
M Zeichensatz Problem? Web Tier 3
T JSF Problem wenn Session abgelaufen ist Web Tier 6
K JSF websphere application server 8 tomahawk problem Unable to find resource Web Tier 3
D JSF RichFaces Tree-Beispiel Problem Web Tier 2
J JSF Problem mit Bearbeiten von Datensätzen Web Tier 7
M JSF Problem mit CSS und Unterverzeichnissen Web Tier 2
M JSP Problem beim deployen auf Tomcat Web Tier 2
P Servlet getWidth(); - getHight(); Problem Web Tier 3
J JSP Problem bei Hibernate mit JSP Web Tier 2
M JSF mit Tobago Problem: ServletContextListener Web Tier 5
J Facelets javascript compiler problem Web Tier 3
T Tomcat mit Servlets Problem Web Tier 7
T Servlet Problem bei gwt rpc Web Tier 7
S Servlet Problem mit Tomcat Web Tier 3
J JSF Kein Methodenaufruf mit Button möglich durch PhaseListener (redirect) Problem? Web Tier 2
P rich:panelMenuGroup --> expanded Parameter Problem Web Tier 3
F.S.WhiTeY Tmplating/CSS Problem bei JSF Web Tier 7
A ice:inputText Converter Problem Web Tier 2
B JSF Tomcat Windows Linux equals Problem Web Tier 3
R JSF JSF Composite Components: Problem mit Attributliste und Referenzierung Web Tier 2
M Problem mit Hibernate und GWT Web Tier 6
O JSP struts2 tag: Problem mit Dezimalzahlen Web Tier 2
P Struts Struts2 if tag Problem mit getText() Web Tier 3
B Java EE 6 Problem (EL) Web Tier 4
ruutaiokwu beanshell scope problem... Web Tier 7
P Problem mit HTML.Tag.OPTION Web Tier 3
N Problem mit Datei Streaming Web Tier 2
M Problem mit Verlinkung JSP Dynamische Tabelle Web Tier 7
S Architektur-Problem? 2 Servlets, ein Objekt Web Tier 4
F.S.WhiTeY JSF:org.apache.jasper.JasperException Problem Web Tier 2
H Richfaces - Taglib Problem gelb unterstrichen Ajax Output Web Tier 6
N Servlet: Problem mit getParameterValues Web Tier 4
7 Struts und Ajax. Problem mit Actions Web Tier 2
J GWT - RPC Problem Web Tier 6
F Problem mit JSF Anwendung Web Tier 9
I Logout - Problem => Bei Zurück Web Tier 2
I AJAX - Problem Web Tier 18
F Problem mit Struts Web Tier 2
I selectOneMenu - Problem Web Tier 6
H Firefox Background-Image Problem Web Tier 4
E GWT Server-Client Problem Web Tier 3
J Log4j problem Web Tier 7
F Problem mit der Methode request.getRemotePort() Web Tier 2
S GWT Problem Web Tier 4
M Problem mit Velocity Web Tier 2
S OSGi Bundle Problem - ClassNotFound Web Tier 4
J JSF Locales Problem Web Tier 3
J Problem mit Login Web Tier 4
MQue jsp- Problem Web Tier 4
P Problem der Parameterübergabe aus Iframe Web Tier 15
A Tomcat: beim Start des Servers einmalige Aktion aufrufen (Problem gelöst) Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
S Filter Problem? Web Tier 6
E Problem mit t:saveState Web Tier 7
S Problem mit Anzeige zweier JSP's Web Tier 4
M Problem mit JSP und Bean Web Tier 2
F RichFaces, Problem mit PickList Web Tier 2
S Problem mit Servlet und Zugriff auf Orace XE Datenbank Web Tier 2
E Problem mit request.getParameter Web Tier 5
B getServletContext.getRealPath("/") Problem Web Tier 6
C Problem mit Hibernate und IceFaces Web Tier 2
S Problem mit Session - Übergabe von Kontext zu Kontext Web Tier 2
H problem bei Parameterübergabe mit beans Web Tier 3
U JSP form-Daten (ohne name-Attribut) an Servlet = Problem Web Tier 6
S jsf: übles problem mit <f:convertDateTime> Hilfe! Web Tier 2
A Selectbox Problem in JSP Web Tier 12
T Problem bei Session-Timeout Web Tier 3
S problem mit resultset Web Tier 6
U Problem bei Validierung mit Struts 2 Web Tier 1
A JSF-Ctrl h:inputText Problem mit Umlauten Web Tier 4
D JSP Anfängerfrage - Ändern von JSP / Tomcat Web Tier 4
S JSF: Ändern von CSS Styles in commandLink nach Klick Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben