La interacción con datos JSON es frecuente en llamadas a interfaces y páginas HTML. Su formato simplificado facilita el análisis, por ejemplo, en servicios web para transmitir información. Spring MVC proporciona mecanismos eficientes para manejar JSON.
Interacción JSON en Spring MVC Preparación del entorno: Se requieren bibliotecas para la conversión JSON. Spring MVC utiliza Jackson para transformar datos con anotaciones como @RequestBody y @ResponseBody. Añade estos archivos JAR al proyecto:
- jackson-core-asl-1.9.11.jar
- jackson-mapper-asl-1.9.11.jar
Configuración del convertidor JSON: Al definir adaptadores de anotaciones individualmente, incluye esta configuración en el archivo XML de Spring MVC:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
Si se emplea <mvc:annotation-driven />, esta configuración adicional no es necesaria.
Ejemplo de código: A continuación, un controlador que procesa solicitudes JSON y clave-valor, devolviendo respuestas en formato JSON.
package com.ejemplo.controladores;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ejemplo.modelos.ProductoPersonalizado;
import com.ejemplo.servicios.ProductoServicio;
@Controller
public class JsonInteraccionControlador {
@Autowired
private ProductoServicio productoServicio;
// Acepta una solicitud JSON con datos de producto y devuelve JSON
@RequestMapping("/procesarJson")
@ResponseBody
public ProductoPersonalizado procesarJson(@RequestBody ProductoPersonalizado producto) throws Exception {
int productoId = producto.getId();
ProductoPersonalizado resultado = productoServicio.buscarProductoPorId(productoId);
return resultado;
}
// Acepta parámetros clave-valor y devuelve JSON
@RequestMapping("/procesarParametros")
@ResponseBody
public ProductoPersonalizado procesarParametros(ProductoPersonalizado producto) throws Exception {
int productoId = producto.getId();
ProductoPersonalizado resultado = productoServicio.buscarProductoPorId(productoId);
return resultado;
}
}
Página JSP para pruebas: Incluye botones que activan soilcitudes AJAX para probar la interacción JSON.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Prueba de Interacción JSON</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
function enviarJson() {
$.ajax({
type: 'post',
url: '${pageContext.request.contextPath}/procesarJson',
contentType: 'application/json;charset=utf-8',
data: '{"id":2,"nombre":"Tablet","precio":1200}',
success: function(respuesta) {
console.log(respuesta);
}
});
}
function enviarParametros() {
$.ajax({
type: 'post',
url: '${pageContext.request.contextPath}/procesarParametros',
data: 'id=5&nombre=Laptop&precio=2500',
success: function(respuesta) {
console.log(respuesta);
}
});
}
</script>
</head>
<body>
<button onclick="enviarJson()">Enviar JSON, recibir JSON</button>
<button onclick="enviarParametros()">Enviar parámetros, recibir JSON</button>
</body>
</html>
Al ejecutar estas pruebas, el controlador procesa las solicitudes y retorna datos JSON basados en la información de la base de datos.
Soporte RESTful en Spring MVC RESTful es un paradigma de diseño que optimiza el uso de HTTP, promoviendo URLs limpias, métodos HTTP estnadarizados y tipos de contenido adecuados.
- URL estilo REST: Formatos como
/productos/001en lugar de/consultar.action?id=001, simplificando la transmisión de parámetros. - Métodos HTTP: Se utilizan verbos como DELETE para eliminación y PUT para actualización, manteniendo URLs consistentes.
- Content-Type: Se especifican tipos como JSON para definir el formato de los datos en solicitudes y respuestas.
Ejemplo práctico: Un controlador que responde a URLs estilo REST para obtener productos.
@Controller
@RequestMapping("/productos")
public class ProductoControlador {
@Autowired
private ProductoServicio productoServicio;
// Mapea URLs como /productos/ver/{id} para consultar un producto
@RequestMapping("/ver/{identificador}")
@ResponseBody
public ProductoPersonalizado verProducto(@PathVariable("identificador") Integer productoId) throws Exception {
ProductoPersonalizado producto = productoServicio.buscarProductoPorId(productoId);
return producto;
}
}
Configuración para REST: Ajusta el DispatcherServlet para manejar URLs sin extensión y permite acceso a recursos estáticos. En web.xml:
<servlet>
<servlet-name>springmvc_rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc_rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
En el archivo de configuración de Spring MVC, añade reglas para recursos estáticos:
<mvc:resources mapping="/recursos/**" location="/recursos/" />
<mvc:resources mapping="/js/**" location="/js/" />
Con esta configuración, las solicitudes a URLs REST como /productos/ver/1 son manejadas correctamente, devolviendo datos JSON o ejecutando acciones específicas según el método HTTP.