Spring MVC Desarrollo de Aplicaciones Empresariales 2014-1 Spring MVC • Spring MVC – Es una parte de Spring que nos facilita la implementación de la vista y el controlador de una aplicación, y la integración del controlador con el modelo – Implementaremos la vista con JSP, y el controlador con Servlets, pero de una forma muy simplificada • Otros frameworks – Spring MVC es solo una de las alternativas existentes – Otras muy utilizadas: Struts, Tapestry 2 MVC en una aplicación Web 3 Spring MVC 4 Spring MVC • Principales características de Spring MVC – DispatcherServlet: es el servlet central que recibe todas las peticiones HTTP y las redirige a los controladores que nosotros escribimos • Patrón Front Controller – Convenciones de nombrado: para facilitar el desarrollo y evitar archivos de configuración pesados, establece unas convenciones de nombrado para cada elemento de la “Vista+Controlador” • Podemos seguirlas o no, aunque es la opción más cómoda 5 Spring MVC • Ejemplos básicos de Spring MVC 1. Leer datos • Ver un listado con los datos de todos los empleados • Ver los datos de un empleado en particular 2. Actualizar datos • Insertar un nuevo empleado en la base de datos • Actualizar los datos de un empleado • Borrar los datos de un empleado 6 Ejemplo 1 • Ejemplo 1: ver los datos de todos los empleados 1. http://localhost:8080/mvc/main/emp/list DispatcherServlet 10. HTTP Response 2. Resolve request to controller 3. HTTP request 7. Resolve view name to view 9. Render page EmployeeController 6. Return Model and view name 8. Pass model data list.jsp +list(Model model): void 4. Query the model Employee +name +surname 5. Return data EmployeeService +getEmployees(): List<Employees> 7 Ejemplo 1 • Ejemplo 1: ver los datos de todos los empleados 1. http://localhost:8080/mvc/main/emp/list DispatcherServlet 10. HTTP Response 2. Resolve request to controller 3. HTTP request 7. Resolve view name to view 9. Render page EmployeeController 6. Return Model and view name 8. Pass model data list.jsp +list(Model model): void 4. Query the model Employee +name +surname 5. Return data EmployeeService +getEmployees(): List<Employees> 8 Ejemplo 1 • Ejemplo 1: ver los datos de todos los empleados – Aunque parezca complejo, todas las redirecciones y conexiones las hace Spring MVC – Lo que nosotros tenemos que hacer: • Implementar la clase “EmployeeController” • Implementar la vista “list.jsp” • Configurar la aplicación en los archivos – web.xml – main-servlet.xml 9 Ejemplo 1 - web.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>main</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>main</servlet-name> <url-pattern>/main/*</url-pattern> </servlet-mapping> </web-app> 10 Ejemplo 1 – main-servlet.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- Employee Service --> <bean id="employeeServiceBean" class="es.udc.fi.asi.mvc.model.employeeservice.EmployeeService"/> <!-- Employee Controller --> <bean name="/emp/*" class="es.udc.fi.asi.mvc.web.EmployeeController"> <property name="employeeService" ref="employeeServiceBean"/> </bean> <!-- View Resolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans> 11 Ejemplo 1 – main-servlet.xml • EmployeeController – Bean “employeeController” con nombre “/emp/*” • Procesará las peticiones “/main/emp/*” – Utiliza “EmployeeService” para acceder al modelo • Inyectamos esta dependencia en la configuración • ViewResolver – Lo usamos para simplificar el código de los controladores • Los nombres de las vistas (páginas *.jsp) van precedidos de “/WEB-INF/jsp”, y terminan en “.jsp”. 12 Ejemplo 1 – EmployeeController.java package es.udc.fi.asi.mvc.web; import … La anotación @Controller indica a Spring que esta clase es un controlador @Controller public class EmployeeController { private EmployeeService employeeService; Convención de nombrado: el método “list” procesa las peticiones a “/main/emp/list” @RequestMapping public void list(Model model) { List<Employee> list = employeeService.getEmployees(); model.addAttribute("employeeList", list); } … } El resultado lo muestra la vista “list”, a la que pasamos la lista de empleados con nombre “employeeList” 13 Ejemplo 1 – list.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>List of employees</title> </head> <body> <h3>List of employees</h3> <ul> <c:forEach var="employee" items="${employeeList}“ varStatus="status"> <p>${employee.name} ${employee.surname}</p> </c:forEach> </ul> </body> </html> 14 Convenciones de nombrado • Ver los datos de todos los empleados – Acción en la URL “/main/emp/list” • El controlador EmployeeController procesa todas las peticiones a partir de “/main/emp” • El método “list” de “EmployeeController” procesa la petición “/main/emp/list” • Colocamos la vista “list.jsp” en “WEB-INF/jsp/emp/list.jsp” 15 Ejemplo 1 – list.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> – “Importa” el core de JSTL <c:forEach var="employee" items="${employeeList}“ varStatus="status"> – El tag c:forEach nos permite iterar sobre una colección ${employee.name} ${employee.surname} – Accedemos a los atributos de los empleados 16 Ejemplo 2 – Insertar un nuevo empleado • Ejemplo 2 – Insertar los datos de un nuevo empleado – Formularios: permiten al usuario introducir datos que serán procesados por el servidor – Dos pasos • Crear el formulario y presentarlo al usuario – EmployeeController.java form() – WEB-INF/jsp/emp/form.jsp • Procesar los datos del formulario – EmployeeController.java addEmployee(Employe e) 17 Ejemplo 2 – Presentar el formulario public class EmployeeController { … @RequestMapping(method = RequestMethod.GET) public Employee form(Model model) { El formulario estará return new Employee(); inicialmente vacío } } 18 Forward vs. Redirect • Forward – Realizado por el Servlet de forma interna – El navegador no es consciente de que ha ocurrido, así que la URL no se modifica – Una recarga de la página en el navegador implica repetir la petición original, sin cambiar la URL • Redirect – La aplicación web ordena al navegador que solicite una URL diferente – Una recarga de la segunda URL no repite la operación de la primera – Los datos introducidos en la primera petición no están disponibles en la segunda – Más lento 19 Otros aspectos importantes • Aspectos importantes que no hemos tratado – Sesiones de usuario – Autenticación – Cookies – Internacionalización – Plantillas 20 Ejercicios 1. Ejecutar (mvn jetty:run) el código proporcionado en springmvc.zip 2. Probar la URL http://localhost:8080/mvc/emp/list 3. Modificar la configuración de la aplicación para que todas las URLs sean de la forma http://localhost:8080/mvc/main/... (al igual que lo son en este tutorial) 4. Usar la variable definida en varStatus para mostrar el número de fila (pista: status tiene un campo index) 5. Modificar la aplicación para que los empleados también tengan un email y se muestre en el listado 21 Ejercicios 6. Cambiar el nombre de la acción que se ejecuta al pulsar Add en /emp/form a addEmployeee 7. Utilizar varStatus para mostrar en diferente color las filas pares de las impares 8. Utilizar varStatus para resaltar la última fila – Ver documentación javadoc de LoopTagStatus 9. Cree la parte de la aplicación correspondiente a departamento (listar y añadir) 10. Utilice los tutoriales anteriores para completar la aplicación haciendo que haya manejo real de la BD 22