UNIDAD 6: Spring MVC
eugeniaperez.es
eugeniaperez.es
6.1 Arquitectura de la aplicación web
eugeniaperez.es
6.1 Arquitectura de la aplicación web
eugeniaperez.es
6.1 Arquitectura de la aplicación web
Para crear un proyecto web Spring (Hello Spring project):
New > Other > Spring > Spring project > Simple Spring Web Maven
Archivos clave:
eugeniaperez.es
6.1 Arquitectura de la aplicación web
Existe otra alternativa para crear un proyecto web:
New > Spring > Spring MVC Project
Archivos equivalentes:
eugeniaperez.es
6.1 Arquitectura de la aplicación web
WEB-INF/mvc-config.xml:
<context:component-scan base-package="org.sistema.springmvc.forms.controllers" />
<!-- With this all the content from resources dir will be treated as static
content: js, css, images, -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- Example: '/WEB-INF/jsp/showMessage.jsp' -->
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
Controladores
Vistas
o bien paquete con objetos anotados
Dentro de webapp
eugeniaperez.es
6.1 Arquitectura de la aplicación web
El pom.xml contiene las mismas dependencias necesarias para desarrollar mediante Spring:
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples.service.service</groupId>
<artifactId>prueba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
Todo el código necesario para la ejecución del sitio se almacenará en formato comprido en un WAR, que será desplegado en nuestro servidor.
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto hellospring del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/hellospring.git
eugeniaperez.es
6.1 Arquitectura de la aplicación web
Crear un Hello Spring project:
Creando un controlador:
@Controller
NombreController
@RequestMapping("/path")
Método con la acción que retornará la vista
http://localhost:8080/helloSpring/hello
eugeniaperez.es
6.1 Arquitectura de la aplicación web
Crear un Hello Spring project:
Creando una vista:
Se crea una vista con extensión JSP que sea HTML plano y que imprima el mensaje retornado en la acción
Se configura el servidor (WildFly basado en JBoss) y se despliega el WAR con Run As > Run on Server
Si el servidor ya está corriendo -> Full Publish
eugeniaperez.es
6.1 Arquitectura de la aplicación web
WildFly despliega el WAR tomando el nombre del artefactId + la versión, para luego alojarlo en su propia carpeta:
Para evitarlo, añadiremos en el pom.xml lo siguiente:
</dependencies>
<build>
<finalName>${artifactId}</finalName>
</build>
http://localhost:8080/helloSpring-0.0.1-SNAPSHOT/hello
http://localhost:8080/helloSpring/hello
eugeniaperez.es
6.1 Arquitectura de la aplicación web
El flujo es el siguiente:
eugeniaperez.es
6.1 Arquitectura de la aplicación web
eugeniaperez.es
6.1 Arquitectura de la aplicación web
TAGLIB: SPRING PARA VISTAS
La biblioteca core permite iteraciones, condicionales, manipulación de URL y otras funciones generales.
Con esto estamos haciendo un import de core de jstl.
Se utiliza con el prefijo c (podría ser otro) en etiquetas como <c:forEach>,<c:when>, <c:url>, etc... en la vista.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
eugeniaperez.es
6.1 Arquitectura de la aplicación web
TAGLIB: SPRING PARA VISTAS
Spring tiene también una librería de tags para suplantar a las etiquetas HTML utilizadas para formularios:
Todas etiquetas procedentes de esta librería (<sf:form>, <sf:input>, etc) serán traducidas a sus equivalentes en HTML.
Puedes ver mas en:
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
eugeniaperez.es
6.1 Arquitectura de la aplicación web
TAGLIB: SPRING PARA VISTAS
Existen además otro tipo de etiquetas denominadas spring.tld destinadas a la evaluación de errores, establecer temas, formateo y escape de mensajes, internacionalización, etc.
Puedes ver más información al respecto en:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/spring.tld.html
<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.forms del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.forms.git
eugeniaperez.es
6.5 Formularios
Realizaremos las operaciones CRUD web sobre un usuario:
eugeniaperez.es
6.5 Formularios
Localización de elementos:
eugeniaperez.es
6.5 Formularios
Explicación del proyecto...
eugeniaperez.es
6.5 Formularios
El flujo es el siguiente:
eugeniaperez.es
6.5 Formularios
Probando el funcionamiento...
eugeniaperez.es
6.5 Formularios
eugeniaperez.es
Descarga el código en Bitbucket
LISTADO DE USUARIOS
Descarga el proyecto Spring.formsv1 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv1.git
eugeniaperez.es
6.5 Formularios
eugeniaperez.es
Descarga el código en Bitbucket
DETALLE DE USUARIOS
Descarga el proyecto Spring.formsv2 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv2.git
eugeniaperez.es
6.5 Formularios
http://localhost:8080/springFormsv1/users/1
eugeniaperez.es
Descarga el código en Bitbucket
INSERCIÓN DE USUARIOS
Descarga el proyecto Spring.formsv3 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv3.git
eugeniaperez.es
Descarga el código en Bitbucket
Para que los caracteres introducidos se interpreten como UTF-8, se debe incluir en el web.xml:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
eugeniaperez.es
6.5 Formularios
http://localhost:8080/springFormsv1/users/new
Se crea un objeto User que se asociará al formulario en la vista mediante el modelAttribute="user", que asignará los valores de los input a sus variables (debe coincidir el nombre del Path).
eugeniaperez.es
6.5 Formularios
http://localhost:8080/springFormsv1/users/new
eugeniaperez.es
Descarga el código en Bitbucket
EDICIÓN DE USUARIOS
Descarga el proyecto Spring.formsv4 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv4.git
eugeniaperez.es
6.5 Formularios
http://localhost:8080/springFormsv1/users/update/2
En la vista se cargan los valores automáticamente
gracias al modelAttribute
eugeniaperez.es
Descarga el código en Bitbucket
BORRADO DE USUARIOS
Descarga el proyecto Spring.formsv5 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv5.git
eugeniaperez.es
6.5 Formularios
http://localhost:8080/springFormsv5/users/delete/4
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto Spring.formsv6 del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv6.git
eugeniaperez.es
6.5 Formularios
Finalmente representaremos las operaciones necesarias para permitir la relación de dos entidades (1-N) entre User y Task -> Los usuarios tendrán un listado de tareas.
Sobre cada tarea se podrán realizar las mismas operaciones que sobre usuarios.
Por lo tanto, deberán existir dos controladores, dos objetos del dominio y dos DAOs.
eugeniaperez.es
6.5 Formularios
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.formsv6B del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.formsv6b.git
eugeniaperez.es
6.5 Formularios
Permite trabajar con modelos de vistas adaptados en función de las necesidades del formulario -> DTO.
Se necesitará realizar un mapeo entre los objetos del modelo de dominio y los DTOs, a través de los Mapper.