2012-12-15 8 views
6

Ich bin ziemlich neu in Spring MVC. Momentan studiere ich die Spring MVC Showcase, die die Funktionen des Spring MVC-Web-Frameworks demonstriert.Verständnis der Verwendung von @ModelAttribute und @RequestAttribute Annotationen in Spring MVC

Ich habe ein Problem zu verstehen, wie benutzerdefinierte resolvable Web-Argumente in diesem Beispiel behandelt werden.

In der Praxis habe ich folgende Situation. In meiner home.jsp Ansicht habe ich den folgenden Link:

<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a> 

Dieser Link auf eine HTTP-Anfrage auf der URL generiert: "/ data/custom"

Die Controller-Klasse, die die Methode enthält dass Griffe diese Anforderung haben den folgenden Code:

@Controller 
public class CustomArgumentController { 

    @ModelAttribute 
    void beforeInvokingHandlerMethod(HttpServletRequest request) { 
     request.setAttribute("foo", "bar"); 
    } 

    @RequestMapping(value="/data/custom", method=RequestMethod.GET) 
    public @ResponseBody String custom(@RequestAttribute("foo") String foo) { 
     return "Got 'foo' request attribute value '" + foo + "'"; 
    } 

} 

die Methode, die diese HTTP-Anforderung verarbeitet ist custom(). Wenn also auf die vorherige Verknüpfung geklickt wird, wird die HTTP-Anforderung von der benutzerdefinierten Methode verarbeitet.

Ich habe ein Problem zu verstehen, was genau die @RequestAttribute Annotation tut. Ich denke, dass in diesem Fall das Anforderungsattribut foo mit einer neuen String foo-Variable verknüpft wird. Aber woher kommt dieses Attribut? Wird diese Variable vom Frühling genommen?

OK, meine Idee ist, dass dieses Request-Attribut von einem HttpServletRequest-Objekt stammt. Ich denke so, weil in dieser Klasse, ich habe auch das beforeInvokingHandlerMethod() Methode, die einen sprechenden Namen haben, so scheint es, dass diese Methode ein Attribut setzt, die name = foo und Wert = bar, innen haben ein HttpServletRequest-Objekt, und dann kann die Methode custom() diesen Wert verwenden.

In der Tat meine Ausgabe lautet:

Got 'foo' Anfrage Attributwert 'bar'

Warum die beforeInvokingHandlerMethod() vor dem aufgerufen wird custom() Methode?

Und warum die beforeInvokingHandlerMethod() von @ModelAttribute Anmerkung kommentiert wird? Was bedeutet es in diesem Fall?

Antwort

1

Die RequestAttribute ist nichts als die Parameter, die Sie in der Formularübergabe übergeben haben. Fangen wir mit einer Probe Beispiel verstehen

Angenommen, ich habe das unten stehende Formular

<form action="..."> 
<input type=hidden name=param1 id=param1 value=test/> 
</form> 

Nun, wenn ich die unten Controller haben, die mit der Anfrage-URL abgebildet wird, die, wie unten mit dem Formular-Vorlage abgebildet wird.

@Controller 
public class CustomArgumentController { 

@ModelAttribute 
void beforeInvokingHandlerMethod(HttpServletRequest request) { 
    request.setAttribute("foo", "bar"); 
} 


@RequestMapping(value="/data/custom", method=RequestMethod.GET) 
public @ResponseBody String custom(@RequestAttribute("param1") String param1) { 
    // Here, I will have value of param1 as test in String object which will be mapped my Spring itself 
} 
+0

mmm ließen mich gut verstehen, diese Sache: so, wenn ich meine beforeInvokingHandlerMethod() -Methode durch @ModelAttribute Anmerkung Annote die gleiche Sache ist, wenn ich das richtig ein Formular mit der „foo“ bestanden haben, „bar“ Werte? und innerhalb dieser Methode mache ich das request.setAttribute ("foo", "bar"); ? – AndreaNobili

+0

Exakt, Sie sind in Ordnung, was, zum besseren Verständnis des ModelAttribute können Sie die offizielle Dokumentation von Spring MVC http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web besuchen /bind/annotation/ModelAttribute.html und auch von http://blog.trifork.nl/2009/05/14/simple-forms-with-spring-mvc-2-5/ –

+0

Ich hatte diese Dokumentation gelesen, aber ich hatte ein Problem, um es gut zu verstehen :-( In der Praxis sayng mich, dass, wenn ich eine Methode, die von der ModelAttribute Annotation annotiert bin ich einen Methodenparameter an ein benanntes Modell Attribut binden und dann kann ich es in einigen anderen verwenden Methode mit Hilfe von RequestAttribute Annotation? Aber in meinem Fall, was ist der Parameter, den ich verbinde? Ist es der Parameter namens "foo", die "bar" als Wert haben? Vielen Dank, Sie sind sehr nett :-) – AndreaNobili

Verwandte Themen