Spring MVC

Anuncio
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
Descargar