Spring MVC übergeben das gleiche Objekt zwischen Controller

8

Im Frühling MVC wie übergebe ich ein Objekt zwischen zwei Controller-Methoden? Ich habe ein Update-Formular und einen updateController. In der Steuerung habe ich 2 Methoden, eine zum Abrufen der Daten und zum Anzeigen in einer Ansicht. Die zweite Methode des Controllers wird aufgerufen, wenn der Benutzer auf die Schaltfläche "Aktualisieren" mit den geänderten Änderungen klickt. Was ich beobachte, ist, dass das Objekt, das ich in der zweiten Methode des Controllers erhalte, nicht dasselbe Objekt ist, das ich an die Ansicht im ersten Controller-Methodenaufruf übergeben habe. Es ist ein neues Objekt mit allen zugeordneten Formularfeldern. Wie stelle ich sicher, dass das gleiche Objekt an die zweite Controller-Methode übergeben wird, die der View von der ersten Controller-Methode zur Verfügung gestellt wurde?

%Vor%

Die obige Controller-Methode ruft die emp-Werte von Db ab und zeigt sie in der Ansicht korrekt an. Jetzt ändert der Benutzer einige Details und klickt auf Senden. Die folgende Controller-Methode wird aufgerufen.

%Vor%

In der obigen Controller-Methode, wenn ich das emp-Objekt überprüfe, ist es nicht das gleiche Objekt, das ich beim vorherigen Controller-Aufruf übergeben habe. Die Felder, die nicht unterstützt werden, aber Werte haben, wurden in null geändert. Wie kann ich sicherstellen, dass das gleiche Objekt von der Ansicht übergeben wird? Ich möchte das Objekt nicht als sessionAttribute hinzufügen, da ein Benutzer möglicherweise viele Mitarbeiter in einer Sitzung ändern kann.

    
Pratik Shelar 29.01.2014, 09:09
quelle

2 Antworten

22

Sie haben 3 Optionen

  1. Verwenden Sie @SessionAttributes , um das Objekt in der Sitzung zwischen Anfragen zu speichern.
  2. Verwenden Sie eine mit @ModelAttribute annotierte Methode, um das Objekt vor jeder Anfrage abzurufen
  3. Schreiben Sie Ihren eigenen Code und speichern Sie ihn in der Sitzung (ähnlich wie bei 1, aber mehr Arbeit auf Ihrer Seite).

Option 1

  1. Fügen Sie die @SessionAttributes Annotation zu Ihrer Controller-Klasse hinzu
  2. Fügen Sie der Update-Methode SessionStatus und der Methode setComplete() eine Methode hinzu, wenn Sie mit dem Objekt
  3. fertig sind
%Vor%

Option 2

  1. Fügen Sie die Methode hinzu, die das Objekt aus der Datenbank abruft, und versehen Sie es mit @ModelAttribute
  2. Bereinigen Sie Ihre Methode showEmpDetails , da sie nur einen Ansichtsnamen
  3. zurückgeben soll
%Vor%

Option 3

  1. Fügen Sie in Ihren Methoden HttpSession als Argument hinzu
  2. Fügen Sie es in Ihrer showDetails -Methode neben dem Hinzufügen zum Modell der Sitzung hinzu
  3. Verwenden Sie in Ihrer editEmpFormSubmission die aus der Sitzung und kopieren Sie alle Nicht-Null-Felder in das Objekt aus der Sitzung und speichern Sie diese in der Datenbank.

Ich würde mich nicht für eine Option entscheiden, ich würde Option 1 empfehlen, insbesondere die setComplete() auf dem Objekt SessionStatus für die Bereinigung. Sie könnten auch 1 und 2 kombinieren (verwenden Sie eine @ModelAttribute annotierte Methode und verwenden Sie weiterhin @SessionAttributes .).

    
M. Deinum 29.01.2014 10:15
quelle
0
  

Wie kann ich sicherstellen, dass das gleiche Objekt an der Ansicht übergeben wird? Ich möchte das Objekt nicht als sessionAttribute hinzufügen, da ein Benutzer möglicherweise viele Mitarbeiter in einer Sitzung ändert

Sie können ein Feld in dem Objekt erstellen, das zum Zeitpunkt des anfänglichen Renderns mit einer Zufallszahl gefüllt ist, und dieses Objekt dann in der Sitzung speichern. In der Ansicht können Sie dieses Feld mit einer versteckten Eingabe abbilden, und jetzt, wenn der Benutzer eine Aktion zum Bearbeiten der Aktion sendet, können Sie das versteckte Feld abrufen und das ursprüngliche Objekt aus der Sitzung mit der Nummer im versteckten Feld abrufen. Das würde die Mehrfachbearbeitung in verschiedenen Tabs lösen.

    
Tarmo 29.01.2014 10:13
quelle

Tags und Links