En esta página:
En el trabajo con Spring Framework y con otras herramientas, existen ciertas técnicas fundamentales y buenas prácticas para escribir código de manera optima, en este caso para crear una clase de Controlador con Spring Framework. Lo normal en Spring Framework es escribir una clase de controlador para manejar las solicitudes que provienen de un cliente, en este Post te daré ciertos consejos para crear Controladores de manera optima.
Antes de continuar, te recomiendo leer el artículo Que es Spring Framework y Otros Detalles para que estés familiarizado con este Post y si ya conoces sobre Kotlin, pues adelante, no hay problema.
Asimismo te invito a escuchar el Podcast: “Dominio del trabajo con Varios Lenguajes de Programación.”
Sound Cloud:
Spotify:
Bien ahora continuemos con el Post: 5 Consejos para escribir Controladores Spring MVC.
Un controlador suele invocar a una clase determinada que procesa tareas específicas y luego redirige al usuario o cliente a una vista determinada, en algunos casos no suele redirigir a una vista, este proceso de ida y vuelta tiene que tener un código óptimo para que las tareas se ejecuten sin problemas.
Usa el estereotipo @Controller
Esta es la manera más sencilla de crear una clase de controlador que pueda manejar una o varias solicitudes, sencillamente declarando una clase con el estereotipo @Controller, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HomeController { @RequestMapping("/") public String visitarHome() { // hacer algo antes de devolver el nombre de la vista return "home"; } } |
Puedes ver que el método visitarHome() maneja las solicitudes que llegan a la ruta de contexto de la aplicación (“/”) redirigiendo a la vista home con return “home”.
Nota: El estereotipo @Controller solo se puede usar cuando la anotación está activada en el archivo de configuración de Spring:
1 2 3 |
<annotation-driven /> |
Luego que se activa la anotación, el contenedor Spring busca automáticamente clases bajo el paquete especificado en la siguiente declaración:
1 2 3 |
<context:component-scan base-package="net.codejava.spring" /> |
Las clases que usan la anotación @Controller se configuran como controladores, esto es más optimo debido a su simplicidad, no es necesario declarar beans para controladores en el archivo de condiguración.
Nota: Al usar la anotación @Controller se puede tener tener una clase de controlador de múltiples acciones que pueden atender múltiples solicitudes diferentes, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@Controller public class MultiActionController { @RequestMapping("/listarPostres") public ModelAndView listarPostres() { // } @RequestMapping("/guardarPostre") public ModelAndView guardarPostre(Postre postre) { // } @RequestMapping("/eliminarPostre") public ModelAndView eliminarPostre(Postre postre) { // } } |
En el código anterior, existen 3 métodos de control que procesan tres peticiones diferentes /listarPostres, /guardarPostre y /eliminarPostre, respectivamente.
Implementa la interfaz Controller
Otra manera, quizás clásica de crear un controlador en Spring Framework, es hacer una clase implemente la interfaz Controller, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class MainController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Hola Nube Colectiva"); return new ModelAndView("main"); } } |
La clase implementada en el código debe anular el método handleRequest(), que es invocado por el servlet del dispatcher de Spring cuando llegue una solicitud que coincida, el patrón de URL de una solicitud que es manejado por este controlador, se define en el archivo de configuración de Spring:
1 2 3 |
<bean name="/main" class="net.codejava.spring.MainController" /> |
Un inconveniente de este enfoque, es que la clase de controlador no puede manejar múltiples URLs de solicitudes.
Especifica los métodos de solicitud HTTP en el método del controlador
Puedes especificar los métodos HTTP (GET, POST, PUT, etc.) utilizando la propiedad method de la anotación @RequestMapping, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class LoginController { @RequestMapping(value = "/login", method = RequestMethod.GET) public String vistaLogin() { return "LoginForm"; } @RequestMapping(value = "/login", method = RequestMethod.POST) public String hacerLogin() { return "Home"; } } |
Puedes ver que en el controlador LoginController tiene 2 métodos que manejan el mismo paros de URL /login, pero el primero usa el método GET y el segundo usa el método POST.
Puedes aprender más sobre el uso de la anotación @RequestMapping en el siguiente enlace.
Has una redirección en el método del controlador
Por si deseas redirigir a un usuario a otra URL si se cumple una determinada condición, sencillamente agrega redirect:/ antes de la URL, por ejemplo:
1 2 3 4 5 6 |
// verificamos el estado del inicio de sesión if (!isLogin) { return new ModelAndView("redirect:/login"); } |
En el código puedes ver que el usuario es redirigido a la URL /login si este no ha iniciado sesión.
Manejo de Carga de Archivos
Spring Framework también nos facilita el manejo de la carga de archivos en un método de controlador, al vincular automáticamente los datos de carga a un array de objetos CommonsMultipartFile. A continuación un ejemplo de lo sencillo que es cargar archivos con Spring Framework:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@RequestMapping(value = "/cargarArchivos", method = RequestMethod.POST) public String manejarCargaArchivos(@RequestParam CommonsMultipartFile[] fileUpload) throws Exception { for (CommonsMultipartFile aFile : fileUpload){ // almacenamos el archivo cargado aFile.transferTo(new File(aFile.getOriginalFilename())); } return "Realizado correctamente"; } |
Spring Framework utiliza Apache Commons FileUpload como sistema para cargar múltiples archivos.
Conclusión
Estos consejos te ayudarán a escribir clase de controlador en Spring Framework de manera adecuada y eficiente, pero hay otros consejos y técnicas que solo las puedes aprender conforme trabajes y agarres experiencia con Spring Framework.
Si tienes un consejo, puedes compartirlo en los comentarios.
Nota(s)
- Los consejos mostrados en este Post, pueden ser modificados, quedar obsoletos o continuar vigentes, esto no depende de mí, si no de los Desarrolladores que dan soporte a Spring Framework.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.