Come detto nel paragrafo precendente i controller si occupano di servire le richieste che vengono fornite dalla DispatchServlet. Per indicare quali richieste devono essere inoltrate ai propri metodi in ogni controller ci sono una serie di @RequestMapping. Oltre a definire il path per il quale deve essere invocato un determinato metodo, si può definire l'HTTP method per il quale eseguire la richiesta (POST, GET):
@RequestMapping(value = "/", method = RequestMethod.GET)
public String welcome(Model model) {
model.addAttribute(b);
return "/book/createBook";
}
Se non viene speficifata una @RequestMapping a livello di classe tutti i path specificati saranno considerati assoluti, invece se tale annotation viene specificata tutti i path saranno considerati relativi, ad esempio per:
@Controller
public class ExampleController {
@RequestMapping(value = "/")
public String welcome(Model model) {
model.addAttribute(new Book());
return "/book/createBook";
}
}
il path per il quale verrà invocato il metodo è http://…./{dispatcherServlet mapping}/, invece per
@Controller
@RequestMapping(value = "/book")
public class ExampleController {
@RequestMapping(value = "/")
public String welcome(Model model) {
model.addAttribute(new Book());
return "/book/createBook";
}
}
il path per il quale verrà invocato il metodo è http://…./{dispatcherServlet mapping}/book/.
Il path espresso attraverso il @RequestMapping può essere anche scritto in questa forma
/path/{param}
dove param può assumere un valore determinato dinamicamente. I path di questo tipo vengono chiamati URI Templates e vengono, generalmente, utilizzati per creare servizi Rest. Si lascia al lettore un eventuale approfondimento sull’argomento.
Ogni metodo del controller annotato con @RequestMapping può avere una firma molto variabile, vediamo i principali parametri di input:
- Request e Response delle API Servlet come HttpServletRequest.
- HttpSession per accedere alla sessione.
- org.springframework.web.context.request.WebRequest, un modo alternativo per accedere ai parametri della request.
- Parametri annotati con @PathVariable per i @RequestMapping con path del tipo /path/{param}
- Parametri annotati con @RequestParam, il cui valore viene preso dalla request.
- Parametri che vengono esposti poi alla view: Model, Map, e ModelMap. Settando parametri in questi oggetti vengo aggiunti come attributi alla request, e quindi visualizzabili, per esempio, in una jsp.
- Errors e BindingResult per la validazione di form.
Anche i valori di ritono dei metodi sono variabili ma, per semplicità espositiva, nei nostri esempi useremo solo il tipo String.
@Controller
@RequestMapping("example")
public class FullController {
@RequestMapping("m1")
public String m1(HttpServletRequest request, HttpServletResponse response){
//business logic
return "/path";
}
@RequestMapping("m2")
public String m2(HttpSession session){
//business logic
return "/path";
}
@RequestMapping("m3")
public String m3(WebRequest request){
//business logic
return "/path";
}
@RequestMapping("m4/{param}")
public String m4(@PathVariable String param){
//business logic
return "/path";
}
@RequestMapping("m5")
public String m5(Model model, BindingResult result){
//business logic
return "/path";
}
}