Métodos GET en controladores MVC

Intermedio
SpringBoot
SpringBoot
Actualizado: 12/06/2025

Métodos @GetMapping en MVC

Los métodos @GetMapping representan la forma más directa de manejar peticiones HTTP GET en Spring Boot MVC. Esta anotación simplifica significativamente la configuración de rutas y permite crear controladores web de manera intuitiva y eficiente.

En el contexto de aplicaciones web tradicionales, los métodos GET se utilizan principalmente para mostrar páginas, formularios y contenido que el usuario puede visualizar. A diferencia de los controladores REST que devuelven datos JSON, los controladores MVC con @GetMapping están diseñados para renderizar vistas y proporcionar una experiencia web completa.

Sintaxis básica de @GetMapping

La anotación @GetMapping se coloca directamente sobre los métodos del controlador para mapear rutas específicas. Su sintaxis es clara y expresiva:

@Controller
public class HomeController {
    
    @GetMapping("/")
    public String inicio() {
        return "index";
    }
    
    @GetMapping("/contacto")
    public String mostrarContacto() {
        return "contacto";
    }
}

Cada método anotado con @GetMapping debe devolver un String que representa el nombre de la vista a renderizar. Spring Boot buscará automáticamente el archivo correspondiente en el directorio de plantillas configurado.

Configuración de rutas múltiples

Un aspecto útil de @GetMapping es su capacidad para mapear múltiples rutas al mismo método. Esto resulta especialmente práctico cuando queremos que diferentes URLs muestren el mismo contenido:

@Controller
public class ProductoController {
    
    @GetMapping({"/productos", "/catalogo", "/tienda"})
    public String mostrarProductos() {
        return "productos/lista";
    }
    
    @GetMapping({"/producto/nuevo", "/producto/crear"})
    public String formularioNuevoProducto() {
        return "productos/formulario";
    }
}

Esta flexibilidad permite crear URLs amigables y mantener compatibilidad con diferentes convenciones de nomenclatura sin duplicar código.

Organización jerárquica con @RequestMapping

Para mantener una estructura organizada en aplicaciones más grandes, es común combinar @GetMapping con @RequestMapping a nivel de clase:

@Controller
@RequestMapping("/admin")
public class AdminController {
    
    @GetMapping("/dashboard")
    public String dashboard() {
        return "admin/dashboard";
    }
    
    @GetMapping("/usuarios")
    public String listarUsuarios() {
        return "admin/usuarios";
    }
    
    @GetMapping("/configuracion")
    public String configuracion() {
        return "admin/config";
    }
}

En este ejemplo, todas las rutas quedan prefijadas con "/admin", creando URLs como "/admin/dashboard" y "/admin/usuarios". Esta aproximación mejora la organización del código y facilita el mantenimiento.

Paso de datos a las vistas

Los métodos @GetMapping pueden enriquecer las vistas con datos utilizando el objeto Model. Este mecanismo permite que las plantillas accedan a información dinámica:

@Controller
public class BlogController {
    
    @GetMapping("/blog")
    public String mostrarBlog(Model model) {
        List<String> articulos = Arrays.asList(
            "Introducción a Spring Boot",
            "Creando tu primera aplicación web",
            "Mejores prácticas en MVC"
        );
        
        model.addAttribute("articulos", articulos);
        model.addAttribute("titulo", "Mi Blog Personal");
        
        return "blog/index";
    }
    
    @GetMapping("/acerca")
    public String acercaDe(Model model) {
        model.addAttribute("autor", "Juan Pérez");
        model.addAttribute("experiencia", "5 años");
        
        return "acerca";
    }
}

El objeto Model actúa como un contenedor de datos que se transfiere automáticamente a la vista. Las plantillas pueden entonces acceder a estos atributos para mostrar contenido dinámico.

Manejo de rutas con patrones

@GetMapping también soporta patrones de rutas que permiten crear URLs más flexibles y expresivas:

@Controller
public class CategoriaController {
    
    @GetMapping("/categoria/*")
    public String mostrarCategoria() {
        return "categoria/general";
    }
    
    @GetMapping("/archivo/**")
    public String mostrarArchivo() {
        return "archivo/navegador";
    }
}

El patrón con asterisco simple (*) coincide con un segmento de ruta, mientras que el doble asterisco (**) coincide con múltiples segmentos. Esta funcionalidad resulta útil para crear sistemas de navegación dinámicos.

Integración con el ciclo de vida de Spring

Los métodos @GetMapping se integran perfectamente con el ecosistema de Spring, permitiendo la inyección de dependencias y el uso de otros componentes del framework:

