PDF de programación - Spring - Sesión 4 Aplicaciones AJAX y REST

<<>>
Imágen de pdf Spring - Sesión 4 Aplicaciones AJAX y REST

Spring - Sesión 4 Aplicaciones AJAX y RESTgráfica de visualizaciones

Publicado el 21 de Enero del 2019
462 visualizaciones desde el 21 de Enero del 2019
301,2 KB
14 paginas
Experto Universitario Java Enterprise

Spring

Sesión 4

Aplicaciones AJAX y REST



Experto Universitario Java Enterprise

Puntos a tratar

• AJAX con Spring MVC

• Enviar fragmentos de HTML/objetos al cliente
• Recibir objetos del cliente

• Servicios web REST

• Repaso de la filosofía REST
• Obtener recursos (GET)
• Crear o modificar recursos (POST/PUT)
• Eliminar recursos (DELETE)
• Parte del cliente
Tratamiento de errores en AJAX y REST



Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

2



Experto Universitario Java Enterprise

Serialización de objetos en la petición/respuesta

HTTP

• Ya hemos visto que la conversión de parámetros HTTP a objeto Java es automática


Los encargados de serializar/deserializar de HTTP en Spring son los
HttpMessageConverter
• Por defecto el de XML ya está implementado en Spring, solo sería necesario anotar el objeto

con JAXB

• Simplemente incluyendo en el classpath la librería open source Jackson (http://

jackson.codehaus.org), podemos convertir de/a JSON





@RequestBody anotando un parámetro de un método indica que queremos
deserializar el cuerpo de la petición HTTP y convertirlo al tipo del parámetro
@ResponseBody anotando el valor de retorno de un método indica que queremos
serializar el valor en el cuerpo de la respuesta HTTP


Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

3



Experto Universitario Java Enterprise

AJAX: enviar fragmentos de HTML al cliente

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

4

<form id="registro" action="#"> Login: <input type="text" name="login" id="campo_login"> <span id="mensaje"></span><br> Password: <input type="password" name="password"> <br> Nombre y apellidos: <input type="text" name="nombre"> <br> <input type="submit" value="registrar"></form><script type="text/javascript"> $('#campo_login').blur( function() { $('#mensaje').load('loginDisponible.do', "login="+$('#campo_login').val()) } )</script>@RequestMapping("/loginDisponible.do") public @ResponseBody String loginDisponible(@RequestParam("login") String login) { if (ubo.getUsuario(login)==null) return "login disponible"; else return "login <strong>no</strong> disponible"; }

Experto Universitario Java Enterprise

AJAX (II): enviar objetos al cliente

• Para enviar JSON, simplemente incluir la dependencia de Jackson
• Para enviar XML, anotar la clase InfoLogin con JAXB

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

5

