2016-07-20 7 views
1

Ich suchte stackoverflow, Frühjahr Spezifikation, und google für eine lange Zeit, aber immer noch nicht die Antwort finden.Wer übergibt Spring ModelMap als Parameter an Controller-Methode?

Zum Beispiel

------------------- Beispiel Methode 1 ---------------- --------

@RequestMapping(value = "/login") 

public String handleLogin(ModelMap model, @RequestParam String name){ 
    model.addAttribute("name", name); 
    return "login"; 
} 

in obigen Verfahren

  1. Wer diese Methode aufruft und in welcher Situation?
  2. Was hat der Aufrufer mit dem Modell gemacht, bevor es diese Methode aufgerufen hat?
  3. In welchem ​​Bereich befindet sich dieses ModelMap-Objekt? ist es im Anforderungsbereich?
  4. Was sind die Anforderungen an die Signatur dieser Art von Methode? Kann ich beliebig eine Methode wie folgt erstellen:

------------------ Beispiel Methode # 2 ------------ -

@RequestMapping(value = "/login") 

public String handleLogin(String s1, ModelMap model_1, int i, ModelMap model_2 @RequestParam String name){ 
    model_1.addAttribute("name", name); 
    model_2.addAttribute("company", "good");//what are the initial status of model_1 and model_2? 
    return "login"; 
} 

In dieser Methode habe ich 2 ModelMap Parameter und die Positionen von ihnen sind beliebig. Kann das Spring-Framework diese Methode aufrufen, so dass die Modelmap verwendet werden kann, um Daten an eine Ansicht zu übergeben, genau wie im regulären Fall in Beispielmethode # 1?

Allgemein kann jemand die Details des Lebenszyklus von ModelMap veranschaulichen, bevor es in die Methode übernommen wird?

+0

Wenn Sie wissen möchten, was eine '@ RequestMapping'-Methode akzeptieren und zurückgeben kann, * lesen Sie die Dokumentation *: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc .html # mvc-ann-methods – Andreas

Antwort

3

Bitte die Antworten finden die folgenden:

(1) Wer diese Methode aufruft und in welcher Situation?

Diese Controller-Methode wird von Spring Dispatcher Servlet (& Handler Methoden), wenn "/ login" Anfrage kommt an den Server

(2) Was ist mit dem Modell der Anrufer zu tun hat geltend gemacht werden, bevor es nennt diese Methode?

Das Spring Dispatcher-Servlet stellt dieses Modellobjekt zur Verwendung mit den UI-Tools zur Verfügung.

(3) In welchem ​​Bereich befindet sich dieses ModelMap-Objekt? ist es im Anforderungsbereich?

Nein, das Modelmap-Objekt wird intern von Spring-Handler-Methoden verwendet, um die benutzerdefinierten Objekte (die in der UI dargestellt werden) in die HTTP-Antwort einzufügen.

(4) Was sind die Anforderungen an die Signatur dieser Art von Methode? Kann

Sowohl Modell_1 als auch Modell_2 beziehen sich auf das gleiche Modellobjekt, da pro Anfrage ein Objekt gepflegt wird.Die Controller-Methode Signaturen sind flexibel, können Sie weitere Informationen unter Link: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-methods

Weitere Einzelheiten zu Modelmap bitte unten verweisen:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/ui/ModelMap.html

Beachten Sie bitte auch die Feder Dispatcher Servlet-Lebenszyklus unter:

+0

Vielen Dank ... das aktuelle Dokument zur Verfügung gestellt. – developer

+1

Ich glaube nicht, 'ModelMap' ist Anfrage-Bereich, da Request-Bereich * Bohnen * durch' RequestAttributes' unterstützt werden. 'ModelMap' ist eine lokale Variable im Aufruf-Stack und hat keinen Bereich. – Andreas

+0

Für # 4 (Anforderungen der Signatur), siehe [22.3.3 @RequestMapping-Handler-Methoden definieren] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html # mvc-ann-methods) – Andreas

0

(Ich habe keine Chance, den Dokumentationsentwickler zu lesen & Andreas schlug vor, aber trotzdem sollten die folgenden Kommentare von selbst gültig sein) Wenn die ModelMap Wird in der lokalen Methode in der Dispatch-Servlet-Klasse erstellt, geht die Referenz, die die ModelMap enthält, verloren, wenn eine neue Anforderung diese Methode im Dispatch-Servlet aufruft (unabhängig davon, ob sich die Referenz auf ein Session-Scope-Objekt oder Request_Scope-Objekt, die ModelMap, bezieht) selbst wird ein brandneues sein). Ich fühle mich so verwirrt, weil die ModelMap noch alte Referenz im folgende Beispiel gilt:

@Controller   
    @SessionAttributes("name")  
    public class LoginController {  
     @RequestMapping(value = "/login", method = RequestMethod.POST)  
     public String handleUserLogin(ModelMap model, @RequestParam String name) {  
      model.addAttribute("name", name);  
      return "login";  
     }  
    } 

Mit dem obigen Code, die „Name“ -Attribut in ModelMap gespeichert wird, aber wie ich schon oben erwähnt, wird die Variable „Modell“ wird verlor alle seine Mitgliedsattribute nach dem Beenden dieses Aufrufs.

So sieht es ein Widerspruch ist, dass das Attribut „name“ ist

  1. ein Sitzungsbereich Attribut
  2. in einer lokalen Variablen gespeichert wird und diese Variable verliert alle seine Referenz, wenn lokale Methode
verlässt
Verwandte Themen