@Controller
public class TiendaController {
    
    private final ProductoService productoService;
    
    public TiendaController(ProductoService productoService) {
        this.productoService = productoService;
    }
    
    @GetMapping("/tienda")
    public String mostrarTienda(Model model) {
        List<String> productosDestacados = productoService.obtenerDestacados();
        model.addAttribute("productos", productosDestacados);
        
        return "tienda/principal";
    }
}

Esta integración permite que los controladores accedan a servicios de negocio, repositorios y otros beans de Spring, manteniendo una arquitectura limpia y bien estructurada.

PathVariables y RequestParams en MVC

Los controladores MVC necesitan frecuentemente acceder a información específica de las URLs y parámetros de consulta para personalizar las respuestas. Spring Boot proporciona dos mecanismos principales para capturar estos datos: @PathVariable para extraer valores directamente de la ruta URL y @RequestParam para obtener parámetros de consulta.

Estos mecanismos permiten crear aplicaciones web dinámicas donde el contenido se adapta según los valores proporcionados en la URL, facilitando la navegación y la experiencia del usuario.

Uso de @PathVariable

La anotación @PathVariable permite extraer valores directamente de segmentos específicos de la URL. Esto resulta especialmente útil para crear rutas que incluyen identificadores o categorías:

@Controller
public class PerfilController {
    
    @GetMapping("/usuario/{nombre}")
    public String mostrarPerfil(@PathVariable String nombre, Model model) {
        model.addAttribute("nombreUsuario", nombre);
        model.addAttribute("titulo", "Perfil de " + nombre);
        
        return "usuario/perfil";
    }
    
    @GetMapping("/categoria/{tipo}")
    public String mostrarCategoria(@PathVariable String tipo, Model model) {
        model.addAttribute("categoriaActual", tipo);
        
        return "categoria/detalle";
    }
}

En estos ejemplos, las llaves en la ruta ({nombre}, {tipo}) definen las variables que se capturarán. Spring Boot automáticamente extrae estos valores y los inyecta en los parámetros del método correspondiente.

PathVariables con tipos específicos

Spring Boot puede convertir automáticamente los valores de PathVariable a diferentes tipos de datos, no solo String:

@Controller
public class ProductoController {
    
    @GetMapping("/producto/{id}")
    public String mostrarProducto(@PathVariable Long id, Model model) {
        model.addAttribute("productoId", id);
        model.addAttribute("mensaje", "Mostrando producto número: " + id);
        
        return "producto/detalle";
    }
    
    @GetMapping("/descuento/{porcentaje}")
    public String aplicarDescuento(@PathVariable Integer porcentaje, Model model) {
        model.addAttribute("descuento", porcentaje);
        model.addAttribute("textoDescuento", porcentaje + "% de descuento aplicado");
        
        return "promocion/descuento";
    }
}

Esta conversión automática simplifica el manejo de datos numéricos y otros tipos, eliminando la necesidad de conversiones manuales en el código del controlador.

PathVariables múltiples

Los métodos pueden capturar múltiples PathVariables simultáneamente, permitiendo URLs más complejas y expresivas:

@Controller
public class TiendaController {
    
    @GetMapping("/tienda/{categoria}/{subcategoria}")
    public String mostrarSubcategoria(@PathVariable String categoria, 
                                    @PathVariable String subcategoria, 
                                    Model model) {
        model.addAttribute("categoria", categoria);
        model.addAttribute("subcategoria", subcategoria);
        model.addAttribute("ruta", categoria + " > " + subcategoria);
        
        return "tienda/subcategoria";
    }
    
    @GetMapping("/pedido/{clienteId}/producto/{productoId}")
    public String mostrarPedido(@PathVariable Long clienteId, 
                               @PathVariable Long productoId, 
                               Model model) {
        model.addAttribute("cliente", clienteId);
        model.addAttribute("producto", productoId);
        
        return "pedido/detalle";
    }
}

Esta aproximación permite crear jerarquías de navegación claras y URLs semánticamente significativas.

Uso de @RequestParam

La anotación @RequestParam captura parámetros de consulta que aparecen después del símbolo ? en la URL. Estos parámetros son opcionales por naturaleza y permiten filtrar o personalizar el contenido:

@Controller
public class BusquedaController {
    
    @GetMapping("/buscar")
    public String buscar(@RequestParam String termino, Model model) {
        model.addAttribute("terminoBusqueda", termino);
        model.addAttribute("mensaje", "Buscando: " + termino);
        
        return "busqueda/resultados";
    }
    
