Controladores¶
En una aplicación Spring Boot con Thymeleaf, los controladores son las clases encargadas de recibir las peticiones HTTP del navegador, procesarlas y devolver una vista (plantilla HTML) junto con los datos necesarios para renderizarla.
Para que Spring reconozca una clase como controlador, se utiliza la anotación @Controller. Además, con @RequestMapping se define una ruta base que se antepone a todas las URLs del controlador.
Cada método del controlador puede manejar una petición específica (por ejemplo GET) usando anotaciones como @GetMapping, las cuales indican:
El tipo de petición HTTP.
La URL que activará ese método.
La vista que se debe retornar.
Ejemplo¶
@Controller
@RequestMapping("/plantillas")
public class LosPipolPlantilla {
@Autowired
private PipolRepository pipolRepository;
@GetMapping("/lista-pipol")
public String listaPipol(Model model) {
Iterable<Pipol> pipols = pipolRepository.findAll();
model.addAttribute("pipols", pipols);
return "lista-pipol";
}
@GetMapping("/los-pipol-template-model-and-view")
public ModelAndView losPipolTemplateModelAndView() {
return new ModelAndView("los-pipol-template-model-and-view");
}
@GetMapping("/los-pipol-solo-texto")
public String losPipolSoloTexto() {
return "los-pipol-solo-texto";
}
@GetMapping("/los-pipol-paso-parametro")
public ModelAndView losPipolPasoParametro() {
ModelAndView modelAndView = new ModelAndView("los-pipol-paso-parametros");
modelAndView.addObject("pipol1", "Pablo");
modelAndView.addObject("pipol2", "María");
modelAndView.addObject("pipol3", "Francisco");
modelAndView.addObject("pipol4", "Miguel");
modelAndView.addObject("pipol5", "Esther");
return modelAndView;
}
}
Explicación clave del código¶
- @Controller: Indica que la clase es un controlador de Spring MVC.
- @RequestMapping("/plantillas"): Define la URL base del controlador. Todas las rutas comienzan con /plantillas.
- @GetMapping("/lista-pipol"): Maneja peticiones GET a la URL. /plantillas/lista-pipol
- Model y ModelAndView: Se utilizan para enviar datos desde el controlador hacia la vista Thymeleaf. Indica el nombre de la plantilla HTML que se renderiza (sin la extensión .html).
Endpoint¶
Un endpoint es una URL expuesta por una aplicación o servicio que permite a los clientes comunicarse con él mediante un protocolo, generalmente HTTP.
Cada endpoint define:
- La ruta que se debe invocar (por ejemplo, /plantillas/los-pipol-solo-texto)
- El método HTTP que se utiliza (GET, POST, PUT, DELETE, etc.)
- La operación que se ejecuta en el servidor al recibir la solicitud
En aplicaciones web (por ejemplo, con Spring Boot), un endpoint suele estar asociado a un método de un controlador, el cual procesa la solicitud y retorna una respuesta, como datos (JSON), una vista (HTML) o un código de estado HTTP.
Paso de plantilla¶
Retornando un String¶
En esta estructura de plantilla:
src/
└── main/
└── resources/
├── static/
│ ├── css/
│ ├── js/
│ └── index.html
├── templates/
│ ├── lista-pipol.html
│ ├── los-pipol-solo-parametros.html
│ ├── los-pipol-solo-texto.html
│ └── los-pipol-template-model-and-view.html
└── application.properties
En esta estructura y con este código:
@GetMapping("/los-pipol-solo-texto")
public String losPipolSoloTexto() {
return "los-pipol-solo-texto";
}
La consulta mediante el endpoint:
GET /plantillas/los-pipol-solo-texto
retorna el archivo los-pipol-solo-texto.html, el cual se encuentra ubicado en la carpeta templates/.
En este caso, el método del controlador retorna un String con el nombre lógico de la plantilla, sin incluir la extensión .html, y el motor de plantillas se encarga de resolver automáticamente el archivo correspondiente dentro del directorio templates/.
Con la clase Model View¶
La clase ModelAndView es utilizada en Spring MVC para retornar, en una sola estructura, la vista que se debe renderizar y el modelo de datos que será enviado a dicha vista.
En el siguiente ejemplo se define un endpoint que responde a una solicitud HTTP GET y retorna una vista HTML ubicada en la carpeta templates.
@GetMapping("/los-pipol-template-model-and-view")
public ModelAndView losPipolTemplateModelAndView() {
return new ModelAndView("los-pipol-template-model-and-view");
}
- El endpoint expone la ruta /los-pipol-template-model-and-view.
- El método retorna un objeto ModelAndView.
- El nombre de la vista se especifica como un String, sin la extensión .html.
Spring se encarga de resolver automáticamente la vista correspondiente en la ruta:
Archivo de la vista
El archivo HTML asociado se encuentra en la carpeta templates y contiene el contenido que será renderizado al cliente:
Paso de parámetros¶
En este ejemplo, el controlador retorna un objeto ModelAndView y define múltiples parámetros individuales mediante el método addObject.
Parámetros simples¶
@GetMapping("/los-pipol-paso-parametro")
public ModelAndView losPipolPasoParametro() {
ModelAndView modelAndView = new ModelAndView("los-pipol-solo-parametros");
modelAndView.addObject("pipol1", "Pablo");
modelAndView.addObject("pipol2", "Maria");
modelAndView.addObject("pipol3", "Francisco");
modelAndView.addObject("pipol4", "Miguel");
modelAndView.addObject("pipol5", "Esther");
return modelAndView;
}
Cada llamada a addObject define un atributo con un nombre y un valor.
Estos atributos quedan disponibles en la vista asociada.
Vista (Thymeleaf)
<h1>Los pipol en solo texto</h1>
El nombre del pipol:
<span th:text="${pipol1}"></span>,
<span th:text="${pipol2}"></span>,
<span th:text="${pipol3}"></span>,
<span th:text="${pipol4}"></span>,
<span th:text="${pipol5}"></span>
La expresión ${} permite acceder a los atributos enviados desde el controlador.
Thymeleaf reemplaza dinámicamente el contenido al renderizar la página.
Controlador objetos¶
En este caso, el controlador envía una lista de objetos al modelo, lo que permite manejar estructuras de datos más complejas.
@GetMapping("/lista-pipol")
public String laListaPipol(Model model) {
List<Pipol> pipols = new ArrayList<>();
pipols.add(new Pipol(1L, "Pablo", "Márquez", "80"));
pipols.add(new Pipol(2L, "Maria", "Pacheco", "50"));
pipols.add(new Pipol(3L, "Francisco", "Márquez", "1000"));
pipols.add(new Pipol(4L, "Miguel", "Márquez", "1001"));
model.addAttribute("pipols", pipols);
return "lista-pipol";
}
<h1>Pipoles</h1>
<ul>
<li th:each="pipol : ${pipols}">
<span th:text="${pipol.nombre}"></span>
</li>
</ul>
Recepción de datos¶
Formulario HTML¶
Veamos el siguiente HTML:
<form action="/controllers/imprimir-un-pipol" method="POST">
Nombre del sexto pipol<br/>
<input type="text"
id="nombreSextoPipol"
name="nombreSextoPipol" />
<br/><br/>
<input type="submit" value="Imprimir el sexto pipol"/>
</form>
¿Qué ocurre aquí?
- El formulario usa el método POST para enviar datos al servidor.
- El atributo name="nombreSextoPipol" define el nombre del parámetro HTTP.
- Al enviar el formulario, el navegador envía una petición con el siguiente formato:
Recepción parámetro¶
Veamos el siguiente código:
@Controller
@RequestMapping("/controllers")
public class FormularioLosPipol {
@Autowired
private PipolRepository pipolRepository;
@PostMapping("/imprimir-un-pipol")
public String imprimirDatos( Model model, @RequestParam String nombreSextoPipol) {
pipolRepository.save(
new Pipol( null, nombreSextoPipol, "Apellido", "312312")
);
Iterable<Pipol> pipols = pipolRepository.findAll();
model.addAttribute("pipols", pipols);
return "lista-pipol";
}
}
¿Cómo Spring recibe el dato?
- @RequestParam indica que el valor viene desde la petición HTTP.
- Spring busca un parámetro llamado exactamente igual: nombreSextoPipol
- El valor enviado desde el formulario se asigna automáticamente a la variable nombreSextoPipol.
- Se ingresa Model como parámetro para enviar parámetros al template de respuesta, que como se mencionó anteriormente, se insera