I controller rappresentano la vera anima del paradigma MVC: sono il componente che viene invocato direttamente dai client che si occupano delle principali logiche di business e che possono esistere anche senza la presenza di Model e di View.
Metodi da mappare e annotations
Il tipo di bean che si occupa del mapping tra url invocato dall'utente e metodo Java da invocare è
l'handlerMapping
. L'implementazione di default presente in Spring MVC è la classe
RequestMappingHandlerMapping
che permette di sfruttare le java annotations per identificare i
metodi da mappare. Le annotations utili a questo
Annotation | Descrizione |
---|---|
@controller | Da utilizzare a livello di classe per identificarla come controller |
@requestMapping | Da utilizzare per evidenziare il metodo e l'url da mappare |
Analizziamo un esempio:
@Controller
public class DemoController
{
@RequestMapping(value="/home")
public String getIndex()
{
return "index";
}
}
In questo esempio abbiamo creato un controller con un metodo getIndex
che risponde all'url /home, ma per poter vedere il nostro controller all'opera mancano ancora alcuni passi; infatti inizialmente dobbiamo definire, all'interno del WebApplicationContext
, lo scanner che si occupa di trovare le classi annotate con le annotation di Spring e Spring MVC. Aggiungiamo quindi:
<context:component-scan base-package="com.albertobottarini.springmvc"/>
Una volta configurato possiamo avviare l'applicazione (possibilmente nella ROOT
dell'application server) e puntare i nostri browser verso "http://localhost:8080/home
". Se tutto è stato configurato alla perfezione vedremo nello standard error un errore che indica che non esiste nessun handler per la pagina /index
. Questo perchè, dato che non è stato definito nessun ViewResolver
, Spring MVC non è ancora in grado di capire cosa fare della nostra stringa "index" e quindi cercherà di eseguire un forward non trovando però nessun handler. Ecco l'errore:
WARNING: No mapping found for HTTP request with URI [/index] in DispatcherServlet with name'springmvc'
L'annotation @RequestMapping
Una delle cose più interessanti dell'annotation @RequestParam
è però la possibilità di creare URL dinamiche con placeholder da utilizzare al posto dei classici parametri GET che non piacciono
molto agli spider SEO. Guardiamo subito un esempio:
@RequestMapping(value="/book/{id}", method=RequestMethod.GET)
public void getBook(@PathVariable int id)
{
System.out.println("Requested book " + id);
}
In questo caso abbiamo creato un handler per l'URL /book/{id}
e, grazie alla nuova annotation @PathVariable, abbiamo definito la variabile id di tipo int. Quindi invocando come url "/book/10" verrà invocato il nostro metodo avendo come parametro "id = 10". Ovviamente invocando /book
oppure /book/aaa otterremo un errore.
Se il nome del placeholder e del parametro differiscono è possibile utilizzare:
@RequestMapping(value="/book/{idBook}", method=RequestMethod.GET)
public void getBook(@PathVariable("idBook") int id)
{
// [...]
}
Per recuperare i valori dei parametri inviati alla pagina possiamo utilizzare l'annotation
@RequestParam
@RequestMapping(value="/book", method=RequestMethod.GET)
public void getBookByParam(@RequestParam("bookId") int id)
{
System.out.println("Requested book " + id);
}
In questo caso anche invocando l'URL /book?bookId=10
otterremo lo stesso effetto.