    @GetMapping("/filtrar")
    public String filtrarProductos(@RequestParam String precio, 
                                  @RequestParam String marca, 
                                  Model model) {
        model.addAttribute("filtros", "Precio: " + precio + ", Marca: " + marca);
        
        return "productos/filtrados";
    }
}

Los parámetros de consulta se acceden mediante URLs como /buscar?termino=laptop o /filtrar?precio=alto&marca=samsung.

RequestParams opcionales y valores por defecto

Spring Boot permite definir parámetros opcionales con valores por defecto, mejorando la flexibilidad de los controladores:

@Controller
public class ListadoController {
    
    @GetMapping("/productos")
    public String listarProductos(@RequestParam(defaultValue = "1") Integer pagina,
                                 @RequestParam(defaultValue = "10") Integer tamaño,
                                 Model model) {
        model.addAttribute("paginaActual", pagina);
        model.addAttribute("elementosPorPagina", tamaño);
        model.addAttribute("inicio", (pagina - 1) * tamaño + 1);
        
        return "productos/listado";
    }
    
    @GetMapping("/noticias")
    public String mostrarNoticias(@RequestParam(required = false) String categoria,
                                 Model model) {
        if (categoria != null) {
            model.addAttribute("filtroCategoria", categoria);
            model.addAttribute("titulo", "Noticias de " + categoria);
        } else {
            model.addAttribute("titulo", "Todas las noticias");
        }
        
        return "noticias/lista";
    }
}

El parámetro required = false hace que el parámetro sea opcional, mientras que defaultValue proporciona un valor cuando no se especifica en la URL.

Combinando PathVariables y RequestParams

Los controladores pueden combinar ambos mecanismos para crear funcionalidades más sofisticadas:

@Controller
public class CatalogoController {
    
    @GetMapping("/catalogo/{categoria}")
    public String mostrarCatalogo(@PathVariable String categoria,
                                 @RequestParam(defaultValue = "nombre") String ordenar,
                                 @RequestParam(defaultValue = "asc") String direccion,
                                 Model model) {
        model.addAttribute("categoria", categoria);
        model.addAttribute("ordenamiento", ordenar);
        model.addAttribute("direccionOrden", direccion);
        model.addAttribute("titulo", "Catálogo de " + categoria);
        
        return "catalogo/categoria";
    }
    
    @GetMapping("/usuario/{id}/configuracion")
    public String configuracionUsuario(@PathVariable Long id,
                                      @RequestParam(required = false) String seccion,
                                      Model model) {
        model.addAttribute("usuarioId", id);
        model.addAttribute("seccionActiva", seccion != null ? seccion : "general");
        
        return "usuario/configuracion";
    }
}

Esta combinación permite URLs como /catalogo/electronica?ordenar=precio&direccion=desc que son tanto semánticamente claras como funcionalmente flexibles.

Validación básica de parámetros

Spring Boot proporciona validación automática de tipos y puede manejar errores de conversión de manera elegante:

@Controller
public class ValidacionController {
    
    @GetMapping("/edad/{años}")
    public String verificarEdad(@PathVariable Integer años, Model model) {
        if (años < 18) {
            model.addAttribute("mensaje", "Acceso restringido para menores de edad");
            model.addAttribute("tipo", "restriccion");
        } else {
            model.addAttribute("mensaje", "Bienvenido, tienes " + años + " años");
            model.addAttribute("tipo", "bienvenida");
        }
        
        return "validacion/edad";
    }
    
    @GetMapping("/rango")
    public String mostrarRango(@RequestParam Integer min,
                              @RequestParam Integer max,
                              Model model) {
        if (min > max) {
            model.addAttribute("error", "El valor mínimo no puede ser mayor que el máximo");
            return "error/parametros";
        }
        
        model.addAttribute("rangoMin", min);
        model.addAttribute("rangoMax", max);
        
        return "datos/rango";
    }
}

Esta validación en el controlador permite manejar casos especiales y proporcionar retroalimentación apropiada al usuario cuando los parámetros no cumplen con los criterios esperados.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en SpringBoot

Documentación oficial de SpringBoot
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, SpringBoot es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de SpringBoot

Explora más contenido relacionado con SpringBoot y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la función y sintaxis básica de la anotación @GetMapping en controladores MVC.
  • Aprender a mapear múltiples rutas y organizar controladores con @RequestMapping.
  • Saber cómo pasar datos dinámicos a las vistas mediante el objeto Model.
  • Utilizar @PathVariable y @RequestParam para capturar datos de la URL y parámetros de consulta.
  • Implementar validaciones básicas y combinar PathVariables con RequestParams para crear URLs dinámicas y funcionales.

Cursos que incluyen esta lección

Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje