Como funciona Spring MVC IO – Parte 2 – Controlador
Tiempo total: 1 días con 13:35:41 hrs
El controlador es el que se encarga de darle vida a cada vista enviándole la información que necesita, otra de sus funcionalidades es la de solicitar la información a la base de datos.
Cuando se instalan los complementos de Spring MVC muestra un proyecto ejemplo, lo correcto es seguir la plantilla que proveen para que la utilización de las vistas y controladores sea bastante intuitiva, es decir que por ejemplo en un sistema de login de usuarios, con bastantes formularios y demás funcionalidades propias del sistema, la página de inicio se llamara home.jsp, entonces el controlador debe de llamarse HomeController.java. Si la página de bienvenida se llama escritorio.jsp, entonces el controlador debe de llamarse EscritorioController.java. Si, una funcionalidad de un modulo, supongamos el modulo Ventas se llama detalle.jsp, en el área de vistas debería de estar en una carpeta llamada /ventas/detalle.jsp, entonces el controlador debería de llamarse Ventas_detalleController.java. Con esto se logra, tener un orden especifico para tener un controlador para cada vista.
Estructura del controlador
@Controller @RequestMapping(value="/ventas/detalle") public class Ventas_detalleController { @Autowired private Nombre_de_tablaDao Nombre_de_tablaDao; @RequestMapping(method=RequestMethod.GET) public String get(Model model){ model.addAttribute("forma", new Entidad()); return "/ventas/detalle"; } @RequestMapping(method=RequestMethod.POST) public String post(Model model, BindingResult result, @Valid @ModelAttribute("forma") Entidad forma) { return "/ventas/detalle"; } }
Con la línea:
@RequestMapping(value="/ventas/detalle")
Definimos la URL en el navegador a la cual el controlador responderá únicamente con las funciones GET y POST, el primero en el caso que el usuario consulta la pagina con un navegador web, el segundo cuando se envía información usando un formulario. Existen otros métodos como DELETE y PUT, pero comúnmente para un sitio web GET y POST son los únicos que se utilizan.
También podemos observar como cada uno de los métodos GET y POST regresa una cadena de texto:
return "/ventas/detalle";
Esta cadena significa la ubicación de la vista en el área de vistas (sin la extensión .jsp). Si por ejemplo se necesita redireccionar al usuario a otra página o dirección externa, con la instrucción:
return "redirect:/NUEVA_URL";
La nueva URL puede ser también la ubicación de una vista. Ahora en el caso del método POST, se observa que recibe la variable:
@Valid @ModelAttribute("forma") Entidad forma
Significa que un formulario web envía la información usando dicha entidad, de la siguiente manera:
<form:form method="post" commandName="forma">
Observamos también la instrucción @Valid junto a la variable:
BindingResult result
Que lo que hace es revisar los parámetros enviados de la entidad utilizada por el formulario y almacenar el resultado de la validación en la variable result. Por ejemplo el atributo de la entidad forma:
@NotNull @Size(min = 1, max = 15) @Pattern(regexp = "[A-Za-z0-9]*", message = "Debe contener números y letras") private String usuario;
Si el cliente en el formulario web envía un espacio en blanco, una letra con tilde, guion bajo o cualquier carácter que no sea válido por la expresión regular, se deberá de mostrar el error indicado por la variable mensaje, esto de la siguiente manera:
if (result.hasErrors()) { model.addAttribute("forma", forma); return "/ventas/detalle"; } else { Implementación para el formulario return "/ventas/detalle"; }
En este ejemplo, si el formulario tiene errores se envía de vuelta la entidad forma a la vista usando la variable model. En el método GET tambien podemos observar como al cargar la página se inicializa el formulario con la siguiente instrucción:
model.addAttribute("forma", new Entidad());
Recordamos también que en la vista, para que el formulario muestre el mensaje de error debe de tener la siguiente instrucción:
<form:errors class="invalid" path="usuario"/>
Manejo de sesiones
Para utilizar una sesión con el mismo nombre, agregamos al inicio de la clase la instrucción:
@Controller @RequestMapping(value="/ventas/detalle") @SessionAttributes( { "sesion" }) public class Ventas_detalleController {
Ahora que definimos esto hay varias formas de implementar dicha sesión, iniciando con el ejemplo que el usuario ha iniciado sesión, es decir que se consulto la base de datos y el nombre de usuario y contraseña son los correctos:
model.addAttribute("sesion", usuario);
Aquí enviamos la variable sesión a la vista, esta contiene una entidad llamada usuario que contiene el nombre, apellido, teléfono y demás detalles que identifican al usuario de la sesion. En el siguiente paso supongamos que el usuario fue a otro modulo en otra página, hay dos formas únicas de recibir dicha variable sesión y validar si el usuario que consulta la pagina es válido o no, estos métodos son POST y GET:
@RequestMapping(method=RequestMethod.GET) public String get(HttpSession sesion, Model model){ Usuario sesion_usuario = sesion.getAttribute("sesion")!=null ? (Usuario) sesion.getAttribute("sesion"):null;
En este caso valido que el atributo almacenado en la estructura de sesión llamado sesión no sea null, si no es así castea el objeto como una entidad Usuario. Finalmente, para cerrar sesión es de la siguiente manera:
if(model.containsAttribute("sesion")) model.asMap().remove("sesion");
Recibir parámetros por la URL y nuevos campos en el formulario POST
Para recibir el identificador de un usuario a editar a través de la URL (Por ejemplo), se edita al inicio de la clase del controlador lo siguiente:
@RequestMapping(value="/ventas/editar/{id}
Ahora en los métodos GETy POST agregamos la siguiente variable:
@RequestMapping(method=RequestMethod.GET)
public String get(@PathVariable(value="id") int id, Model model, HttpSession sesion_usuario){
Ahora si queremos enviar una variable a través de un formulario que no está en la entidad del formulario, esto lo hacemos agregando:
<input type=”hidden” name=”mi_variable” valor=”1” />
Puede ser un select, text, textarea o cualquier otro tipo de campo de un formulario HTML, es decir que no utilizamos la libreria propia de Spring MVC y con esto mandamos nuestra variable por aparte:
@RequestParam(value = "mi_variable", required = true) int mi_variable
La instrucción anterior la agregamos a los parámetros que recibe el método POST. Esto puede servir por ejemplo cuando en la base de datos almacenamos la imagen como una variable File y no MultipartFile, entonces debemos de capturar la imagen enviada por el formulario y convertirla a tipo File:
@RequestParam(value = "im", required = false) MultipartFile im
En la instrucción anterior, la imagen enviada por el formulario es opcional.
Consulta a la base de datos
Las consultas son bastante fáciles:
@Controller @RequestMapping(value="/ventas/detalle") public class Ventas_detalleController { @Autowired private Nombre_de_tablaDao Nombre_de_tablaDao;
Observamos en la estructura inicial de la clase la variable Nombre_de_tablaDao, lo único que hacemos es acceder a sus métodos y funciones, enviamos los parámetros y obtenemos los resultados de acuerdo a nuestra implementación:
model.addAttribute("paises", Nombre_de_tablaDao.getPaises());
Como se puede observar, la utilización del controlador de Spring MVC es bastante fácil y simple de utilizar, espero sea de ayuda esta explicación mostrando en un futuro la implementación del modelo, gestionando la base de datos de distintas maneras a través de sentencias SQL.
Parte 3
Sigue este enlace para ver la tercera parte – Modelo.