Spring Framework
Spring Framework
12 de Julio de 2012
ndice
1. Introduccin.13
1.1 Contexto.13
1.2 Motivacin del proyecto.....13
1.3 Metodologa de trabajo.13
2. Objetivo..13
2.1 Definiciones bsicas14
2.2 Seleccin del entorno de desarrollo.14
2.3 Entornos de desarrollo14
2.4 Servidores.14
Capitulo 117
1. Introduccin..17
2. Qu es J2EE?...............................................................................17
3. Contenedores web18
4. Contenedores EJB..19
Capitulo 2.21
1
Introduccin21
GlassFish21
Capitulo 3..27
1
Introduccin.27
Qu es Spring?..............................................................................27
3.4 AOP..30
3.5 Web....31
4
Capitulo 4 Autenticacin.45
1. Introduccin...45
2. Autenticacin.45
3. La cadena de filtros46
Capitulo 5 Modelo de capas.57
1. Introduccin57
2. Modelo de capas.57
2.1 N-capas.57
2.2 capas.58
Capitulo 6 MVC en Spring.59
1. Introduccin..59
2. MVC en Spring.59
2.1 Distribuidor de servlets..60
2.2 Controlador de mapeo 61
2.3 Resolvedor de vistas..62
2.4 Controlador..63
Capitulo 7 JPA y ORM...65
1. Introduccin..65
2. JPA65
3. ORM65
4. Hibernate...66
Capitulo 8 Conclusiones y trabajo futuro..69
1. Introduccin69
2. Conclusiones.69
3. Trabajo futuro.69
Anexos: Tutoriales71
1. Introduccin71
2. Proyecto MVC en Spring71
3. Aadir autentificacin en memoria en MVC.81
4. Aadir autentificacin con base de datos90
5. Aadir autentificacin con hibernate94
6. Relaciones 1:1 con Spring MVC-hibernate-JPA..106
7. Relaciones de 1:N con Spring MVC-hibernate-JPA.121
8. Relaciones de N:N con Spring MVC-hibernate-JPA.123
Bibliografa..129
ndice de figuras
Figura 1. Transformacin cdigo fuente ..................................................................................... 17
Figura 2. Estructura Java2EE ....................................................................................................... 18
Figura 3. Contenedor Web. ......................................................................................................... 18
Figura 4. Pgina de descarga de Java EE. .................................................................................... 22
Figura 5. Seleccin del paquete a descargar. .............................................................................. 23
Figura 6. Pgina de bienvenida. .................................................................................................. 23
Figura 7. Seleccin del tipo de instalacin .................................................................................. 24
Figura 8. Seleccin del directorio para la instalacin. ................................................................. 24
Figura 9. Parmetros de la instalacin. ....................................................................................... 25
Figura 10. Lista de productos a instalar. ..................................................................................... 25
ndice de Listados
Listado 1. Declaracin del vean que gestiona el manejador de BBDD de MySQL ...................... 29
Listado 2. Configuracin de la cadena de filtros del proxy. ........................................................ 47
Listado 3. Configuracin del filtro del proceso de autentificacin. ............................................ 48
Listado 4. Configuracin del filtro HttpSessionContextIntegrationFilter. ................................... 48
Listado 5. Configuracin del filtro traductor de excepciones. .................................................... 48
Listado 6. Configuracin del filtro interceptor de seguridad. ..................................................... 49
Listado 7. Configuracin del gestor de autentificacin. .............................................................. 50
Listado 8. Configuracin del gestor de decisin de acceso. ........................................................ 51
Listado 9. Configuracin del filtro del punto de entrada de la autentificacin. ......................... 51
Listado 10. Configuracin del dataSource. .................................................................................. 51
Listado 11. Configuracin completa del dataSource. ................................................................. 52
Listado 12. Declaracin del CustomAuthenticationDAO. ........................................................... 52
Listado 13. Declaracin del gestor de autentificacin y sus dependencias. ............................... 52
Listado 14. Clase Java para la autenticacin. .............................................................................. 53
Listado 15. Configuracin del logout........................................................................................... 54
Listado 16. Agregar el filtro logout a la cadena de filtros. .......................................................... 54
Listado 17. Filtro recurdame. .................................................................................................... 55
Listado 18. Agregar referencia al punto de acceso. .................................................................... 55
Listado 19. Agregar referencia del filtro recurdame. ................................................................ 55
Listado 20. Configuracin del filtro SSL. ...................................................................................... 56
Listado 21. Agregar referencia del filtro SSL. .............................................................................. 56
Listado 22. Configuracin de la propiedad forceHttps. .............................................................. 56
Listado 23. Configuracin del distribuidor de servlets. ............................................................... 61
Listado 24. Configuracin del BeanNameUrlHandlerMapping. .................................................. 61
Listado 25. Configuracin de las URL del BeanNameUrlHandlerMapping. ................................ 61
Listado 26. Configuracin del SimpleUrlHandlerMapping. ......................................................... 62
10
11
12
1 Introduccin
En la actualidad el lenguaje Java est de moda, cualquier empresa de software requiere un programador conocedor
de este lenguaje. Adems el desarrollo de Java se realiza mediante entornos integrados de desarrollo como Eclipse y
con la utilizacin de un framework especializado y no intrusivo para un desarrollo ms claro y rpido del codigo.
Este proyecto proporciona los conocimientos y ejemplos necesarios para empezar a manejar el framework Spring
con el lenguaje Java.
1.1 Contexto
Actualmente las aplicaciones web, y ms concretamente las aplicaciones web con el lenguaje Java estn
experimentando un gran auge. Para desarrollar este tipo de aplicaciones existen numerosos framework y
aplicaciones para facilitar la creacin de estas, ahorrando a los programadores muchas lneas de cdigo y ayudando
en la configuracin de la aplicacin en tareas tales como: dependencias, seguridad, tratamiento de errores, etc.
Dentro de todos los framework disponibles hemos elegido Spring por ser un framework liviano y no intrusivo; ya
que los objetos que programamos no tienen dependencias en clases especficas de Spring. Sus caractersticas
principales son la inyeccin de dependencias y la programacin orientada a aspectos. Spring est estructurado en
mdulos lo que hace mucho ms flexible su configuracin.
13
1.
2.
3.
4.
Configuracin del entorno de desarrollo y del servidor para su funcionamiento con el framework
Spring.
5.
Creacin de una estructura para el portal web, roles, aspecto, mens de los distintos usuarios,
seguridad, etc.
6.
7.
2 Objetivo
El objetivo de este proyecto es proporcionar los conocimientos y ejemplos necesarios para que cualquier persona
con conocimientos de programacin y del lenguaje Java pueda iniciarse y entender cmo utilizar el framework
Spring y acceder a las bases de datos con este. Adems entender la estructura del framework y los diferentes
mdulos que lo integran.
BlueJ: BlueJ es un entorno integrado de desarrollo para el lenguaje de programacin Java, desarrollado
principalmente con propsitos educacionales, pero tambin es adecuado para el desarrollo de software a
pequea escala.
DrJava: es un entorno integrado de desarrollo para Java que est pensado para poder aprender este
lenguaje, es ligero, de interfaz intuitiva, gratuito y tiene la capacidad de evaluar cdigo de manera
interactiva. Est programado en java, de esa manera tambin logra ser multiplataforma.
JCreator: entorno de desarrollo integrado de java para la plataforma Windows. Existen 2 versiones una
gratuita y otra de pago.
JEdit: editor de texto libre escrito en lenguaje java, dispone de mltiples plugins para diferentes
aplicaciones.
14
JDeveloper: es un software de desarrollo integrado de Oracle para lenguajes de programacin entre ellos
Java, es libre y desde el 2001 est basado en java por lo que funciona en todas las plataformas, siempre
que tengan instalada la maquina virtual de Java.
2.4 Servidores
GlassFish: servidor de aplicaciones de software libre desarrollado por Sun que implementa las
tecnologas definidas en la plataforma J2EE y permite ejecutar aplicaciones que siguen dicha
especificacin.
Jonas: es un servidor de aplicaciones J2EE de cdigo abierto implementado en Java, por lo que puede
funcionar en cualquier plataforma que tenga instalada la maquina virtual de Java.
JBoss: servidor de aplicaciones J2EE de cdigo abierto implementado en Java puro, sus caractersticas
ms destacadas en que cumple los estndares y es confiable a nivel de empresa.
Jetty: es un servidor HTTP basado en Java tambin es un contenedor de servlets escritos en Java, es
software libre y es utilizado por otros proyectos como JBoss y Geronimo.
WebSphere Aplication Server (WAS): es un servidor de aplicaciones de IBM basado en estndares abiertos
como J2EE, XML y servicios web.
Al final nos hemos decantado por el entorno de desarrollo Eclipse por que existe una versin de Spring adaptada
especialmente para el desarrollo de aplicaciones con el framework Spring, adems de tener gran material de
soporte y gestor de plugins.
En cuanto al servidor hemos elegido GlassFish por su sencillez de instalacin en Eclipse y por su soporte para
JPA.
15
16
Capitulo 1
1 Introduccin.
El objetivo de este captulo es conocer que es lenguaje Java y porque esta tan de moda y es el preferido para la
mayora de los programadores dada su facilidad para pasar de una plataforma a otra, como funciona el cdigo Java
y como se puede hacer funcionar mediante contenedores web y EJB.
2 Qu es J2EE?
Para empezar a comprender que es Java2EE primero tenemos que comprender que es Java. Java es lenguaje de
programacin de alto nivel y orientado a objetos e independiente del hardware en la que se ejecuta. Esto ltimo se
consigue gracias a la maquina virtual de Java, para que una aplicacin Java funcione tenemos que tener instalado la
JMV (Java virtual machine) y el JRE (Java Runtime Enviorment) necesario para crear aplicaciones Java. Al compilar
el cdigo Java no se genera cdigo maquina como se hace normalmente sino un cdigo intermedio, esto es as ya
que el cdigo maquina depende del ordenador en que se ejecute, por eso se genera el cdigo intermedio y despus
la maquina virtual de Java es la encargada de transformar este cdigo intermedio en el cdigo maquina
correspondiente para cada ordenador en el que se ejecute para lograr la total independencia del hardware.
2.
3.
Java ME: aplicaciones para dispositivos mviles (versin simplificada de SE y Apis especificas).
4.
Java FX: aplicaciones web que tienen las caractersticas y capacidades de aplicaciones de escritorio.
17
3 Contenedores Web.
18
Los contenedores web son unos entornos que encapsulan los protocolos HTTP y TCP/IP es decir nos liberan de la
tarea de creacin de sockets y serverSockets as como la de realizar la conexin con el navegador, pueden contener
tanto Servlets como pginas web dinmicas.
Los Servlets son bsicamente cdigo Java que puede tener cdigo HTML incrustado aunque es desaconsejable esta
prctica por diferentes razones:
Programar web no es lo mismo que programar Java, por lo que se aconseja dejar cada tarea a
desarrolladores expertos en cada campo.
Los Servlets pueden acceder a una gran variedad de Apis de Java y tiene la ventaja de que una vez invocados se
quedan en memoria por lo que las siguientes invocaciones solo es necesario instanciarlos mejorando
significativamente el tiempo de respuesta.
Los JSP (Java Server Pages) son equivalentes a las ASP de Microsoft, son unas pginas web con un grupo de
etiquetas ampliado y pueden contener cdigo Java incrustado, aunque esto debemos evitarlo.
Los JavaBeans siguen el concepto de encapsulacin por lo que se accede a sus propiedades privadas a travs de sus
mtodos pblicos. Son llamados por los Servlets y los JSP para:
4 Contenedores EJB.
Los contenedores EJB son un entorno en el que se ejecutan los EJB (Enterprisse JavaBeans) no confundir con los
JavaBeans pues los EJB pueden ser activados por si solos y los JavaBeans deben estar integrados en otros
componentes. Son un programa que se ejecuta en el servidor y contiene todas las clases y objetos necesarios para
el funcionamiento de los enterprisse beans.
Las ventajas que ofrece el contenedor EJB son:
Manejo de transacciones.
Servicios de red.
Persistencia: sincronizacin entre los datos de la aplicacin y los de las tablas de los base de datos.
19
20
Capitulo 2
1 Introduccin
En este captulo vamos a ver uno de los servidores ms populares para ejecutar java en entornos web, as como
descargarlo, instalarlo, configurarlo y arrancarlo.
2 GlassFish
GlassFish es el servidor de aplicaciones desarrollado por Sun para implementar las tecnologas definidas por las
Apis de la versin Java EE tanto de servicios web como de Enterprise beans. Existen dos versiones una gratuita de
cdigo libre llamada GlassFish solamente y otra comercial llamada Sun GlassFish Enterprise Server. GlassFish
al contrario que su competidor Tomcat no es solamente un contenedor web sino que es un conjunto de
contenedores Java EE, uno de los cuales es un contenedor web.
Vamos a ver una serie de ventajas que tiene GlassFish sobre Tomcat:
Ruta de migracin ms sencilla. Con GlassFish v2 hay una forma clara y sencilla de aprovechar
tecnologas tales como Enterprise Java Beans (EJBs), Java Persistence API (JPA) y Java Message Service
(JMS), entre otras. Con Tomcat, estas tecnologas deben agregarse poco a poco, una a una.
Compatibilidad con lenguajes de script. GlassFish admite, Ruby/JRuby, Python/Jython, Groovy, PHP,
JavaScript/Phobos y Scala, entre otros lenguajes.
La capacidad de retener sesiones entre distintos despliegues de aplicaciones supone un importante ahorro
de tiempo para los desarrolladores que crean aplicaciones Web Java.
GlassFish incluye varias optimizaciones de rendimiento, como flattened valve invocation, una
modificacin de la arquitectura de vlvula que racionaliza la forma de llamar a cada vlvula, reduciendo
21
GlassFish facilita la reconfiguracin dinmica de servidores virtuales y Listeners HTTP sin necesidad de
reiniciar el servidor. Con Tomcat, cuando se modifica una fuente de recursos, suele ser necesario reiniciar
el servidor de aplicaciones.
22
23
24
25
26
Capitulo 3
1 Introduccin
En este captulo vamos a explicar que es el framework Spring, los mdulos que lo forman as como algunas de las
funciones de estos mdulos, tambin veremos cmo descargar e instalar SpringToolSuite que es una versin de
Eclipse especialmente creada para el desarrollo de aplicaciones con el framework Spring.
2 Qu es SPRING?
Spring es un framework de cdigo abierto de desarrollo de aplicaciones para la plataforma Java. La primera versin
fue escrita por Rod Johnson. Tambin hay una versin para la plataforma .NET, Spring.net.Inicialmente el
framework se lanz bajo la licencia Apache 2.0 en junio de 2003.
Spring Framework no obliga a usar un modelo de programacin en particular, no obstante se ha popularizado en la
comunidad de programadores en Java, siendo alternativa del modelo de Enterprise JavaBean. El diseo del
framework ofrece mucha libertad a los desarrolladores en Java y soluciones muy bien documentadas y fciles de
usar.
Mientras que las caractersticas fundamentales de este framework pueden emplearse en cualquier aplicacin hecha
en Java, existen muchas extensiones y mejoras para construir aplicaciones basadas en web por encima de la
plataforma empresarial de Java EE.
27
Los mdulos que integran Spring pueden trabajar independientemente unos de otros. Spring est formado ms o
menos por unos 20 mdulos aqu vamos a explicar los ms importantes.
Singleton: existe solamente una instancia compartida de un objeto con un nombre nico, puede
ser devuelto o llamado tantas veces como se requiera, es el mtodo ms comn.
Prototype o non-sigleton: cada vez que se realiza una devolucin o llamada se crea un objeto
independiente.
28
Setter Inyection: este tipo de inyeccin es aplicada por mtodos JavaBeans setters.
Spring Context: es un archivo de configuracin que provee de informacin contextual al framework general.
Tambin provee servicios Enterprise como JDNI, EJB, e-mail, validacin y funcionalidad de agenda.
Aplication Context: es una subinterfaz de la fbrica de beans, todo lo que puede realizar la fbrica de beans tambin
lo puede realizar Aplication Context, agrega informacin de la aplicacin que puede ser utilizada por todos los
componentes.
Adems brinda las siguientes funcionalidades extra:
Contextos de herencia.
Acceso a recursos.
Propagacin de eventos, para permitir que los objetos de la aplicacin puedan publicar y opcionalmente
registrarse para ser notificados de los eventos.
3.2 DAO: El patrn DAO (Data Acces Object) es uno de los mdulos ms importantes y utilizados en J2EE.
DAO y JDBC: hay dos maneras de llevar a cabo la conexin, manejo y acceso a las bases de datos: utilizar alguna
herramienta ORM o utilizar JDBC (Java Database Connectivity) que ofrece Spring. Si se trata de una aplicacin
29
simple donde la conexin la realizara una sola clase la mejor opcin sera JDBC, si por el contrario se desea ms
complejidad, dar mayor soporte y mejor robustez es recomendable utilizar una herramienta ORM.
El uso de JDBC puede llevar en muchos casos a repetir el mismo cdigo en distintos lugares al crear la conexin,
buscar y manejar los datos y cerrar la conexin. El uso de las tecnologas antes mencionadas mantiene el cdigo
simple y evita que sea tan repetitivo adems de evitar los errores comunes al cerrar una conexin contra una base
de datos. Las clases base que Spring propone para la utilizacin de DAO son abstractos y brindan un fcil acceso a
los recursos comunes de las bases de datos. Existen diferentes implementaciones para cada una de las tecnologas
de acceso a datos que soporta Spring.
Para JDBC esta la clase JdbcDaoSupport que provee los mtodos para acceder al DataSource y a JdbcTemplate,
este se encarga de atrapar todas las excepciones de SQL y las convierte en una subclase de DataAccesException.
Tambin los JdbcTemplate se encargan de controlar la conexin a la base de datos. Y se puede evitar configurar el
DataSource en DAO, nicamente se tiene que establecer a travs de la inyeccin de dependencia.
3.3 ORM: Spring no propone un ORM (Object-Relational Mapping) propio para los usuarios que no quieran
simplemente usar JDBC, en su lugar ofrece un modulo que soporta los framework ms populares, entre ellos:
Hibernate. Es una herramienta de mapeo O/R muy popular. Utiliza su propio lenguaje de consultas
llamado HQL.
iBATIS SQL Maps: una solucin sencilla y fuerte para hacer externas las declaraciones de SQL en
archivos XML.
Apache OJB: plataforma de mapeo O/R con mltiples Apis para clientes.
Otros como JDO y Oracle TopLink.
Algunas de las ventajas con las que cuenta Spring al combinarse con alguna herramienta ORM son:
Manejo de sesin: Spring hace de manera ms sencilla, eficiente y segura que cualquier herramienta
ORM, la forma en que se manejan las sesiones.
Manejo de recursos: se puede manejar la localizacin y configuracin de las fbricas de sesiones de
Hibernate o las fuentes de datos de JDBC, por ejemplo haciendo que estos valores sean ms fciles de
modificar.
Manejo de transacciones integrado: se puede utilizar una plantilla de Spring para las diferentes
transacciones ORM.
Envolver excepciones: se pueden envolver todas las excepciones para evitar las declaraciones y los catch
en cada segmento de cdigo necesario.
Evita limitarse a un solo producto: si se quiera migrar o actualizar a una versin de un ORM distinto o del
mismo, Spring trata de no crear una dependencia entre la herramienta ORM, Spring y el cdigo de la
aplicacin, para que cuando se quiera cambiar a otro ORM resulte muy sencillo.
Facilidad de prueba: Spring trata de crear pequeos pedazos que se puedan aislar y probar por separado,
ya sean sesiones o una fuente de datos.
3.4 AOP: Aspect-oriented programming (Programacin orientada a aspectos), esta tcnica permite a los
programadores modularizar la programacin. El ncleo de construccin es el aspecto que encapsula el
comportamiento que afectan a diferentes clases, en mdulos que pueden ser utilizados.
Alguna de sus utilidades son:
30
Persistencia.
Manejo de transacciones.
Seguridad.
Autentificacin.
Depuracin.
Spring AOP es portable entre servidores de aplicacin funciona tanto en servidores web como en contenedores
EJB y soporta las siguientes funcionalidades:
Introduccin: especificando que es un advice (accin tomada en un punto del programa durante su
ejecucin) debe hacer que un objeto implemente interfaces adicionales.
Pointcuts estticos y dinmicos: para especificar los puntos del programa donde debe hacer una
intercepcin.
Spring implementa AOP utilizando proxies dinmicos, adems se integran transparentemente con las fbricas de
beans que existen.
3.5 WEB: El modulo de Spring Web se encuentra en la parte superior del modulo Context. En este modulo se
encuentra el MVC (Modelo Vista Controlador) por lo que este modulo se explicara en el apartado de MVC.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Capitulo 4
1 Introduccin
En este captulo vamos a explicar la autentificacin Acegi que est incluida en Spring como un modulo adicional
llamado Spring security, vamos a explicar las distintas maneras de autentificarse que hay con este modulo. Tambin
vamos a ver la cadena de filtros por los que pasa una validacin para ser acepta por Spring security.
2 Autenticacin
La autentificacin en Spring se hace mediante Acegi que es un proyecto que se cre en 2003 por Ben Alex bajo
licencia Apache en Marzo de 2004. Posteriormente fue incorporado a Spring.
Con el fin de mejorar la seguridad a los recursos de la aplicacin Acegi utiliza el objeto autentificacin
(Authentication) que es donde almacena el nombre de usuario y la contrasea as como los roles perteneciente a
dicho usuario, para poder determinar qu tipo de recursos sern accesibles para el usuario. En Acegi disponemos
de 3 tipos de autentificacin mediante un archivo que deber ser configurado, mediante las tablas que nos
proporciona Acegi o con base de datos propia.
Este objeto autentificacin es creado por y validado por el gestor de autentificacin (AuthenticationManager) y el
acceso a los recursos es controlado por el gestor de decisiones de acceso (AccesDecisionManager).
Toda la configuracin de Acegi se realiza mediante la asociacin de JavaBeans a travs de archivos XML.
Acegi usa cuatro filtros para manejar la seguridad:
1.
2.
3.
4.
Haciendo uso de la inyeccin de dependencia de Spring estas clases delegan el trabajo ms pesado a otras clases.
46
3 La cadena de filtros.
47
</property>
</bean>
<bean id="exceptionTranslationFilter"
class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<ref bean="formLoginAuthenticationEntryPoint" />
</property>
</bean>
48
49
PATTERN_TYPE_APACHE_ANT hace que sea ms fcil definir los patrones de URL que
estarn.
50
</property>
</bean>
51
</property>
<property name="username">
<value>j2ee</value>
</property>
<property name="password">
<value>password</value>
</property>
</bean>
52
//Este mtodo carga un usuario desde la base de datos a partir del nombre de
//usuario
final User user = AccountFacade.loadUserByUsername(userName);
if (user == null)
throw new UsernameNotFoundException("No existe el nombre de usuario");
return new UserDetails() {
private static final long serialVersionUID = -2868501916277412090L;
public GrantedAuthority[] getAuthorities() {
return new GrantedAuthority[] { new GrantedAuthority() {
public String getAuthority() {
if (user.isSystemAdmin())
return "ROLE_ADMIN";
else if (user.isAccountAdmin())
return "ROLE_ACCOUNTADMIN";
else
return "ROLE_USER";
}
} };
}
public String getPassword() {
return user.getPassword();
}
public String getUsername() {
return user.getUsername();
}
public boolean isAccountNonExpired() {
return true;
}
public boolean isAccountNonLocked() {
return true;
}
public boolean isCredentialsNonExpired() {
return true;
}
public boolean isEnabled() {
return user.isActivated();
}
};
}
}
53
invocado por Acegi, el cual pasar el nombre de usuario como parmetro). Al retornar algo de este tipo lo que
debemos hacer es devolver en los mtodos heredados los datos correspondientes que tenemos en nuestro objeto
User.
Logout
Agregar la funcionalidad de logout es muy simple. Slo hay que configurar un filtro. ste es de tipo
org.acegisecurity.ui.logout.LogoutFilter.
<bean id="logoutFilter"
class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/index.jsp" />
<constructor-arg>
<list>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
</list>
</constructor-arg>
<property name="filterProcessesUrl">
<value>/logout.jsp</value>
</property>
</bean>
54
<bean id="rememberMeAuthenticationProvider"
class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key">
<value>myKey</value>
</property>
</bean>
55
</list>
</property>
</bean>
56
Capitulo 5
1 Introduccin
En este captulo trataremos de explicar que es un modelo de capas, su funcin y los diferentes tipos de modelos que
existen. Nos centraremos especialmente en el que vamos a utilizar en nuestras aplicaciones el modelo de 3 capas.
2 Modelo de capas
El modelo de capas es una tcnica software para separar las diferentes partes de la aplicacin, con el objetivo de
mejorar su rendimiento, mantenimiento y sus funciones. Esta separacin de las diferentes partes hace que los
cambios en cualquiera de las capas no afecten o afecten poco a las otras capas en que est dividida la aplicacin.
Nos vamos a centrar en dos modelos el n-capas y el ms importante para nuestra aplicacin web el de 3 capas:
2.1 N-capas(n-tier)
Mayor flexibilidad(se pueden aadir nuevos mdulos sin tener que retocar mucho)
Alta escalabilidad.
Las desventajas:
57
En una aplicacin distribuida en n-capas, los diferentes procesos estn distribuidos en diferentes capas no slo
lgicas, sino tambin fsicas. Los procesos se ejecutan en diferentes equipos, que pueden incluso residir en
plataformas o sistemas operativos completamente distintos. Cada equipo posee una configuracin distinta y est
optimizado para realizar el papel que le ha sido asignado dentro de la estructura de la aplicacin, de modo que
tanto los recursos como la eficiencia global del sistema se optimicen. Esta arquitectura es ms propia de los grandes
sistemas.
58
Capitulo 6
1 Introduccin
En este captulo vamos a ver el modelo vista controlador aplicado al framework Spring y las ventajas que nos ofrece
Spring y sus mdulos para aplicarlo a nuestros programas. Tambin vamos a ver los distintos filtros y mdulos de
que dispone Spring para hacernos ms fcil este tipo de implementacin.
2 MVC en SPRING
El MVC es un patrn de diseo de software que separa los datos de una aplicacin, la interfaz de usuario y la lgica
de control de forma que cualquier modificacin de algn componente del modelo tenga un mnimo impacto en los
otros.
Sus componentes son:
Vista: es el responsable de presentar los datos al usuario de una forma que este pueda entenderlos, la
vista no debe trabajar con las peticiones esto debe dejrselo al controlador.
Spring brinda un MVC para web bastante flexible y configurable, pero esto no le quita sencillez ya que se pueden
realizar aplicaciones sencillas sin tener que configurar muchas opciones.
El MVC Web de Spring tiene algunas caractersticas que lo hacen nico:
Los controladores son configurados como los dems objetos, a travs de IoC.
59
<servlet>
<servlet-name>training</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
60
<servlet-name>ejemplo</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
controlador.
<bean id="beanNameUrlMapping" class="org.springframework.web.
servlet.handler.BeanNameUrlHandlerMapping"/>
61
<prop key="/login.htm">LoginController</prop>
</props>
</property>
</bean>
InternalResourceViewResolver: resuelve los nombres lgicos en un archivo tipo vista que es convertido
utilizando una plantilla JSP, JSTL o Velocity.
BeanNameViewResolver: resuelve los nombres lgicos de las vistas en beans de tipo vista en el contexto
de la aplicacin del distribuidor de servlets.
ResourceBundleViewResolver: resuelve los nombres lgicos de las vistas en objetos tipo vista contenidos
en el ResourceBundler o en un archivo con extensin .properties.
XMLViewResolver: resuelve los nombres lgicos de las vistas que se encuentran en un archivo XML
separado.
62
ViewClass: especifica el tipo de plantilla que se desea utilizar para desplegar la vista, en este caso JSTL.
Prefix: es el prefijo al nombre lgico de la vista, comnmente es la ruta donde se encuentran los JSP.
Suffix: son los sufijos o extensiones que tendrn nuestras vistas en este caso .jsp
Gracias a esta configuracin si se quisiera cambiar el directorio de las vistas solamente cambiaramos la propiedad
Prefix.
2.4 Controlador (Controller).
Existen controladores especficos para cada caso y los ms comunes que son para uso general. Para crear un
controlador basta con implementar la interfaz de este y sobrescribir los mtodos que sean necesarios. Existen
varios tipos de controladores en Spring, por lo que se brinda la posibilidad de escoger el controlador a implementar.
63
64
Capitulo 7
1 Introduccin
En este captulo vamos a ver y explicar que es JPA as como que es un ORM y la manera de utilizar ambos
conjuntamente para acceder ms fcilmente a las bases de datos.
2 JPA
Java Persistence API, ms conocida por su sigla JPA, es la API de persistencia desarrollada para la plataforma Java
EE e incluida en el estndar EJB3. Esta API busca unificar la manera en que funcionan las utilidades que proveen
un mapeo objeto-relacional. El objetivo que persigue el diseo de esta API es no perder las ventajas de la
orientacin a objetos al interactuar con una base de datos, como s pasaba con EJB2, y permitir usar objetos
regulares (conocidos como POJOs).
3 ORM
[1-Wikypedia]
El mapeo objeto-relacional (ms conocido por su nombre en ingls, Object-Relational mapping, o sus siglas O/RM,
ORM, y O/R mapping) es una tcnica de programacin para convertir datos entre el sistema de tipos utilizado en
un lenguaje de programacin orientado a objetos y el utilizado en una base de datos relacional, utilizando un motor
de persistencia. En la prctica esto crea una base de datos orientada a objetos virtual, sobre la base de datos
relacional. Esto posibilita el uso de las caractersticas propias de la orientacin a objetos (bsicamente herencia y
polimorfismo). Hay paquetes comerciales y de uso libre disponibles que desarrollan el mapeo relacional de objetos,
aunque algunos programadores prefieren crear sus propias herramientas ORM.
Es decir para aislar la aplicacin del tipo de base de datos que vamos a utilizar vamos a crear una capa o programa
que es la que se va a encargar de comunicarse con la base de datos y transformaros los datos para que podemos
tratar con ellos haciendo que cualquier cambio en la base de datos o incluso un cambio de motor de base de datos
no afecte a las otras capas de nuestra aplicacin solamente tendremos que cambiar de ORM y listo, en este caso
vamos a hablar de Hibernate que es el ms popular para Java.
65
4 Hibernate
Qu es Hibernate? Hibernate es una librera ORM open-source, que facilita trabajar con bases de datos
relacionales. Hace que el desarrollador trabaje con objetos (POJO's), lo que lleva a que el desarrollador se
preocupe por el negocio de la aplicacin y no del cmo se guardara, recuperar o eliminar la informacin de la
base de datos.
Hibernate funciona asociando a cada tabla de la base de datos un Plain Old Java Object (POJO, a veces llamado
Plain Ordinary Java Object). Un POJO es similar a una Java Bean, con propiedades accesibles mediante mtodos
setter y getter, como por ejemplo:
Veamos como configurar hibernate con Spring:
Spring nos provee la clase HibernateDaoSupport para brindarle a nuestros DAO soporte para Hibernate.
HibernateTemplate
En particular, uno de los mtodos ms tiles que provee es getHibernateTemplate(). Este mtodo devuelve un
template con varios mtodos tiles, que simplifican el uso de Hibernate. Estos mtodos suelen encapsular varias
excepciones propias de acceso a datos de Hibernate (y SQL) dentro de una DataAccessException (que hereda de
RuntimeException).
Creando un DAO con soporte de Spring
La forma ms simple de usar Hibernate con Spring es crear clases que hereden de HibernateDaoSupport. Esta clase
ofrece varias utilidades para manipular la sesin de Hibernate, y se encarga de manejar automticamente las
transacciones.
La interfaz del DAO
La interfaz de nuestro DAO es simple, y no necesita tener ninguna herencia ni restriccin en particular:
public interface InvasorDao {
guardarInvasor(Invasor invasor);
}
66
67
68
2 Conclusiones
Spring es un framework muy potente y completo, gracias a su fcil configuracin nos permite crear diferentes
aplicaciones adaptadas a nuestras necesidades. Adems gracias a sus diferentes mdulos nos permite introducir
caractersticas adicionales como la seguridad, que nos permite configurar todas las opciones y permisos fcilmente
adems de poder gestionarlos fcilmente sin tener que crearnos objetos adicionales ya que spring security los crea
por nosotros.
En cuanto a JPA e hibernate, nos hace ms fcil el manejo de los datos al poder tratarlos como entidades, adems al
ser JPA un estndar y no estar ligado a ningn ORM nos permite poder cambiar de ORM sin tener que realizar
grandes cambios en las aplicaciones.
La combinacin de JPA, Spring e hibernate nos permite separar ms fcilmente la aplicacin en capas y realizar
cambios en la aplicacin que de otra manera requeriran volver a disear la aplicacin desde el principio, como por
ejemplo cambiar de motor de bases de datos.
3 Trabajo Futuro
Como ampliacin y mejora para este portal se podran incluir ciertas funcionalidades como:
Aadir la funcionalidad de administracin de usuarios como dar de alta un usuario, modificar sus
privilegios, desactivar un usuario, etc.
Aadir la opcin de crear pginas web mediante la inclusin de un editor web en el portal.
Crear una versin para Android aprovechando la versin que nos brinda Spring.
69
70
Anexos
1 Introduccin
En este anexo se proporcionan los manuales de las aplicaciones realizadas.
Figura 47. Seleccin del asistente para crear una aplicacin Spring.
File>>New>>Spring Template Project>>MVCProject
71
72
Hemos nombrado al proyecto portalDocenteSpring y al paquete le llamaremos upv.pfc.pd, introducimos los datos y
finalizamos para que nos cree el proyecto.
73
74
<dependency>
<groupId> identifica normalmente a un proyecto </groupId>
<artifactId> nombre concreto del jar </artifactId>
<version> nmero de versin que queremos </version>
</dependency>
Listado 36. Etiqueta de Maven.
Ahora vamos a ver el archivo web.xml que es el que tiene nuestra configuracin.
75
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
Listado 37. Etiqueta archivo de contexto.
Esta etiqueta nos indica donde estn nuestros archivos de configuracin para la aplicacin.
<listener>
<listenerclass>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Listado 38. Declaracin del listener.
Aqu se declara un listener que es el que cargara el contexto de la aplicacin.
<servlet>
<servlet-name>appServlet</servlet-name>
<servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servletcontext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
76
</servlet>
Listado 39. Declaracin del DispatcherServlet.
En esta etiqueta se declara el controlador y se le indica que ser el primer o en ser cargado al inicializar la
aplicacin.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Listado 40. Configuracin de las peticiones que aceptaremos.
Por ltimo en esta etiqueta se indica que clase de peticiones va a aceptar, en este caso le estamos diciendo que
acepte cualquier peticin que le entre.
Ahora vamos a explicar el archivo de configuracin Servlet-context.xml.
<beans: bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans: property name="prefix" value="/WEB-INF/views/" />
77
78
Esta funcin en concreto se le pasa como argumento un modelo esto es necesario para pasar parmetros, se define
una variable con la hora actual y se le aade al modelo con el nombre serverTime, este nombre es por el que
accederos a ese parmetro desde la vista, es decir desde el archivo home.jsp.
Y finalmente el archivo home.jsp que no es ms que un archivo jsp normal.
79
http://localhost:8080/portalDocenteSpring
80
81
82
83
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filterclass>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
84
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Listado 45. Filtros a aadir.
Con lo que nuestro archivo web.xml quedara de la siguiente forma.
85
</beans:beans>
Listado 46. DTD de Spring.
Ahora que ya tenemos definido el schema del archivo vamos a incluir la configuracin de seguridad
para esto debemos incluir los siguientes tags.
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/**" access="hasRole('alumno')" />
</http>
Listado 47. Tag del rol alumno.
Este tag especifica las URL que se van a filtrar vamos a ver las distintas propiedades:
<authentication-manager>
<authentication-provider>
<user-service>
86
87
<sec:authorize access="hasRole('alumno')">
<table>
<tr>
<td><b>Menu alumno</b></td>
</tr>
<tr>
<td>
<ul class="enlaces_lateral">
<li type="disc"><a href="/portalDocenteSpring/alumno/listar">Listar
archivos</a></li>
<li type="disc"><a href="/portalDocenteSpring/tutorial/mvcTutorial">Subir
archivo</a></li>
88
</ul>
</td>
</tr>
</table>
</sec:authorize>
Listado 49. Configuracin de permisos.
Esto comprueba si el usuario tiene permisos de alumno si es as devuelve true y si no devuelve false y no pinta el
men.
Aparte de todo esto tambin debemos hacer los controladores para que nos devuelvan las vistas, como siempre los
controladores irn en la carpeta src/main /java y dentro del paquete upv.pfc.pd, ah vamos a crear un controlador
llamado adminController.java para todas estas pginas del tutorial.
89
90
91
<authentication-manager alias="authenticationManager">
<authentication-provider>
<jdbc-user-service data-source-ref="seguridadDataSource" />
</authentication-provider>
</authentication-manager>
Listado 52. Definicin del authenticationManager.
Ahora debemos declarar nuestro bean para nuestro dataSource, indicando la clase que va utilizar.
<beans:bean
id="userService" class="org.springframework.security.core.userdetails.
jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="seguridadDataSource" />
</beans:bean>
Listado 53. Declaracin de clase a utilizar por el dataSource.
Ahora ya solo nos queda declarar nuestro dataSource al que hemos llamado seguridadDataSource con las opciones
de configuracin correcta, es decir la clase que utilizara, la URL, el driver, el usuario para conectarnos a la base de
datos y el password.
<beans:bean
id="seguridadDataSource" class="org.springframework.jdbc.datasource.D
riverManagerDataSource">
92
93
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
94
<version>4.8.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
95
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.0.5.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>compile</scope>
96
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
<version>3.7.ga</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Spring security -->
<dependency>
<groupId>org.springframework.security</groupId>
97
<artifactId>spring-security-config</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
Listado 55. Dependencias para hibernate.
Ahora guardamos el proyecto y Maven ara el trabajo por nosotros. Ahora que ya tenemos todas las libreras en
nuestro proyecto vamos a empezar por cambiar todo nuestro archivo seguridad.xml por este contenido.
98
<list>
<value> upv.pfc.pd </value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- ========================= BEANS ======================== -->
<bean id="userDao" class=" upv.pfc.pd.UserDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="userService" class=" upv.pfc.pd.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<!-- ========================= URL ======================== -->
<sec:http pattern="/" security="none"/>
<sec:http auto-config="true" use-expressions="true">
<!-- <sec:intercept-url pattern="/**"
access="IS_AUTHENTICATED_ANONYMOUSLY" /> -->
<sec:intercept-url pattern="/alumno/**"
access="hasRole('alumno')"/>
<sec:intercept-url pattern="/profesor/**"
access="hasRole('profesor')"/>
<sec:intercept-url pattern="/tutorial/**"
access="isAuthenticated()"/>
<sec:intercept-url pattern="/documentacion/**"
access="isAuthenticated()" />
<sec:intercept-url pattern="/**" access="permitAll" />
<sec:form-login login-page="/home" />
<sec:logout logout-success-url="/" delete-cookies="JSESSIONID"/>
</sec:http>
<sec:authentication-manager>
<sec:authentication-provider user-serviceref="userUserDetailsService"/>
</sec:authentication-manager>
<bean id="userUserDetailsService"
class=" upv.pfc.pd.UserUserDetailsService">
<constructor-arg ref="userService"/>
</bean>
</beans>
99
User.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
/**
* The persistent class for the USERS database table.
*
*/
@Entity
@Table(name="USERS")
public class User implements Serializable, UserDetails {
private static final long serialVersionUID = 1L;
//Original props
@Id
@Column(name="USERNAME")
private String username;
@Column(name="ENABLED")
private String enabled;
@Column(name="PASSWORD")
private String password;
//bi-directional one-to-one association to Authority
@OneToOne
@JoinColumn(name="USERNAME")
private Authority authority;
// Getters & Setters for original props
public String getUsername() {
100
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEnabled() {
return this.enabled;
}
public void setEnabled(String enabled) {
this.enabled = enabled;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
//Getters and setters for relation property
public Authority getAuthority() {
return this.authority;
}
public void setAuthority(Authority authority) {
this.authority = authority;
}
//Spring Security props
private transient Collection<GrantedAuthority> authorities;
//UserDetails methods
@Transient
public Collection<GrantedAuthority> getAuthorities() { return
authorities;}
@Transient
public boolean isAccountNonExpired() { return true;}
@Transient
public boolean isAccountNonLocked() { return true; }
@Transient
public boolean isCredentialsNonExpired() {return true; }
@Transient
public boolean isEnabled() {
return getEnabled().equals("true");
}
@Transient
public void setUserAuthorities(List<String> authorities) {
List<GrantedAuthority> listOfAuthorities = new
ArrayList<GrantedAuthority>();
for (String role : authorities) {
listOfAuthorities.add(new GrantedAuthorityImpl(role));
}
this.authorities = (Collection<GrantedAuthority>) listOfAuthorities;
}
//Constructors
public User() {
}
}
Listado 57. Clase User
Authority.java
101
import java.io.Serializable;
import javax.persistence.*;
/**
* The persistent class for the AUTHORITIES database table.
*
*/
@Entity
@Table(name="AUTHORITIES")
public class Authority implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="USERNAME")
private String username;
@Column(name="AUTHORITY")
private String authority;
@OneToOne(mappedBy="authority")
private User user;
public Authority() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAuthority() {
return this.authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
}
Listado 58. Clase Authority
Ahora ya tenemos las clases implementadas vamos a implementar los DAO.
UserDao.java
import java.util.List;
public interface UserDao {
public User getUserByUserName(String userName);
List<String> getAuthoritiesByUserName(String userName);
}
Listado 59. Clase UserDao.
102
UserService.java
import java.util.List;
public interface UserService {
User getUserByUserName(String userName);
List<String> getAuthoritiesByUserName(String userName);
}
Listado 60. Clase UserService.
UserDaoImpl.java
import java.util.ArrayList;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;
public class UserDaoImpl implements UserDao {
HibernateTemplate hibernateTemplate;
private String queryString = "from User where username = ?";
public void setHibernateTemplate(HibernateTemplate arg0) {
hibernateTemplate = arg0;
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public User getUserByUserName(String userName) {
return (User) hibernateTemplate.find(queryString, userName).get(0);
}
public List<String> getAuthoritiesByUserName(String userName) {
User u = (User) hibernateTemplate.find(queryString, userName).get(0);
Authority a = u.getAuthority();
String auth = a.getAuthority();
List<String> l = new ArrayList<String>();
l.add(auth);
return l;
}
}
Listado 61. Clase UserDaoImpl.
UserServiceImpl.java
import java.util.List;
public class UserServiceImpl implements UserService {
UserDao userDao;
public User getUserByUserName(String userName) {
return userDao.getUserByUserName(userName);
}
public List<String> getAuthoritiesByUserName(String userName) {
return userDao.getAuthoritiesByUserName(userName);
}
public UserDao getUserDao() {
return userDao;
}
103
UserUserDetailsService.java
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import
org.springframework.security.core.userdetails.UsernameNotFoundException;
public class UserUserDetailsService implements UserDetailsService {
private UserService userService;
public UserUserDetailsService(UserService userService) {
this.userService = userService;
}
public UserDetails loadUserByUsername(String userName)
throws UsernameNotFoundException, DataAccessException {
User user;
try {
user = userService.getUserByUserName(userName);
} catch (Exception e) {
throw new UsernameNotFoundException(
"getUserByUserName returned null.");
}
List<String> authorities = userService
.getAuthoritiesByUserName(userName);
user.setUserAuthorities(authorities);
return (UserDetails) user;
}
}
Listado 63. Clase UserUserDetailsService.
Ahora que ya tenemos implementadas las clases podemos publicar la aplicacin y ver su correcto funcionamiento.
104
105
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
106
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
107
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
<version>3.7.ga</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.1</version>
<scope>runtime</scope>
</dependency>
108
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
109
110
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
111
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName"
value="JpaPersistenceUnit"/>
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
Listado 67. Declaracin del entityManagerFactory.
Ahora debemos crear nuestro transactionManager y aadirle como propiedades nuestro DataSource y nuestro
entityManagerFactory.
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource" />
</bean>
Listado 68. Declaracin del transactionManager.
Bien despus de todo esto nuestro fichero debe quedar de la siguiente manera.
112
<tx:jta-transaction-manager/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/docencia"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName"
value="JpaPersistenceUnit"/>
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
Listado 69. Archivo hibernate-context.xml
Ahora antes de crear nuestras entidades debemos aadir al web.xml una referencia a nuestro hibernatecontext.xml para que sea cargado por la aplicacin.
Figura 82. Con la etiqueta context-param se indica la ubicacin de los ficheros de configuracin de
hibernate.
Ahora ya podemos empezar a crear nuestras entidades con anotaciones, primero crearemos en src/main/java
dentro del paquete upv.pfc.jc la clase Alumnos.java, despus de aadirle el cdigo quedara de la siguiente
manera.
package upv.pfc.jc;
import java.io.Serializable;
113
import
import
import
import
import
import
import
import
import
javax.persistence.CascadeType;
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.JoinColumn;
javax.persistence.FetchType;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.Table;
javax.persistence.OneToOne;
@Entity
@Table(name="ALUMNOS")
public class Alumnos implements Serializable {
private static final long serialVersionUID = -5527566248002296042L;
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="Nombre")
private String nombre;
@Column(name="Apellidos")
private String apellidos;
@Column(name="FechaNacimiento")
private String fechanacimiento;
@OneToOne(fetch=FetchType.EAGER,cascade =CascadeType.ALL)
@JoinColumn(name="DIRECCIONES_ID")
private Direcciones Direccion;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
114
}
Listado 70. Clase Alumnos.java
Ahora vamos explicar las diferentes anotaciones que se encuentran en esta clase.
Para empezar la clase debe implementar la interface Serializable, antes de declarar la clase vemos la anotacin
@Entity esta es para informar al proveedor de persistencia que cada instancia de esta clase es una entidad. La
anotacin @Table simplemente la utilizamos para definir el nombre de la tabla con la que se est mapeando la
clase, sino se utiliza el nombre de la tabla corresponder al nombre de la clase.
@Id: especifica que es la clave principal.
@Column: Especifica una columna
@GeneratedValue: especifica que el valor de esta columna se generara automticamente.
Ahora vamos a ver la anotacin @OneToOne, esta anotacin indica que existe una relacin de 1:1 con otra entidad
en este caso Direcciones, los atributos que le hemos especificado como fetch EAGER especifican el tipo de lectura,
existen dos tipos de lectura Lazy(perezosa o retardada) y Eager en las relaciones 1:1 el tipo por defecto es EAGER
esto quiere decir que cuando consultemos una entidad nos traeremos todas sus entidades relacionadas tambin, en
las relaciones de 1:1 esto puede ser asumible pero en las relaciones tipo de N:N es inasumible por lo que el tipo por
defecto de estas es Lazzy, es decir que cuando consultamos una entidad solo nos traemos esa entidad y nos
traeremos las entidades relacionadas solamente cuando las consultemos, en cuanto a cascade=CascadeType.ALL ,
significa que para cada borrado, actualizacin o insercin se har en cascada , tambin podemos especificar que
solo se haga el borrado en cascada CascadeType.REMOVE , etc..
115
@JoinColumn simplemente sirve para indicar el nombre del campo que har referencia a la relacin, sino lo
hacemos la aplicacin generar uno por nosotros.
Bueno despus solo nos quedara generar los getters y setters correspondientes y ya tenemos nuestra primera
entidad.
Ahora vamos a implementar la entidad Direcciones.
package upv.pfc.jc;
import java.io.Serializable;
import
import
import
import
import
import
import
import
javax.persistence.CascadeType;
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.FetchType;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.Table;
javax.persistence.OneToOne;
@Entity
@Table(name="DIRECCIONES")
public class Direcciones implements Serializable {
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="Direccion")
private String direccion;
@Column(name="Poblacion")
private String poblacion;
@Column(name="Provincia")
private String provincia;
@OneToOne(cascade =CascadeType.ALL,mappedBy="Direccion")
private Alumnos alumnos;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
116
package upv.pfc.jc;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
117
@Repository
public class AlumnoDAO {
@Autowired
protected EntityManagerFactory emf;
public void setEntityManagerFactory(EntityManagerFactory emf)
{
this.emf=emf;
}
public List<Alumnos> getAll()
{
EntityManager em=this.emf.createEntityManager();
Query query=em.createQuery("FROM Alumnos");
@SuppressWarnings("unchecked")
List<Alumnos>al=query.getResultList();
return al;
}
public void add(Alumnos alumno )
{
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
em.persist(alumno);
em.getTransaction().commit();
}
public void delete(int id)
{
EntityManager em=this.emf.createEntityManager();
Alumnos alumno=null;
em.getTransaction().begin();
alumno=em.find(Alumnos.class, id);
em.remove(alumno);
em.getTransaction().commit();
}
public Alumnos getAlumnos(int id)
{
Alumnos alumno=null;
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
alumno=em.find(Alumnos.class, id);
em.getTransaction().commit();
return alumno;
}
public void editAlumno(Alumnos alumno)
{
EntityManager em=this.emf.createEntityManager();
Alumnos alumno1=null;
em.getTransaction().begin();
alumno1=em.find(Alumnos.class,alumno.getId());
em.getTransaction().commit();
118
em.getTransaction().begin();
alumno1.setApellidos(alumno.getApellidos());
alumno1.setNombre(alumno.getNombre());
alumno1.setFechanacimiento(alumno.getFechanacimiento());
alumno1.setDireccion(alumno.getDireccion());
em.merge(alumno1);
em.getTransaction().commit();
}
}
Listado 72. Clase AlumnosDAO.java
Lo primero en que nos fijamos es en las anotaciones @Repository y @Autowired que estn al principio del
documento y son muy importantes ya que nos sirven para inyectar el fichero en el contexto de Spring.
Empecemos por definir nuestro entityManagerFactory para despus poder crear nuestros EntityManager que son
las que nos abrirn y cerraran las transacciones para operar con la base de datos, necesitamos indicarle antes la
anotacin @Autowired para que lo inyecte en la aplicacin.
Despues de esto solo tenemos que crear los mtodos para trabajar con la entidad, como add, getAll, delete, ect...
Para el mtodo getAll que nos devuelve todos los alumnos que estn en la base de datos no es necesario abrir
ninguna transaccin, en cambio para los otros mtodos si es necesario crear una transaccin y cerrarla al acabar de
operar con una excepcin.
El mtodo modificar necesita de dos transacciones diferentes ya que JPA no deja modificar una entidad conectada
a la base de datos, lo que hacemos es abrir una primera transaccin para buscar y recuperar la entidad que
necesitamos, hasta aqu como en las dems funciones, el problema es que si no cerramos la transaccin la entidad
todava est conectada a la base de datos por lo que tenemos que cerrarla, despus modificamos la entidad,
volvemos a abrir la transaccin y hacemos un merge, es decir actualizamos la entidad, as no nos dar ningn error.
Ahora podemos ver que el fichero DireccionesDAO es idntico.
package upv.pfc.jc;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class DireccionesDAO {
@Autowired
protected EntityManagerFactory emf;
public void setEntityManagerFactory(EntityManagerFactory emf)
{
this.emf=emf;
}
public List<Direcciones> getAll()
{
EntityManager em=this.emf.createEntityManager();
Query query=em.createQuery("FROM Direcciones");
@SuppressWarnings("unchecked")
List<Direcciones>dir=query.getResultList();
return dir;
119
}
public void add(Direcciones dir)
{
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
em.persist(dir);
em.getTransaction().commit();
}
public void delete(int id)
{
Direcciones dir=null;
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
dir=em.find(Direcciones.class,id);
em.remove(dir);
em.getTransaction().commit();
}
public Direcciones getDirecciones(int id)
{
Direcciones dir=null;
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
dir=em.find(Direcciones.class,id);
em.getTransaction().commit();
return dir;
}
public void editDirecciones(Direcciones dir)
{
Direcciones direc=null;
EntityManager em=this.emf.createEntityManager();
em.getTransaction().begin();
direc=em.find(Direcciones.class,dir.getId());
direc.setDireccion(dir.getDireccion());
direc.setPoblacion(dir.getPoblacion());
direc.setProvincia(dir.getProvincia());
em.getTransaction().commit();
}
}
Listado 73. Clase DireccionesDAO.java
Ahora que ya tenemos los dos ficheros debemos podemos empezar a construir nuestra web como haramos
normalmente, lo nico que deberemos inyectar tambin los ficheros en el controlador para poder interactuar con la
base de datos.
120
package upv.pfc.jc;
import java.io.Serializable;
import java.util.List;
import
import
import
import
import
import
121
javax.persistence.CascadeType;
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.JoinTable;
import javax.persistence.Table;
import javax.persistence.OneToMany;
import javax.persistence.JoinColumn;
@Entity
@Table (name="ALUMNOS")
public class Alumnos implements Serializable {
private static final long serialVersionUID = -5527566248002296042L;
@Id
@Column (name="ID")
@GeneratedValue
private Integer id;
@Column(name="Nombre",nullable=false)
private String nombre;
@Column(name="Apellidos",nullable=false)
private String apellidos;
@Column(name="FechaNacimiento")
private String fechanacimiento;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="relacionEmail",joinColumns={@JoinColumn(name="alu_id"
,referencedColumnName="ID")},inverseJoinColumns={@JoinColumn(name="mail_id",r
eferencedColumnName="ID",unique=true)})
private List<Mail> email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getFechanacimiento() {
return fechanacimiento;
}
122
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="relacionEmail",joinColumns={@JoinColumn(name="alu_id"
,referencedColumnName="ID")},inverseJoinColumns={@JoinColumn(name="mail_id",r
eferencedColumnName="ID",unique=true)})
private List<Mail> email;
Listado 75. Declaracin de la relacin OneToMany.
La primera anotacin @OneToMany (cascade=CascadeType.ALL) es para definir el tipo de relacin y la opcin de
CacadeType.ALL es para decirle que todas las operaciones sobre la relacin se realicen en cascada. Despus la
anotacin @JoinTable es para crear una tabla intermedia de la relacin con el nombre que le hemos indicado en la
opcin name, despus de esto tenemos la opcin joinColumn que sirve para crear la columna de la nueva tabla que
se referir a la tabla Alumnos en este caso le pondremos de nombre a la columna alu_id y se referir a la columna
ID. Despues tenemos la opcin inverseJoinColumns que se referir a la otra tabla que va a formar parte de la
relacin en este caso Mail y como antes tenemos que indicar el nombre de la columna y a que columna de la tabla
se referir.
Por ltimo debemos crearnos una coleccin de objetos Mail ya que al ser una relacin de uno a muchos tendremos
muchos Mail para un mismo alumno.
123
Figura 85. Declaracin de las clases en el fichero de persistencia para las relaciones ManyToMany.
Ahora debemos declarar las clases, esto ser exactamente igual que en anterior tutorial, el de las relaciones
OneToMany.
package upv.pfc.jc;
import java.io.Serializable;
import java.util.List;
import
import
import
import
import
import
import
import
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.JoinColumn;
javax.persistence.JoinTable;
javax.persistence.ManyToMany;
javax.persistence.Table;
@Entity
@Table(name="ALUMNOS")
public class Alumnos implements Serializable {
private static final long serialVersionUID = -5527566248002296042L;
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="Nombre",nullable=false)
private String nombre;
@Column(name="Apellidos",nullable=false)
private String apellidos;
@Column(name="FechaNacimiento")
private String fechanacimiento;
@ManyToMany
@JoinTable(
name="Matriculado",
joinColumns={@JoinColumn(name="ALU_ID",
referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="ASIG_ID",
referencedColumnName="ID")})
private List<Asignaturas> asignaturas;
public Integer getId() {
return id;
}
124
package upv.pfc.jc;
import java.io.Serializable;
import java.util.List;
import
import
import
import
import
125
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.Table;
import javax.persistence.ManyToMany;
@Entity
@Table(name="ASIGNATURAS")
public class Asignaturas implements Serializable {
private static final long serialVersionUID = -5527566248002296042L;
@Id
@Column(name="ID")
@GeneratedValue
private Integer id;
@Column(name="Nombre",nullable=false,unique=true)
private String nombre;
@Column(name="Codigo",nullable=false,unique=true)
private String codigo;
@Column(name="Creditos",nullable=false)
private double creditos;
@ManyToMany(mappedBy="asignaturas")
private List<Alumnos> matriculados;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public double getCreditos() {
return creditos;
}
public void setCreditos(double creditos) {
this.creditos = creditos;
}
public List<Alumnos> getMatriculados() {
return matriculados;
126
}
public void setMatriculados(List<Alumnos> matriculados) {
this.matriculados = matriculados;
}
}
Listado 77. Clase Asignaturas.java
Aqu si hay diferencias respecto al anterior tutorial, en esta clase si hace falta incluir la anotacin @ManyToMany
por que la clase tiene que tener una coleccin de Alumnos que van a ser los matriculados en esa asignatura. La
opcin mappedBy, como hemos explicado antes, es para decirle que la duea de la relacin es la clase alumnos.
Ahora solo nos quedara implementar los DAO como antes y los controladores.
127
128
Bibliografa
http://es.wikipedia.org/wiki/Java_EE
http://enciclopedia.us.es/index.php/Java_2_Enterprise_Edition
http://www.proactiva-calidad.com/java/arquitectura/index.html
http://osgg.net/omarsite/resources/proceedings/Introduccion%20a%20J2EE.pdf
http://www.oracle.com/us/corporate/press/330073
http://docs.oracle.com/javaee/5/api/
http://ccia.ei.uvigo.es/docencia/SCS/Tema5-1.pdf
http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones
http://es.wikipedia.org/wiki/Framework
http://www.datuopinion.com/java-ee
http://aprendiendojee.wordpress.com/2010/04/23/%C2%BFque-es-java/
http://GlassFish.java.net/es/
http://casidiablo.net/documentacion-en-espanol-de-GlassFish/
http://GlassFish.java.net/es/public/users.html
http://www.marlonj.com/blog/2009/10/que-es-GlassFish/
http://certified-es.blogspot.com.es/2010/12/arquitectura-java-ee-y-springframework.html#!/2010/12/arquitectura-java-ee-y-spring-framework.html
http://www.slideshare.net/cptanalatriste/arquitectura-y-diseo-de-aplicaciones-java-ee
http://www.javadabbadoo.org/cursos/infosintesis.net/javaee/arquitecturajavaee/index.html
http://es.wikipedia.org/wiki/Enterprise_JavaBeans
http://www.jtech.ua.es/j2ee/2003-2004/abierto-j2ee-2003-2004/ejb/sesion01-traspas.pdf
http://www.oracle.com/technetwork/articles/javase/gfbasics-140371.html
http://www.osmosislatina.com/java/ejb.htm
http://es.scribd.com/doc/62097880/15/Contenedor-EJB
http://cea-tamara.blogspot.com.es/2008/01/contenedor-ejb.html
http://www.slideshare.net/oraclemarketing/4b-roger-freixa-oracle-enterprise-glass-fish
129
https://blogs.oracle.com/jaimecid/entry/presentacion_GlassFish_javaee5
https://blogs.oracle.com/jaimecid/resource/JC_GlassFish_JavaEE5.pdf
http://docs.oracle.com/cd/E19226-01/821-1335/821-1335.pdf
http://openaccess.uoc.edu/webapps/o2/bitstream/10609/8052/1/rdelo_TFC0611memoria.pd
f
http://openaccess.uoc.edu/webapps/o2/bitstream/10609/609/1/40050tfc.pdf
http://www.leandroiriarte.com.ar/spanish/acegi_spring_security.php
http://www.leandroiriarte.com.ar/spanish/web_mvc.php
http://www.sicuma.uma.es/sicuma/independientes/argentina08/Badaracco/index.htm
http://seamcity.madeinxpain.com/archives/comparativa-spring
http://mikiorbe.wordpress.com/2008/11/20/%C2%BFque-es-spring-explicacion-basica-ydescripcion/
http://noinventeslarueda.blogspot.com.es/2010/11/modulos-de-spring.html
http://www.elorigen.com/466/cuales-son-los-modulos-de-spring-java
http://www.summarg.com/foro/threads/493-Spring-Framework
http://catarina.udlap.mx/u_dl_a/tales/documentos/lis/sanchez_r_ma/capitulo3.pdf
http://www.javadabbadoo.org/cursos/infosintesis.net/javaee/spring/introduccion/modulos/in
dex.html
http://noinventeslarueda.blogspot.com.es/2010/11/que-es-spring.html
http://www.it.uc3m.es/mario/si/Introduccion_a_Spring.pdf
http://hop2croft.wordpress.com/2011/09/10/ejemplo-basico-de-spring-mvc-con-maven/
http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springide202
http://pdf.rincondelvago.com/desarrollo-de-n-capas.html
http://www.docirs.cl/arquitectura_tres_capas.htm
http://bulma.net/body.phtml?nIdNoticia=734
http://www.springsource.org/downloads/sts
http://www.palermo.edu/ingenieria/downloads/introduccion_spring_framework_v1.0.pdf
130
http://metodologiasdesistemas.blogspot.com.es/2007/10/que-es-un-orm-object-relationalmapping.html
http://es.wikipedia.org/wiki/Mapeo_objeto-relacional
http://www.srbyte.com/2009/09/que-es-orm.html
http://es.wikipedia.org/wiki/Java_Persistence_API
http://www.coplec.org/?q=book/export/html/240
http://informatica.uv.es/iiguia/DBD/Teoria/jdo.pdf
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=hibernate
http://blogandshare.blogspot.com.es/2005/10/hibernate-comienza-el-frio.html
http://www.epidataconsulting.com/tikiwiki/tikipagehistory.php?page=Hibernate&diff2=21&diff_style=sideview
http://www.dosideas.com/wiki/Hibernate_Con_Spring
http://www.springhispano.org/?q=node/255
http://www.aprendiendojava.com.ar/index.php?topic=54.0
http://oness.sourceforge.net/proyecto/html/ch03s02.html
http://wiki-aplidaniel.wikispaces.com/Modelo+n-capas
http://demetole.blogspot.com.es/2010/04/GlassFish-o-tomcat-cual-le-conviene.html
http://esctoexit.wordpress.com/2011/10/31/instalar-hibernate-tools-en-eclipse-indigo/
131