Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Introducción
En este tema veremos el acceso a datos mediante SPRING MVC y segurizarlo y testearlo así como
específicas de Spring.
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
1 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Objetivos
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca
campusvirtual.cualifica2.es
2 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Mapa Conceptual
[[[Elemento Multimedia]]]
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
3 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Introducción a Spring.
En el 2001 el API de Java Servlet y el modelo de Enterprise Java Beans eran las plataformas
imperantes para las aplicaciones web. Estos dos estándares fueron creados por la hoy extinta Sun
Microsystems colaborando con otras compañías y desarrolladores que contaban con bastante
soluciones web, como las aplicaciones cliente o las aplicaciones batch, que podían escribirse con la
base de utilidades y proyectos open source y comerciales que van a proveer las necesidades que
es
requerían aquellos proyectos.
2.
Se compuso un equipo pequeño de desarrolladores cuyo fin era ampliar el framework y crearon
ca
para ello un proyecto en Sourceforge en el año 2003. Tras más de un año de trabajo llegó la versión
lifi
1.0 en el 2004. Tras este lanzamiento, Spring se popularizó entre la comunidad, en parte gracias al
empleo de Javadoc y la disponibilidad de una documentación para los desarrolladores muy por
ua
encima del resto de proyectos open source.
l.c
arquitectónico de software cuyo fin es separar en una aplicación los datos y la lógica de negocio
Para lograrlo Modelo Vista Controlador propone una separación en tres capas diferenciadas que
i
sv
son el modelo, la vista y el controlador, de ahí su nombre. Esto es, primero define los elementos
destinados a representar la información y a interactuar con el usuario, por otra parte define los
pu
procedimientos para tratar tanto la información y transformas las peticiones y respuestas del
m
servidor y del cliente y por último se encarga de trabajar con la recuperación y almacenamiento
código y en la separación de los distintos conceptos que conforman una aplicación, persiguiendo
Aunque originalmente MVC se diseñó para programas de escritorio se ha ido adaptando a multitud
han desarrollado implementando este patrón. La diferencia entre estos últimos es cómo
campusvirtual.cualifica2.es
4 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
La finalidad de Spring es facilitar el desarrollo de aplicaciones web con Java. Sus características
son:
es un patrón software en el que un módulo suministra los objetos ya creados en lugar de que la
es
de vida de los objetos y como se relacionan entre ellos.
2.
Ligero: es muy rápido en tiempo de procesamiento y no es intrusivo a la hora de programar.
ca
Esta es uno de sus características más importantes.
lifi
una capa de servicios que son ideales para este tipo de programación como auditoría, o gestión
ua
de transacciones.
l.c
En Spring hay diversos módulos que se pueden se pueden utilizar en el desarrollo. Cada
ua
programador agrega los módulos que necesite. Spring Core es el núcleo de Spring, es el único
módulo que obligatoriamente debemos utilizar en Spring, ya que contiene entre otras cosas la DI
rt
Otros módulos conocidos son: AOP para trabajar con aspectos, DAO para trabajar con base de
pu
datos, MVC para la capa web, JMS para mensajería y Security para el control de seguridad.
m
En el 2003 el API de Java Servlet y el modelo de Enterprise Java Beans eran las
ca
Verdadero.
Falso.
campusvirtual.cualifica2.es
5 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Spring MVC.
por un Servlet, el DispatcherServlet, este delega las peticiones a controladores los cuales llevan a
cabo la lógica de negocio. Pero el DispatcherServlet necesita conocer a qué controlador corresponde
cada petición, de esto se ocupa el HandlerMapping, si no hemos configurado uno por defecto se
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
Como podemos ver el DispatcherServlet sirve de punto de entrada en las peticiones. Se la entrega a
ca
devuelve un modelo (datos) y una identificación de que vista usar. ViewResolver se ocupa de
Estructura de un controlador
campusvirtual.cualifica2.es
6 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
2.
ca
lifi
En Spring 2.5 se introdujo un modelo de programación basado en anotaciones para los
MVC. Los controladores que siguen este estilo no tienen que extender una clase especifica ni
l.c
implementar determinadas interfaces. Es más, normalmente no tienen que dependencia directa con
ua
Se define una URL cuyas peticiones serán tardadas por el controlador, en este caso peticiones GET
m
y POST que son las implementadas en el ejemplo. Una petición GET es resultado de por ejemplo un
ca
usuario que consulta la página con un explorador web y POST cuando se envíen datos a través de un
formulario. Hay otros tipos que se pueden emplear como PUT y DELETE pero lo más habitual es
Así mismo es posible ver cómo devuelve una secuencia de texto tanto el método GET como el
método POST:
campusvirtual.cualifica2.es
7 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Esta cadena indica la ubicación de la vista (sin la extensión .jsp), se traduciría a la ruta definida en
redireccionar al usuario a otra página o dirección externa, podemos hacerlo con la instrucción:
es
La nueva URL puede ser también la ubicación de una vista. Ahora en el caso del método post(), se
2.
observa entre los parámetros:
ca
lifi
ua
Significa que un formulario web envía la información usando dicha entidad, de la siguiente
manera:
l.c
ua
rt
Su función es realizar una validación de los parámetros que se han enviado por medio de la
m
entidad del formulario y guardar el resultado del procedimiento de en una variable result. Por
ca
ejemplo:
espacio en blanco, una letra acentuada, un subrayado u otro carácter inválido que no coincida con
la expresión regular, debe mostrarse el error previsto en la variable mensaje. Esto se haría tal que
así:
campusvirtual.cualifica2.es
8 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Viendo este ejemplo, si hay errores en el formulario, se devuelve a la vista empleando la variable
es
model. En el GET es posible ver como se ha cargado la página inicializando el formulario con la
instrucción siguiente:
2.
ca
Recordamos también que en la vista, para que el formulario muestre el mensaje de error debe de
lifi
tener la siguiente instrucción:
ua
l.c
ua
Manejo de sesiones
rt
Para utilizar una sesión con el mismo nombre, agregamos al inicio de la clase la anotación:
i
sv
pu
m
ca
Aquí se envía la variable sesión a la vista, esta contiene una entidad que se llama usuario la cual
contiene el nombre, apellido, teléfono y demás detalles que determinan al usuario de la sesión.
campusvirtual.cualifica2.es
9 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
En el paso que sigue nos ponemos en el supuesto de que el usuario va a otro módulo en la
página, existen dos maneras de obtener la variable de sesión y realizar la validación del usuario
En este caso se valida que el atributo guardado en la estructura de sesión no sea nulo y en caso
es
contrario se hace un casting del objeto a Usuario. Para finalizar, cerramos la sesión de esta manera:
2.
ca
Recibir
lifi
parámetros por la URL y nuevos campos en el formulario POST
ua
También podemos captar parámetros como parte de la URL. Por ejemplo podemos obtener la id del
l.c
Puede ser cualquier campo válido para un formulario HTML (select, text, textarea...), esto es, no
La
campusvirtual.cualifica2.es
10 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
instrucción anterior la agregamos a los parámetros que recibe el método POST. Esto puede ser
útil cuando por ejemplo en la base de datos guardamos la imagen como File y no como
MultipartFile, en ese caso tenemos que coger la imagen que se ha enviado por el form y
transformarla en File:
es
Si el cliente en el formulario web manda un espacio en blanco, una letra
acentuada, un subrayado u otro carácter inválido que no coincida con la
2.
expresión regular, debe mostrarse el error previsto en la variable mensaje
ca
Verdadero.
lifi
Falso. ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
11 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Acceso a Datos
Uno de los grandes problemas que tiene hoy en día el desarrollo de aplicaciones Web en Java es que
el ciclo de desarrollo es, en muchas ocasiones, demasiado largo (o por lo menos más largo de lo
Debido a este problema han surgido alternativas del estilo de Ruby on Rails
es
una alternativa que propone Google, basada en el lenguaje Python.
2.
Todas estas alternativas pueden resultar muy interesantes, pero suelen estar basadas en lenguajes
ca
con chequeo de tipos débil, o trasladando el chequeo de tipos a tiempo de ejecución (como Python),
lo que provoca que puedan ser muy útiles para hacer rápidamente pequeñas aplicaciones o
lifi
prototipos, pero que se pueden convertir en un gran problema cuando queremos construir
ua
aplicaciones medianas o grandes donde intervienen varias personas o incluso equipos en el proceso
colaborativos, se hace necesario un lenguaje fuertemente tipado, donde podamos definir jerarquías
ua
de tipos (clases o interfaces) en las que el resto del equipo se pueda apoyar para desarrollar sin
riesgos.
i rt
En este apartado veremos cómo gracias a Spring + Hibernate + Anotaciones podemos conseguir
sv
un desarrollo tan rápido como el que podemos conseguir con las alternativas antes mencionadas.
pu
Ya hemos visto en otros tutoriales el uso de Spring o Hibernate, pero en este tutorial vamos a
m
intentar sacar todo el partido a las Anotaciones de Java 5 para, basándonos en el concepto de
ca
Con esto no quiero decir que debamos olvidarnos por completo de esos ficheros XML, sino que
debemos centrarnos a resolver el problema que nos ocupa, de forma rápida y con un buen diseño,
virguerías, los XML siempre estarán esperándonos para poder sobreescribir el comportamiento
campusvirtual.cualifica2.es
12 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Vamos a hacer una pequeña aplicación donde se muestre un listado de productos. Podría quedar
algo como:
es
2.
ca
lifi
ua
l.c
ua
rt
campusvirtual.cualifica2.es
13 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
2.
ca
lifi
ua
l.c
ua
La capa de persistencia
Vamos a empezar “de abajo a arriba”, es decir, partiremos definiendo nuestras entidades
rt
persistentes con Hibernate, e iremos “subiendo” hasta la capa de presentación y control con JSF,
i
sv
Las entidades
m
En nuestro ejemplo solo tenemos la entidad producto, con los atributos nombre, descripción y
ca
precio.
campusvirtual.cualifica2.es
14 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
Podemos ver como se trata de una clase totalmente normal, donde en la línea 1 anotamos que se
trata de una entidad, y en las líneas 3 y 4 indicamos cual es el id de la entidad y que este id será
ca
Todas las notaciones usadas pertenecen al estándar de JPA por lo que son válidas tanto para
Hemos anotado un atributo privado que no se usa en ningún sitio, ni siquiera tenemos getter o
setter. Esto lo hacemos a posta ya que es algo que gestionará internamente Hibernate, y
campusvirtual.cualifica2.es
15 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
El DAO
El DAO es el Data Access Object, es decir, será la clase donde resida la lógica de manejo de
Hibernate (o JDO o JDB o JPA o …). De esta forma conseguimos que nuestra lógica de negocio no
sepa nada de Hibernate, y siempre que quiera acceder a los datos lo hará usando esta clase.
es
Veamos un ejemplo sencillo: Primero definimos una interfaz, así podemos intercambiar la
implementación fácilmente si algún día nos cansamos de Hibernate (no lo creo ;):
2.
ca
lifi
ua
l.c
ua
rt
Para el ejemplo solo hemos definido algunas operaciones simples. Ahora veamos una posible
i
sv
campusvirtual.cualifica2.es
16 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
No es el ámbito de este tutorial estudiar la implementación de los métodos, para más información
pu
Aunque el lector en un principio no entienda la implementación lo que creo que queda claro es que
es sencilla, puesto que se limita a unas pocas líneas (de nuevo sugiero repasar la documentación).
Donde si vamos a hacer especial hincapié es en las nuevas anotaciones que nos han aparecido:
En la línea 1 nos encontramos con @Repository. Esta es una anotación de Spring. Estamos
indicando que esta es una clase relacionada con la capa de persistencia, y que debe ser un
Singleton (solo habrá una instancia de la clase HibernateDaoSupport, y todos los Threads de la
aplicación la compartirán).
campusvirtual.cualifica2.es
17 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
En la línea 4 nos encontramos con @Autowired. Esta es una anotación de Spring. Sirve para
Por último, en la línea 9, 14, 20 … nos encontramos con la anotación @Transactional. Esta es
que hará Spring es comprobar si ya existe una transacción abierta, si existe se unirá a ella, y si
no existe, abrirá una nueva transacción (este comportamiento es configurable). De esta forma
es
nos aseguramos que toda operación de la base de datos se realiza dentro de una transacción.
2.
Además si durante la ejecución del método se produce alguna excepción de Runtime, se hará
ca
automáticamente rollback de la transacción (este comportamiento también es configurable).
lifi
Ya hemos terminado con la capa de persistencia. Rápido ¿verdad? En ningún momento hemos visto
ua
sentencias SQL, ni siquiera para crear las tablas de la base de datos. Más adelante veremos cómo
configuramos Hibernate para que se encargue de crearnos las tablas automáticamente (Los ficheros
l.c
de configuración los veremos todos al final, por ahora sigamos con el código Java).
ua
La capa de negocio
rt
En esta aplicación el negocio no es gran cosa, poco más que obtener los productos o guardarlos, así
i
sv
campusvirtual.cualifica2.es
18 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Haciendo una clase tan sencilla y que lo único que hace es delegar en el DAO, hay quien me podría
acusar de estar cayendo en el antipatrón “Poltergeist”, ya que desde control podríamos usar
directamente el DAO para recuperar o guardar los productos, y quitarnos esta clase de enmedio.
Pero no creo que este sea el caso ya que prima el MVC y el bajo acoplamiento.
Siempre debemos intentar que la capa de control y presentación sean lo más tontas posibles. Pensar
por un momento que no usamos esta clase “manager” y que usamos el DAO desde las clases de
control de JSF (los managed-beans), si ahora quisiéramos montar un web service para
es
aprovechar esta aplicación desde otras aplicaciones ¿cuánto código que ya habríamos escrito en el
2.
managed-bean tendríamos que repetir en el web service?
ca
Pero vamos al lío, que hemos venido a hablar de las anotaciones
lifi
En la línea 1 nos encontramos con @Service. Esta es una anotación de Spring, similar a
ua
@Repository que ya habíamos visto antes. Estamos indicando que esta es una clase relacionada
En la línea 4 nos encontramos con @Resoruce. Esta anotación es del estándar, por lo que es
ua
válida tanto con Spring como con EJB3.0. Está indicando que al crear la instancia de esta clase
se debe “inyectar” (inicializar) en este atributo una referencia a la instancia del Dao (es la
rt
Vamos a implementar el control con los managed-beans de JSF. Como tenemos dos pantallas
pu
campusvirtual.cualifica2.es
19 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
2.
ca
lifi
ua
l.c
ua
rt
campusvirtual.cualifica2.es
20 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
En la línea 1 nos encontramos con @Controller. Esta es una anotación de Spring, similar a
@Repository o @Service que ya habíamos visto antes. Estamos indicando que esta es una clase
En la línea 2 nos encontramos con @Scope("session"). Esta es una anotación de Spring. Con
Singletons, y le estamos diciendo que nos cree una instancia diferente de esta clase por cada
es
sesión Http. Es decir, cada usuario tendrá su propio managed-bean.
2.
También cabe destacar desde la línea 5 hasta la 9. La anotación @Resource ya la hemos
ca
comentado antes, pero quiero recalcar como se está “inyectando” la referencia al manager (la
lifi
Spring es capaz de gestionar las dependencias entre los diferentes managed-beans de JSF.
ua
La capa de presentación
l.c
Está implementada con JSF + Facelets + ICEfaces, pero no tiene nada de especial. Es decir la
campusvirtual.cualifica2.es
21 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
En la línea 9 es donde le estamos diciendo a Hibernate que queremos que nos cree las tablas al
arrancar la aplicación. Ojo porque si las tablas ya existen las borra primero, es decir, esto puede ser
muy conveniente para desarrollo o pruebas, pero no para producción ! Lo que podemos hacer es,
una vez están creadas, hacer un “export” de la base de datos para obtener los scripts de creación
que podemos retocar para dejarlos listos para producción (pero nos ahorramos lo gordo).
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca
Puede parecer que hay mucho pero en realidad solo hay 4 cosas: configuración de Spring para que
haga caso a las anotaciones, definir el datasource (de hibernate, del servidor por jndi, …), definir el
campusvirtual.cualifica2.es
22 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Si os fijáis no hay ni una sola definición de bean de clases que hayamos escrito nosotros, de forma
que este fichero se mantendrá constante con independencia de los beans que tenga nuestra
aplicación.
es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
Se puede apreciar como solo hay configuración general de JSF y reglas de navegación. Pero no
m
declaramos ningún managed-bean. Esto funciona gracias a la línea 13 donde se le indica a JSF que
ca
debe delegar en Spring para buscar los managed-beans. Es decir, JSF los buscará entre los que
declaremos en el fichero (si es que declaramos alguno, que no es nuestro caso), y si no lo encuentra,
lo buscará en Spring.
Como se puede comprobar, también nos ahorramos escribir cantidad de código en ese XML.
La diferencia es básicamente semántica, es decir, cada una denota perfectamente a que “capa”
corresponde la clase anotada. Pero todas se comportan de igual manera (por ejemplo en todas
campusvirtual.cualifica2.es
23 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
nuestras clases podríamos haber usado la anotación @Service y hubiera funcionado igual).
El hecho de usar anotaciones diferentes puede ser muy interesante si luego queremos aplicar
aspectos (AOP = Aspect Oriented Programming) a todas las clases de una misma capa. Es decir, por
ejemplo, puedo hacer una regla para aplicar cierto advice a todas las clases con la anotación
@Controller.
es
El DAO es el Data Access Object, es decir, será la clase donde resida la lógica de
2.
manejo de Hibernate (o JDO o JDB o JPA o …). De esta forma conseguimos que
ca
nuestra lógica de negocio no sepa nada de Hibernate, y siempre que quiera
acceder a los datos lo hará usando esta clase.
lifi
Verdadero.
ua
Falso.
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
24 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
características del sistema, con las dificultades asociadas al mantenimiento y al desarrollo. Este
problema es conocido como scattered code, que se puede traducir como código disperso. Otro
problema que puede surgir, es que en un módulo concreto tenga que implementar varios aspectos
de la aplicación a la vez. Este problema es conocido como tangle code, que se puede traducir como
es
código enmarañado. A día de hoy existen algunos rumbos de diseño complicados de capturar,
2.
porque algunos problemas no pueden encapsularse de manera clara de la misma manera con la que
ca
normalmente resolvemos la definición de otra funcionalidad u otros objetos.
lifi
La Programación Orientada a Aspectos o AOP (Aspect Oriented Programming) es un paradigma
de programación cuya intención es formalizar y representar de forma concisa los elementos que son
ua
transversales (comunes) a todo el sistema. De esta forma se pueden encapsular los diferentes
l.c
conceptos que componen una aplicación en entidades bien definidas, eliminando las dependencias
permite modularizar el sistema, evitando la duplicación de código. Sin embargo, hay aspectos que
i
sv
son comunes a todo el sistema, como por ejemplo un sistema en el que se debe verificar que el
}
public void metodoRestringido() throws NoPermitidoException {
compruebaPermisos();
//código
}
public void metodoRestringido() throws NoPermitidoException {
compruebaPermisos();
//código
}
}
Como se puede ver, se puede minimizar la repetición de código, tenemos una llamada en cada
método y una sentencia throws, pero es prácticamente imposible reducir aún más la repetición.
campusvirtual.cualifica2.es
25 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
funcionalidades en el sistema.
es
forma modular y separada del resto del sistema.
Punto de Cruce o de Unión (Join point): es un punto de ejecución dentro del sistema donde
2.
un aspecto puede ser conectado, como una llamada a un método, el lanzamiento de una
ca
excepción o la modificación de un campo. El aspecto será insertado en el flujo de ejecución de
lifi
la aplicación para ampliar su funcionalidad.
Consejo (Advice): es la implementación del aspecto, dicho de otra manera, un Aspecto puede
ua
alterar el comportamiento el código aplicando un Consejo (comportamiento adicional) en un
l.c
Punto de Unión.
Puntos de Corte (Pointcut): define los Consejos que se aplicarán a cada Punto de Cruce. Se
ua
parámetros.
sv
objeto, para ello crearíamos un Consejo de Auditoría que mantenga la dicha información,
m
mediante una variable y un método, que serían introducidos en todas las clases (o sólo en
ca
Tejido (Weaving): es el proceso de aplicar Aspectos a los Objetos Destinatarios para crear los
nuevos Objetos Resultantes en los especificados Puntos de Cruce. Este proceso puede ocurrir a
campusvirtual.cualifica2.es
26 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
implementación queda más comprensible, adaptable y reusable. Algunas tecnologías con
diferentes nombres se dirigen a la consecución de objetivos similares, el término Programación
2.
Orientada a Aspectos se emplea para hacer referencia a múltiples tecnologías que se relacionan
en como los métodos se adaptan, como los filtros de composición o la separación en varias
ca
dimensiones de competencias.
lifi
ua
l.c
ua
i rt
después o "alrededor" del cual queremos ejecutar algo (un advice). Un pointcut no puede ser
pu
cualquier línea arbitraria de código. La versión actual de Spring solo soporta puntos de corte en
acceso a campos, la llamada a un constructor, etc., aunque esto en AOP de Spring no es posible.
ca
Es importante destacar que al definir un pointcut realmente no estamos todavía diciendo que
pointcut + advice es la que realmente hace algo útil. Por ello, los ejemplos dados en este apartado
por sí solos no tienen demasiado sentido, no hay que intentar probarlos tal cual, aunque aquí los
explicaremos aislados para poder describir con cierto detalle su sintaxis antes de pasar a la de los
advices.
Lo que sigue es un conjunto de ejemplos que ilustran las opciones más comunes para pointcuts, no
campusvirtual.cualifica2.es
27 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
método que encaje con una determinada signatura. Se puede especificar la signatura completa del
método incluyendo tipo de acceso (public, protected,...), tipo de retorno, nombre de clase
es
2.
El tipo de acceso y el nombre de clase son opcionales, pero no así el resto de elementos
Podemos usar el comodín * para sustituir a cualquiera de ellos, y también el comodín .., que
ca
sustituye a varios tokens, por ejemplo varios argumentos de un método, o varios subpaquetes
lifi
con el mismo prefijo.
En los parámetros, () indica un método sin parámetros, (..) indica cualquier número de
ua
parámetros de cualquier tipo, y podemos también especificar los tipos, por ejemplo (String, *,
l.c
int) indicaría un método cuyo primer parámetro es String, el tercero int y el segundo puede ser
cualquiera.
ua
rt
Por ejemplo, para especificar todos los métodos con acceso "public" de cualquier clase dentro del
i
Donde el primer * representa cualquier tipo de retorno, el segundo * cualquier clase y el tercer *
ca
campusvirtual.cualifica2.es
28 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
within() permite especificar todos las llamadas a métodos dentro de un paquete o subpaquetes del
args() permite especificar el tipo deseado para los argumentos. No se suele usar tal cual, sino
combinado con execution como un "truco" para darle nombre a los argumentos (ver el apartado
es
siguiente).
2.
ca
lifi
ua
Combinar pointcuts
l.c
Se pueden combinar pointcuts usando los operadores lógicos &&, || y !, con el mismo significado que
El operador && se suele usar en conjunción con args como una forma de "dar nombre" a los
pu
Encajaría con un setter cualquiera, dándole el nombre nuevoValor al parámetro pasado al mismo.
Veremos la utilidad de esto, cuando definamos advices, como método para acceder al valor del
parámetro.
Se le puede asignar un nombre arbitrario a un pointcut (lo que se denomina una signatura). Esto
permite referenciarlo y reutilizarlo de manera más corta y sencilla que si tuviéramos que poner la
expresión completa que lo define. La definición completa consta de la anotación @Pointcut seguida
campusvirtual.cualifica2.es
29 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
de la expresión que lo define y la signatura. Para definir la signatura se usa la misma sintaxis que
para definir la de un método Java en un interfaz. Eso sí, el valor de retorno debe ser void. Por
ejemplo:
es
2.
ca
lifi
ua
Advices
l.c
Con los advices ya tenemos la pieza del puzzle que nos faltaba para que todo cobre sentido. Un
advice es algo que hay que hacer en un cierto punto de corte, ya sea antes, después, o "alrededor"
ua
Los advices se especifican con una anotación con el pointcut y la definición del método Java a
i
sv
ejecutar (signatura y código del mismo). Como en Spring los puntos de corte deben ser ejecuciones
@AfterReturning)
representan como clases Java, marcadas con la anotación @Aspect. En Spring, además, un aspecto
debe ser un bean, por lo que tendremos que anotarlo como tal.
campusvirtual.cualifica2.es
30 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
@Before
es
Esta anotación ejecuta un advice antes de la ejecución del punto de corte especificado. Por ejemplo:
2.
ca
lifi
ua
l.c
ua
@AfterReturning
i
sv
Esta anotación ejecuta un advice después de la ejecución del punto de corte especificado, siempre
que el método del punto de corte retorne de forma normal (sin generar excepciones). Por ejemplo:
pu
m
ca
Evidentemente para hacer log nos puede interesar saber el valor retornado por el método del punto
campusvirtual.cualifica2.es
31 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Al poner Object como tipo de la variable asociada al valor de retorno, estamos indicando que nos da
es
igual el tipo que sea (incluso si es primitivo). Especificando un tipo distinto, podemos reducir el
2.
ámbito del advice para que solo se aplique a los puntos de corte que devuelvan un valor del tipo
deseado.
ca
lifi
@AfterThrowing
ua
Esta anotación ejecuta un advice después de la ejecución del punto de corte especificado, si el
método del punto de corte genera una excepción. Podemos tanto acceder a la excepción generada
l.c
como restringir el tipo de las excepciones que nos interesan, usando una sintaxis como la siguiente:
ua
i rt
sv
pu
m
ca
El ejemplo anterior indicaría que no hay que ejecutar el advice a menos que la excepción generada
sea del tipo DAOException, y nos permite acceder a su valor a través del parámetro daoe.
@After
Esta anotación ejecuta un advice después de la ejecución del punto de corte especificado, genere o
no una excepción, es decir, al estilo del finally de Java. Se usa típicamente para liberar recursos y
campusvirtual.cualifica2.es
32 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
@Around
Esta anotación ejecuta parte del advice antes y parte después de la ejecución del punto de corte
especificado. La filosofía consiste en que el usuario es el que debe especificar en el código del advice
en qué momento se debe llamar al punto de corte. Por ello, el advice debe tener como mínimo un
es
2.
ca
lifi
ua
l.c
Hay que destacar varias cuestiones del código anterior. Como ya se ha dicho, cuando queremos
ua
llamar al punto de corte invocamos a proceed(). Además debemos devolver como valor de retorno
rt
del advice el devuelto por el punto de corte. Finalmente, si el método del punto de corte requiere
i
Spring ofrece al advice acceso tanto a los parámetros del método del punto de corte como a
m
información adicional sobre el mismo. Ya hemos visto cómo acceder al valor de retorno, en el
ca
Para hacer accesibles al advice los argumentos del punto de corte se puede usar args. Por ejemplo:
Con esto enlazamos el valor del argumento del punto de corte con la variable nuevoValor, y además
campusvirtual.cualifica2.es
33 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
al poner int como tipo de nuevoValor indicamos que solo queremos aplicar el advice si el argumento
Otra forma de hacer lo anterior sería usar un punto de corte "con nombre":
es
2.
ca
Podemos acceder a información sobre el punto de corte en el primer parámetro del advice si es de
tipo JoinPoint. Esta clase tiene métodos para obtener por ejemplo la signatura del método del punto
lifi
de corte, o sus argumentos, etc.
ua
l.c
ua
rt
Aunque no se ha dicho explícitamente hasta el momento, por supuesto se puede definir más de un
sv
advice que encaje con el mismo punto de corte. La pregunta surge entonces de forma natural: ¿cuál
pu
Para los advices especificados dentro del mismo aspecto, se puede tomar como una regla básica que
ca
el orden de ejecución es el mismo que el de declaración. Es decir, que si declaramos varios advices
de tipo before, se ejecutará primero el que primero aparezca declarado, y si declaramos varios de
tipo after ocurrirá lo mismo (en realidad en el caso after si se piensa un poco se verá que el de
El caso en que tenemos advices definidos en aspectos distintos es más complejo, ya que en principio
no está definida la precedencia por defecto y para especificarla hay que escribir algo de código Java.
campusvirtual.cualifica2.es
34 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
La AOP constituye uno de los pilares en que se fundamenta Spring, incluso aunque nunca la
usáramos en nuestros proyectos de modo explícito. A continuación resumimos alguno de los usos
es
que intercepta los métodos y se encarga de crear nuevas transacciones, hacer rollback
2.
Seguridad: Spring Security es un proyecto que intenta mejorar la seguridad declarativa
ca
estándar de JavaEE, haciéndola más potente sin aumentar la complejidad de uso. Mediante
este proyecto se puede por ejemplo controlar de manera declarativa el acceso a los métodos de
lifi
los beans, de manera similar a como se hace en Servlets 3.0:
ua
l.c
ua
rt
Pero va mucho más allá, permitiendo el uso de expresiones en el lenguaje EL de Spring para
i
evaluar los permisos de acceso. Por ejemplo, queremos que también el propio usuario pueda borrar
sv
comprobar si corresponde con el del usuario que queremos borrar (el # nos da acceso al parámetro).
aplicación usando Spring en todas las capas (presentación, negocio y datos). Todo el código
necesario se introduce de forma "no invasiva" usando AOP. Por ejemplo si decimos que queremos
usar JPA en la capa de persistencia, Roo se encarga de convertir nuestra clase de dominio en una
entidad JPA y de gestionar el Entity Manager y los métodos JPA básicos, pero todo este código no
campusvirtual.cualifica2.es
35 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
será visible directamente en nuestras clases y no nos "molestará". Todo esto se hace usando AspectJ,
aunque es un uso más avanzado que el que nosotros hemos visto aquí.
• Cache declarativa: es una de las nuevas características incorporadas en la versión 3.1. Nos
permite usar de manera transparente frameworks para gestión de cache ya conocidos y muy
probados como Ehcache. Por ejemplo, podemos hacer que un método de un DAO cachee
es
2.
ca
Si ya se ha llamado anteriormente al método con el mismo valor de "isbn", en lugar de ejecutar el
lifi
método, se sacará el LibroTO de la cache. Lo que está pasando es que con AOP se está
El operador && se suele usar en conjunción con args como una forma de "dar
nombre" a los parámetros.
ua
Verdadero.
irt
Falso.
sv
pu
m
ca
campusvirtual.cualifica2.es
36 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Gestión de Transacciones.
En una base de datos una transacción es una secuencia de acciones que se tratan como una sola
unidad de trabajo. Estas acciones se deben completar o no tener ningún efecto en absoluto, es decir
es
El concepto de transacciones se puede describir con las siguientes cuatro propiedades clave
2.
descritas como ACID:
ca
lifi
Atomicity (Atomicidad): una transacción debe ser tratada como una sola unidad de
como claves primarias que deben ser únicas y sus referencias desde otras tablas.
tiempo y con el mismo conjunto de datos. Cada transacción debe aislarse de otras para evitar la
corrupción de datos.
rt
Durability (Durabilidad): una vez que una transacción ha terminado, los resultados de esta
i
sv
transacción tienen que ser permanentes y no se pueden borrar de la base de datos debido al
pu
Spring proporciona una capa de abstracción sobre las diferentes APIs de gestión de transacciones
ca
subyacentes. El soporte de transacciones de Spring tiene como objetivo proporcionar una alternativa
a las transacciones de EJB agregando capacidades de transacción a POJOs. Spring soporta tanto la
Tradicionalmente, los desarrolladores de Java EE han tenido dos opciones para la gestión de
Transacciones globales
campusvirtual.cualifica2.es
37 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
todos los recursos se distribuyen a través de múltiples sistemas. En tal caso, la gestión de
transacciones debe realizarse tanto a nivel local como global. Una transacción distribuida o global se
gestión de transacciones y todos los gestores de datos locales de los sistemas implicados.
Transacciones locales
Las transacciones locales son específicas a recursos, como una transacción asociada a una
es
conexión JDBC. Mientras que las transacciones globales pueden abarcar múltiples recursos en un
sistema distribuido.
2.
La gestión de transacciones locales puede ser útil en un entorno informático centralizado en el que
ca
los componentes y recursos de las aplicaciones se ubiquen en un único sitio y la gestión de
lifi
transacciones solo implique un gestor de datos local ejecutándose una sola máquina. Las
transacciones locales pueden ser más fáciles de usar, pero tienen notables desventajas: no pueden
ua
funcionar a través de múltiples recursos transaccionales. Por ejemplo, el código que
l.c
administra las transacciones con una conexión JDBC no puede ejecutarse dentro de una transacción
no puede ayudar a garantizar la exactitud entre varios recursos. (Vale la pena señalar que la
rt
mayoría de las aplicaciones utilizan un único recurso de transacción.) Otro inconveniente es que las
i
lo declarativa es menos flexible que la programática la cual permite controlar las transacciones a
campusvirtual.cualifica2.es
38 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
través del código. Pero como una especie de característica transversal, la gestión declarativa de
transacciones puede modularizarse con el enfoque AOP. Spring soporta la gestión declarativa de
continuación:
es
2.
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
ca
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
lifi
Tengamos en cuenta que, de acuerdo con la filosofía de Spring, PlatformTransactionManager es
ua
una interfaz y, por lo tanto, puede ser fácilmente implementada cuando sea necesario.. Las
bean) en el contenedor de Spring. Incluso cuando se trabaja con JTA, los códigos que definen las
ua
transacciones pueden ser probados con mayor facilidad que si se utiliza directamente JTA.
rt
Metodo Descripción
Este método devuelve una transacción
i
sv
campusvirtual.cualifica2.es
39 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Metodo Descripción
Este método devuelve el comportamiento de propagación. Spring
int getPropagationBehavior() ofrece todas las opciones de propagación de transacciones
familiares de EJB CMT.
Este método el grado en el que la transacción está aislada del
int getIsolationLevel()
trabajo de otras
String getName() Nombre de la transacción
int getTimeout() El tiempo en segundos en el que la transacción debe finalizar
es
boolean isReadOnly() Si la transacción es de solo lectura
2.
ca
−Para la implementación de las transacciones se utiliza la anotación @Transactional, la cual se
lifi
Podemos preguntarnos por ejemplo cuánto durará la transacción, desde que comienza la ejecución
ua
hasta el commit final. Esta empieza con la primera línea del método que se ha marcado con
l.c
TransactionDefinition.PROPAGATION_NEVER
excepción si existe una transacción
actual.
No admite una transacción actual,
TransactionDefinition.PROPAGATION_NOT_SUPPORTED sino que siempre se ejecuta de
forma no transaccional.
Soporta la transacción actual, crea
TransactionDefinition.PROPAGATION_REQUIRED
una nueva si no existe.
Crea una nueva transacción,
TransactionDefinition.PROPAGATION_REQUIRES_NEW suspendiendo la transacción actual
si existe.
campusvirtual.cualifica2.es
40 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
2.
boolean hasSavepoint();
void setRollbackOnly();
ca
boolean isRollbackOnly();
boolean isCompleted();
}
lifi
Descripción:
ua
Método Descripción
l.c
boolean isRollbackOnly()
rollback.
void setRollbackOnly() Este método establece la transacción como solo rollback.
pu
m
ca
campusvirtual.cualifica2.es
41 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
centrado en la creación de servicios web basados en documentos. Spring Web Services tiene como
objetivo facilitar el desarrollo del servicio SOAP siguiendo el modelo de contract-first (contrato
primero), permitiendo la creación de servicios web flexibles. Spring-WS se basa en Spring, lo que
significa que puede utilizar sus componentes como como la inyección de dependencias.
es
Es un producto de la comunidad de Spring centrado en la creación de Web services o servicios web.
Facilita el primer contacto con el desarrollo de servicios SOAP, permitiendo la creación de servicios
2.
web flexibles utilizando varias formas de manipulación de ficheros XML.
ca
Para un servicio web SOAP empezaríamos describiendo como serian los mensajes, por ejemplo un
lifi
servicio de consulta de recetas de cocina:
ua
<?xml version="1.0" encoding="UTF-8"?>
l.c
<RecipeListRequest xmlns="http://www.ejemplococina.com/spring/ws/schemas">
<nacion_origen>India</nacion_origen>
<dificultad>baja</dificultad>
ua
</RecipeListRequest>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.ejemplococina.com/spring/ws/schemas"
pu
xmlns:schemas="http://www.ejemplococina.com/spring/ws/schemas">
<xsd:element name="RecipeListRequest">
m
<xsd:complexType>
<xsd:sequence>
ca
<xsd:simpleType name="dificultadType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="baja" />
<xsd:enumeration value="media" />
<xsd:enumeration value="alta" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
campusvirtual.cualifica2.es
42 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
package com.test.example;
//Otro fichero
package com.test.example;
import org.springframework.stereotype.Service;
es
@Service
public class RecipesImpl implements RecipesService {
2.
void Recipe[] listRecipes(String nacion, string dificultad) {
//Realizamos la consulta
ca
}
}
lifi
Una clase Endpoint es la encargada de recibir tratar la petición
ua
package com.test.example;
import org.springframework.beans.factory.annotation.Autowired;
l.c
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
ua
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
rt
@Endpoint
public class RecipesListEndpoint {
i
@Autowired
private RecipesService recipesService;
pu
{
ListRecipeResponse response = new AccountDetailsResponse();
ca
//Servicio inyectado
Recipe[] resp = recipesService.getListRecipes(request.getParams());
response.setListRecipes(account);
return response;
}
public void setRecipesService(RecipesService serv)
{
this.recipesService = serv;
}
}
campusvirtual.cualifica2.es
43 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Spring Security.
personalizable. Permite gestionar todo lo relacionado a la seguridad de una aplicación web, desde el
es
Al igual que en el anterior apartado, la principal característica de este framework de Spring es la
2.
facilidad tanto de implementación como de uso que presenta. También podemos destacar el gran
ca
soporte que presenta en su comunidad, además de tener un Servlet API integrado y la posibilidad de
implementarse con Spring Web MVC. Prácticamente Spring Security es declarativo y apenas es
lifi
necesario escribir código, incluso no es necesario escribir una página de login, ya que Spring
ua
Security lo puede hacer por ti.
l.c
Autenticación
Una vez añadida su dependencia en el proyecto bastaría con ir creando filtros en el web.xml, sin
ua
embargo se puede hacer ilegible y díficil de mantener. Por ello lo normal es definir un único filtro
rt
<filter>
<filter-name>springSecurityFilterChain</filter-name>
pu
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
m
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
ca
<url-pattern>/*</url-pattern>
</filter-mapping>
Como alternativa a definir múltiples filtros podemos utilizar el elemento <http>, dicho elemento
junto al atributo auto-config a true, configurará los filtros obligatorios, beans y la cadena de
seguridad.
campusvirtual.cualifica2.es
44 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
es
<bean id="authenticationProcessingFilter"
class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
2.
<property name="filterProcessesUrl" value="/j_spring_security_check" />
<property name="authenticationSuccessHandler">
ca
<bean
class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandl
er">
lifi
<property name="defaultTargetUrl" value="/pages/home" />
</bean>
</property>
ua
<property name="authenticationFailureHandler">
<bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
l.c
</bean>
<bean id="authenticationManager"
rt
class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
i
<list>
sv
</property>
</bean>
m
</beans>
campusvirtual.cualifica2.es
45 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
En el ejemplo podemos ver que hemos definido el bean AuthenticationManager. Este bean, entre
otras cosas, es responsable de recuperar la información de usuario que se está intentando loguear
en el sistema. Esto lo consigue mediante un provider que es necesario definir. Este provider es el
pueden definir varios providers según sea necesario, además de definir uno propio.
es
Entre otras el AuthenticationManager tiene la propiedad authenticationSuccessHandler que
2.
redirigiría a la página solicita antes de del logeo, en caso de que haya entrado por sí mismo en dicha
ca
También se puede observar como requerimos un rol de usuario en una de las rutas de <sec:http>
lifi
(sec es el prefijo que definimos para los elementos del schema de security). Los roles se
ua
configurarán declarativamente en el spring-security.xml. También hemos definido un
UserDetailsService, este es el que provee los datos de los usuarios al AuthenticationProvider, por
l.c
Debemos tener en cuenta que otros ficheros de configuración se deben definir con el elemento
rt
<context-param>:
i
sv
<context-param>
<param-name>contextConfigLocation</param-name>
pu
<param-value>
classpath:applicationContext.xml
classpath:spring-security.xml
m
</param-value>
</context-param>
ca
this.userDetailsService = userDetailsService;
}
campusvirtual.cualifica2.es
46 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
es
Como podemos ver recibe un objeto Authentication del que obtiene el nombre que usará con el
2.
userDetailsService para obtener los detalles del usuario, compara la clave recibida con la clave
ca
userDetails y sus roles.
lifi
ua
El AuthenticationManager tiene la propiedad authenticationSuccessHandler que
redirigiría a la página solicita antes de del logeo, en caso de que haya entrado por
l.c
Verdadero.
ua
rt
Falso.
i
sv
pu
m
ca
campusvirtual.cualifica2.es
47 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Spring Test.
Test podemos traducirlo en este caso como la prueba o el análisis de rendimiento de nuestra
aplicación. En eso se basa Spring Test, en analizar las ventajas que aporta Spring al ámbito de la
es
En el ámbito del contexto. Es decir cuando necesitamos de algún contexto de la aplicación nos
ayuda a analizarlo y ver cómo estamos trabajando con él. Todo de forma simple y reduciendo la
2.
cantidad de código que necesitamos para realizar muchas de las comprobaciones. Esto es
ca
debido a que nos facilita la localización de recursos como los metadata de la configuración de
lifi
XML.
Permite analizar las transacciones realizadas. La integración con estas se traduce como algo
ua
simple y de gran efectividad.
l.c
Es útil a la hora de escribir los tests de integración con clases específicas de Spring.
ua
i rt
sv
pu
m
ca
campusvirtual.cualifica2.es
48 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Capacidades especificas.
Una de las capacidades más valoradas en Spring son los módulos. Todos ellos están contenidos en el
es
Spring-context. Se puede decir que es el contexto del framework y el encargado de administrar
2.
los recursos del proyecto.
ca
Existen más pero con estas 3 definiciones podemos ver la potencia de los módulos en Spring.
lifi
ua
l.c
ua
i rt
sv
pu
m
ca
campusvirtual.cualifica2.es
49 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Recuerda
[[[Elemento Multimedia]]]
es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
50 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Autoevaluación
Variables.
es
Controladores.
2.
ca
Clases.
lifi
Indica si el siguiente enunciado es verdadero o falso: Spring requiere un
ua
contenedor de Servlets para funcionar.
l.c
Falso.
ua
rt
Verdadero.
i
sv
Una característica única de Spring que nos permite que un objeto sea "inyectado" en
tiempo de compilación.
ca
Un patrón de diseño donde los objetos de los cuales dependen otros son pasados a
estos últimos en tiempo de ejecución.
campusvirtual.cualifica2.es
51 / 52
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096117] SPRING MVC.
Falso.
Verdadero.
es
para crear aplicaciones web.
2.
ca
Java.
lifi
XML.
ua
J2EE.
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
52 / 52