Spring Boot

SpringBoot

Tutorial SpringBoot: Métodos GET en controladores MVC

Aprende a usar métodos GET en controladores MVC con Spring Boot para manejar rutas, PathVariables y RequestParams en aplicaciones web.

Aprende SpringBoot y certifícate

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.

Aprende SpringBoot online

Otras lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Crear Proyecto Con Spring Initializr

Spring Boot

Introducción Y Entorno

Crear Proyecto Desde Visual Studio Code

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Controladores Spring Rest

Spring Boot

Spring Mvc Con Thymeleaf

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Mvc Con Thymeleaf

Servicios En Spring

Spring Boot

Spring Mvc Con Thymeleaf

Clientes Resttemplate Y Restclient

Spring Boot

Spring Mvc Con Thymeleaf

Rxjava En Spring Web

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Post En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Get En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Formularios En Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Crear Proyecto Con Intellij Idea

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Los Modelos Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Layouts Y Fragmentos En Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Bootstrap Css

Spring Boot

Spring Mvc Con Thymeleaf

Gestión De Errores Controlleradvice

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Tailwind Css

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Controladores Rest

Spring Boot

Spring Rest

Métodos Get En Controladores Rest

Spring Boot

Spring Rest

Métodos Post En Controladores Rest

Spring Boot

Spring Rest

Métodos Delete En Controladores Rest

Spring Boot

Spring Rest

Métodos Put Y Patch En Controladores Rest

Spring Boot

Spring Rest

Gestión De Errores Restcontrolleradvice

Spring Boot

Spring Rest

Creación De Entidades Jpa

Spring Boot

Spring Data Jpa

Asociaciones De Entidades Jpa

Spring Boot

Spring Data Jpa

Repositorios Spring Data

Spring Boot

Spring Data Jpa

Métodos Find En Repositorios

Spring Boot

Spring Data Jpa

Inserción De Datos

Spring Boot

Spring Data Jpa

Actualizar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Borrar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Spring Data Jpa

Api Query By Example (Qbe)

Spring Boot

Spring Data Jpa

Api Specification

Spring Boot

Spring Data Jpa

Repositorios Reactivos

Spring Boot

Spring Data Jpa

Configuración Base De Datos Postgresql

Spring Boot

Spring Data Jpa

Configuración Base De Datos Mysql

Spring Boot

Spring Data Jpa

Introducción A Jpa Y Spring Data Jpa

Spring Boot

Spring Data Jpa

Configuración Base De Datos H2

Spring Boot

Spring Data Jpa

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Introducción Al Testing

Spring Boot

Testing Con Spring Test

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Login De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Validación Jwt En Api Rest

Spring Boot

Seguridad Con Spring Security

Autenticación Jwt Completa En Api Rest

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Fundamentos De Autenticación Oauth

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth Con Github

Spring Boot

Seguridad Con Spring Security

Testing Con Spring Security Test

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth En Api Rest

Spring Boot

Seguridad Con Spring Security

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Funciones

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

Ejercicios de programación de SpringBoot

Evalúa tus conocimientos de esta lección Métodos GET en controladores MVC con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

En esta lección

Objetivos de aprendizaje 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.