public @ResponseBody InfoLogin loginDisponible(@RequestParam("login") String login) { if (ubo.getUsuario(login)==null) //Si está disponible, no hacen falta sugerencias return new InfoLogin(true, null); else //si no lo está, generamos las sugerencias con la ayuda del IUsuarioBO return new InfoLogin(false, ubo.generarSugerencias(login));}@XmlRootElementpublic class InfoLogin { private boolean disponible; private List<String> sugerencias; @XmlElement public boolean isDisponible() { return disponible; } ...}

Experto Universitario Java Enterprise

AJAX (III): Recibir objetos del cliente

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

6

@RequestMapping("/altaUsuario.do")public void altaUsuario(@RequestBody Usuario usuario) { ...}<form id="registro" action="#"> Login: <input type="text" name="login" id="login"> <span id="mensaje"></span><br> Password: <input type="password" name="password" id="password"> <br> Nombre y apellidos: <input type="text" name="nombre" id="nombre"> <br> <input type="submit" value="registrar"></form><script type="text/javascript"> $('#registro').submit(function(evento) { $.ajax({ url: 'altaUsuario.do', type: 'POST', data: JSON.stringify({login: $('#login').val(), password: $('#password').val(), nombre: $('#nombre').val()}), processData: false, contentType: "application/json" }) evento.preventDefault(); });</script>

Experto Universitario Java Enterprise

Servicios Web REST: repaso

• Cada URI identifica un recurso (entidad, objeto)

• Se suelen organizar de manera jerárquica

• El método HTTP indica qué operación queremos realizar sobre el recurso



La respuesta del servidor se acompaña de un código de estado HTTP



404 recurso inexistente
400 petición incorrecta

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

7

/hoteles/excelsiorMad/ofertas/15/hoteles/ambassador03/ofertas/15 /hoteles/ambassador03/ofertas/ (todas las del hotel)GET /hoteles/excelsiorMad/ofertas/15 ver la ofertaGET /hoteles/excelsiorMad/ofertas/ ver todas las ofertas del hotelPOST /hoteles/excelsiorMad/ofertas/15 crear la ofertaPUT /hoteles/excelsiorMad/ofertas/15 actualizar la ofertaDELETE /hoteles/excelsiorMad/ofertas/15 eliminar la oferta

Experto Universitario Java Enterprise

URIs y PathVariables (@PathParam en JAX-RS)

• El diseño de las URIs REST hace que hayan partes fijas y partes variables. Nos

interesa saber el valor de esas partes variables

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

8

/hoteles/excelsiorMad/ofertas/15/hoteles/{idHotel}/ofertas/{idOferta} @Controllerpublic class OfertaRESTController { @Autowired IOfertasBO obo; @RequestMapping(value="hoteles/{idHotel}/ofertas/{idOferta}", method=RequestMethod.GET) @ResponseBody public Oferta mostrar(@PathVariable String idHotel, @PathVariable int idOferta) { Oferta oferta = obo.getOferta(idHotel, idOferta); return oferta; }}

Experto Universitario Java Enterprise

Obtener recursos: GET





ResponseEntity<Clase> representa una respuesta HTTP en la que se serializa
un objeto de la clase Clase. Para no serializar nada, ResponseEntity<Void>
También se podría usar @ResponseBody, pero la convención en Spring es usar esto
para REST

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

9

@Controller@RequestMapping("/hoteles/{idHotel}/ofertas")public class OfertasController { @Autowired IOfertasBO obo; @RequestMapping(method=RequestMethod.GET, value="{idOferta}", produces=MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<Oferta> obtenerOferta(@PathVariable String idHotel, @PathVariable int idOferta) throws OfertaInexistenteException { Oferta oferta = obo.getOferta(idHotel, idOferta); return new ResponseEntity<Oferta>(oferta, HttpStatus.OK); }}

Experto Universitario Java Enterprise

Crear/modificar recursos (POST/PUT)

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

10

@RequestMapping("/hoteles/{idHotel}/ofertas")public class OfertasController { @Autowired IOfertasBO obo; //Ya no se muestra el código de obtenerOferta //... @RequestMapping(method=RequestMethod.POST, value="") public ResponseEntity<Void> insertarOferta(@PathVariable idHotel, @RequestBody Oferta oferta, HttpServletRequest peticion) { int idOFerta = obo.crearOferta(idHotel, oferta); HttpHeaders cabeceras = new HttpHeaders(); try { cabeceras.setLocation(new URI(peticion.getRequestURL()+ Integer.toString(idOFerta))); } catch (URISyntaxException e) { e.printStackTrace(); } return new ResponseEntity<Void>(cabeceras, HttpStatus.CREATED); }}

Experto Universitario Java Enterprise

Eliminar recursos (DELETE)

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

11

@RequestMapping(method=RequestMethod.DELETE, value="{idOferta}")public ResponseEntity<Void> borrarOferta(@PathVariable idHotel, @PathVariable idOferta) { obo.eliminarOferta(idHotel, idOferta); return new ResponseEntity<Void>(HttpStatus.OK);}

Experto Universitario Java Enterprise

Clientes REST

• En principio se puede programar un cliente REST con JavaSE estándar, pero es

tedioso
• Hay librerías como Jakarta Commons HttpClient, que facilitan la tarea, además de

implementar autentificación BASIC y otras características

• Spring proporciona RestTemplate

Spring

© 2012-2013 Depto. Ciencia de la Computación e IA

AJAX y REST con Spring

12

RestTemplate template = new RestTemplate();String uri = "http://localhost:8080/ServidorREST/hoteles/{idHotel}/ofertas/{idOferta}";Oferta oferta = template.getForObject(uri, Oferta.class, "ambassador", 1);System.out.println(oferta.getPrecio() + "," + oferta.getFin());RestTemplate template = new RestTemplate();String uri = "http://localhost:8080/TestRESTSpring3/hoteles/{idHotel}/ofertas";//aquí le daríamos el valor deseado a los campos del objetoOferta oferta = new Oferta( ..., ..., ...);URI result = template.postForLocation(uri, oferta, "ambassador");

Experto Universitario Java Enterprise

Tratamiento de errores en AJAX y REST

• Si un método de un Controller lanza una excepción, por defecto se le envía al cliente

en la respuesta HTTP, lo que no es muy apropiado
Tampoco es apropiado para un cliente AJAX o REST saltar a una página de error
JSP o HTML (típico en operaciones no AJAX)



• Podemos convertir ciertas excepciones en códigos de estado HTTP con un método

del controller anotado con @ExceptionHandler
• De hecho, Spring ya
  • Links de descarga
http://lwp-l.com/pdf14926

Comentarios de: Spring - Sesión 4 Aplicaciones AJAX y REST (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad