Spring MVC Controller (parte 2)

Concludiamo la serie di articoli sulle basi di Spring MVC ed in particolare sulla implementazione di un controller, iniziata in Spring MVC Controller (parte 1), parlando della tipo di dato che può essere restituito dal controller e su come è gestita la navigazione. Questo perchè nella implementazione di un controller le informazioni che debbono essere restituite sono:

  1. il modello ovvero i dati mostrati dalla vista;
  2. la vista che deve renderizzare il modello.

Restituzione Diretta del Contenuto

Principalmente utilizzato nella implementazione di servizi REST (ovvero nei  @RestController) ma anche per implementare metodi di debug, l’annotazione @ResponseBody consente di restituire direttamente al client il messaggio da visualizzare. Se il metodo del controller non restituisce un tipo String interviene uno dei converter (bean che estendono l’interfaccia HttpMessageConverter) resi disponibili dal framework.

Naturalmente in questo caso non è restituita alcuna vista in quanto il messaggio inserito nel body della response e renderizzato direttamente dal browser.

Restituzione della Vista

Il controller può restituire la vista da renderizzare in diversi modi. Il primo è restituendo il nome della vista che sarà poi utilizzato dal ViewResolver per associarla, ad esempio, alla pagina jsp. In questo caso il metodo del controller può accedere ed aggiornare il model dichiarandolo come argomento del metodo oppure utilizzando l’annotazione @ModelAttribute.

Nell’esempio il metodo showTodos del controller riceve il model come argomento e lo aggiorna con la lista dei todo. Quindi restituisce il nome della vista todos che sarà poi convertita dal ViewResolver in /WEB-INF/views/todos.jsp. Alternativamente è possibile utilizzare un oggetto ModelMap come argomento ed operare in modo analogo.

L’utilizzo dell’annotazione @ModelAttribute complica leggermente la logica ma ha diverse conseguenze interessanti. Vediamo innanzitutto come ottenere lo stesso risultato attraverso tale annotazione:

L’annotazione a livello del metodo addTodoList() indica al framework di invocarlo prima di ogni altro metodo del controller annotato con @RequestMapping. L’annotazione a livello di argomento del metodo showTodos(), invece, indica a Spring di recuperare l’oggetto dal modello e se non presente di crearne una nuova istanza.

Una ulteriore possibilità per la restituzione diretta della vista è di ritornare un oggetto che implementa l’interfaccia View. Spring MVC fornisce diverse implementazioni in funzione della View Technology utilizzata e di fatto sono tali oggetti che Spring istanzia quando è restituito il nome della vista. Rimanendo nel caso JSP/JSTL è possibile ottenere lo stesso risultato presentato negli esempi precedenti restituendo un oggetto di tipo JstlView:

In questo caso non interviene più il ViewResolver quindi deve essere indicata esattamente la pagina jsp da renderizzare. Accenniamo brevemente anche alla possibilità di eseguire un redirect verso pagine esterne al sito restituendo l’oggetto RedirectView:

Restituzione di Modello e Vista

L’oggetto ModelAndView consente al controller di restituire in unica soluzione sia il model che la vista da renderizzare.

La vista può essere specificata sia attraverso il metodo setViewName(), con il quale si definisce il nome della vista, sia attraverso il metodo setView() che invece ammette un oggetto di tipo View.

Restituzione del Model

Restituire il solo model significa ritornare un oggetto di tipo java.util.Map oppure org.springframework.ui.Model. La vista da renderizzare è determinata dal framework utilizzando lo specifico RequestToViewNameTranslator. Ad esempio nel controller seguente il metodo showTodo() restituisce una HashMap con gli oggetti che compongono il model mentre la vista è determinata in base all’uri nell’annotazione @RequestMapping. In particolare Spring MVC individuerà nella pagina /WEB-INF/niews/todos.jsp la maschera da visualizzare.

Altro

Esiste una varietà di altre possibilità che non discuteremo nell’articolo. Per maggiori dettagli si rimanda alla documentazione ufficiale al paragrafo Return Values.

Codice Sorgente

Il codice sorgente completo degli esempi presentati è scaricabile qui login-sprmvc.