Documentos de Académico
Documentos de Profesional
Documentos de Cultura
REST Con Spring
REST Con Spring
0 Web MVC
Framework
El Framework Web MVC (modelo-vista-controlador) de Spring est diseado alrededor de un Servlet
(DispatcherServlet) encargado de enviar las peticiones a los diferentes manejadores (handlers) de la
aplicacin, a partir de la configuracin del mapeo de manejadores, la resolucin de las vistas, locale, etc.
Es decir, al configurar este serlvet en el fichero web.xml de tu aplicacin web, todas las peticiones pasarn
por l y se encargar de redirigir a los diferentes manejadores. Los manejadores por defecto se basan en
las anotaciones @Controller y @RequestMapping como veremos a continuacin. A partir de la versin
3.0 de Spring es posible crear aplicaciones Web RESTfull a travs de la anotacin @PathVariable.
En esto ltimo se va a centrar este artculo, en la implementacin de los controladores a travs de
anotaciones y en la configuracin de los mismos para crear aplicaciones REST.
Dispatcher Servlet
Cmo comentamos al principio, el framework MVC de Spring est diseado alrededor de un servlet que
reenva las peticiones a los diferentes controladores. Este servlet est plenamente integrado con el
contenedor IoC (Inversion of Control) lo que permite usar todas las caractersticas del framework Spring.
Se trata de un servlet (hereda de la clase base HttpServlet) y como tal se declara en el fichero de
configuracin web.xml de tu aplicacin web:
<web-app>
<servlet>
<servlet-name>buscar</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>buscar</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
En el ejemplo anterior, tal como se puede ver en el mapeo del servlet, todas las peticiones que acaben en
.do sern manejados por el DispatcherServlet buscar.
Implementando Controladores
Los controladores proveen acceso al comportamiento de la aplicacin, interpretan los inputs del usuario
y los transforman en un modelo que es representado al usuario por una vista (modelo-vista-controlador).
Spring implementa un controller de una manera abstracta, lo que permite crear una gran variedad de
controladores.
A partir de la versin 2.5, y la mantiene tambin en la versin 3.0, Spring introdujo el modelo de
programacin basado en anotaciones, que usa anotaciones como @RequestMapping, @RequestParam,
@ModelAttribute, etc. Los controladores implementados a travs de este estilo no necesitan heredar de
ninguna clase base o implementar ninguna interfaz especfica:
@Controller
public class HelloWorldController {
@RequestMapping("/helloWorld")
public ModelAndView helloWorld() {
ModelAndView mav = new ModelAndView();
mav.setViewName("helloWorld");
mav.addObject("message", "Hello World!");
return mav;
}
}
Para activar la autodeteccin de los controllers que contienen la anotacin, debes aadir a tu
configuracin el componente que los escanea:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.paquete.ejemplo.controllers"/>
// ...
</beans>
}
@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm evento,
BindingResult result) {
if (result.hasErrors()) {
return "mostrareventos/new";
}
appointmentBook.addAppointment(evento);
return "redirect:/mostrareventos";
}
}
En el ejemplo anterior la anotacin @RequestMapping se usa primero a nivel de clase. De esa manera
indica que todos los mtodos de este controlador manejarn las peticiones con el path relativo
/mostrareventos. El mtdo get() refina dicha URL y se ejecuta nicamente cuando se trata de un mtodo
GET. El mtodo add(), por el contrario, se ejecuta cuando se realiza un POST de un formulario del sitio
web.
Los mtodos getForDay() y getNewForm() se ejecutarn cuando se trate de una peticin GET y adems
la URL contenga /mostrareventos/daEvento o /mostrareventos/new, respectivamente.
URI Templates
Para acceder a partes de la URL en los mtodos manejadores usamos los patrones de URI o URI
Templates, dando valores dentro del path de @RequestMapping. Luego podemos usar la anotacin
@PathVariable para indicar que un parmetro del mtodo se va a enlazar con un valor que viene en una
variable de la URI. Veamos un ejemplo:
@RequestMapping(value="/alumnos/{alumnoId}", method=RequestMethod.GET)
public String findAlumno(@PathVariable String alumnoId, Model model) {
Alumno alumno = alumnoService.findAlumno(alumnoId);
model.addAttribute("alumno", alumno);
return "displayAlumno";
}
La URI Template /alumnos/{alumnoId} especifica la variable con el nombre alumnoId. Cuando un
controlador maneja esta peticin, el valor de alumnoId se establece con el valor que viene en la URL. Por
ejemplo, cuando llega una peticin con esta URL /alumnos/francisco el valor francisco se asociar al
parmetro alumnoId de tipo String del mtodo manejador.
Puedes usar varias anotaciones @PathVariable para enlazar mltiples variables URI Templates:
@RequestMapping(value="/alumno/{alumnoId}/asignatura/{asignaturaId}",
method=RequestMethod.GET)
public String findAsignatura(@PathVariable String alumnoId,
@PathVariable String asignaturaId, Model model) {
Alumno alu = alumnoService.findAlumno(alumnoId);
Asignatura asig = alumno.getSignatura(signaturaId);
model.addAttribute("Asignatura", asignatura);
return "displayAsignatura";
}
El mtodo findAsignatura se ejecutara al invocar, por ejemplo la URL /alumno/245/asignatura/32.
Podemos indicar una parte a nivel de clase y otra a nivel de mtodo como en el siguiente ejemplo:
@Controller
@RequestMapping("/alumno/{alumnoId}")
Conclusiones
Tal y cmo nos propusimos al inicio de este artculo pretendamos realizar una introduccin a la
programacin de aplicaciones REST con Spring 3.0. Cmo cualquier aplicacin Spring MVC, hemos
configurado el DispatcherServlet, hemos aprendido a declarar controladores mediante la anotacin
@Controller. Tambin hemos mapeado peticiones con la anotacin @RequestMapping y por ltimo
hemos asociado valores de variables de la URL a parmetros de los mtodos manejadores de los
controladores mediante URI Templates y la anotacin @PathVariable. Con todo esto podemos comenzar
a construir una aplicacin REST en la que cada recurso sea accesible mediante una URL amigable del
tipo:
http://mi-dominio/gestionalumnos/
http://mi-dominio/gestionalumnos/alumno/new
http://mi-dominio/gestionalumnos/alumno/234
http://mi-dominio/gestionalumnos/alumno/234/asignatura/32
http://mi-dominio/gestionalumnos/asignatura/new
http://mi-dominio/gestionalumnos/asignatura/32
etc...