La signature degli handler
L'ultima caratteristica vincente dei Controller di Spring MVC riguarda la possibilità di
personalizzare a proprio piacimento la signature del metodo (ovvero il numero e il tipo di parametri accettati e il tipo di dato ritornato). Questa funzionalità ci permette di avere una libertà impensabile all'interno di una applicazione J2EE.
Come abbiamo visto in precedenza abbiamo creato metodi che non accettavano parametri, metodi
che accettavano una String
e metodi che accettavano un int
. Il motore interno di Spring MVC identifica quali parametri il nostro metodo richiede e, se possibile, ce li fornisce senza preoccupazioni da parte nostra. Lo stesso approccio è valido per il valore ritornato dal metodo stesso. In seguito vedremo come personalizzare anche questo
aspetto.
Parametri possibili
Ecco un elenco dei principali parametri disponibili:
- Parametri annotati con
@PathVariable
recuperati dal pattern. - Parametri annotati con
@RequestParam
ed inviati via HTTP dal client. HttpServletRequest
eHttpServletResponse
(e ancheServletRequest
eServletResponse
) per accedere direttamente agli oggetti nativi J2EE.HttpSession
per sfruttare la sessione senza doverla recuperare manualmente dalla request.Locale
per identificare automaticamente il locale utilizzato.InputStream
eOutputStream
per lavorare a basso livello direttamente sugli stream in ingresso e in uscita.- Parametri annotati con
@RequestHeader
per avere un determinato valore tra gli header HTTP ricevuti. - Parametri annotati con
@RequestBody
per avere direttamente il corpo della request. Map
(oModel
) per passare alla view valori dinamici.Errors
(oBindingResult
) per gestire la validazione dei form.
Tutto questo significa che avere delle signature di questo tipo non solo è possibile, ma è anche
raccomandabile:
public void withSession(HttpSession session) {
// TODO...
}
public void withResponseRequest(HttpServletRequest request, HttpServletResponse response) {
// TODO...
}
public void withLocale(Locale locale) {
// TODO...
}
Non bisognerà preoccuparsi di come recuperare questi oggetti, basterà inserirli nella signature del metodo e diverranno disponibili.
Valori di ritorno
Cosi come per i parametri in ingresso, è possibile modificare a proprio piacimento il valore ritornato dai nostri handler, seppur con minore variabilità.
Tra i valori possibili è utile ricordare:
void
per comunicare a Spring MVC che l'intera gestione del flusso di response verrà gestita manualmente;- una stringa per invocare un
ViewResolver
che a partire da essa recupererà una particolare vista (JSP per esempio) da utilizzare; - una stringa con prefisso
redirect
: per forzare una redirect verso un'altra url; - una stringa con prefisso
forward
: per forzare il forward verso un altro handler; - un
ModelAndView
(o unModel
) che incapsulano sia il nome della vista da caricare sia l'insieme dei dati da passare ad essa; - qualsiasi tipo di oggetto da convertire tramite un
HttpMessageConverter
(per esempio in JSON o XML) se il metodo è annotato con@ResponseBody
.