Download Spring

Document related concepts
no text concepts found
Transcript
DISEÑODEAPLICACIONESWEB
Bloque 3: Parte servidora
(backend)
TEMA3.1:SPRINGYJAVAEE
JesúsMontes
jmontes@fi.upm.es
SPRINGYJAVAEE
Disclaimer
• Estematerialestábasadoenunmaterial
originalde:
§ 
BoniGarcía(boni.garcia@urjc.es)
2
SPRINGYJAVAEE
Índice de contenidos
1.  JavaEnterpriseEdition
2.  Maven
3.  Spring
3
SPRINGYJAVAEE
Índice de contenidos
1.  JavaEnterpriseEdition
§ 
§ 
§ 
§ 
§ 
Introducción
EvolucióndeJavaEE
ArquitecturadeJavaEE7
Servidordeaplicaciones
EmpaquetadodeaplicacionesJavaEE
2.  Maven
3.  Spring
4
SPRINGYJAVAEE
1. Java Enterprise Edition
Introducción
•  JavaEnterpriseEditionaparecióafinalesdelos90parael
desarrollodeaplicacionesempresariales
§ 
Necesitaaccesoadatos
§ 
Aplicalalógicadelnegocio
§ 
Añadecapasdepresentaciónalainformación
§ 
Secomunicaconsistemasexternos
•  Actualmente,lasaplicacionesempresarialesmásextendidas
sonlasaplicacionesweb
5
SPRINGYJAVAEE
1. Java Enterprise Edition
EvolucióndeJavaEE
6
SPRINGYJAVAEE
1. Java Enterprise Edition
EvolucióndeJavaEE
•  CaracterísticascomunesJ2EE1.x:
§ 
§ 
Resultóserunatecnologíacomplicadacontiempodedesarrollolargo
PorestarazónaparecierontecnologíascomoSpring,conelobjetivodepermitirundesarrollo
muchomásligero
•  ApartirdeJavaEE5sesimplificóelmodelodedesarrollo:
§ 
Anotacionesenelcódigo(envezdeficherosdeconfiguraciónXML)
§ 
Programaciónconobjetossimples(PlainOldJavaObjects,POJOs)
§ 
Convenciónsobreconfiguración:Loquenoseespecifica,seconsideraquetieneelvalorpor
defecto(quesueleserrazonable)
§ 
JavaEEpuedeserusadadeformacompletaojuntoconelframeworkSpring
§ 
Másinformación:http://docs.oracle.com/javaee/7/tutorial/
7
SPRINGYJAVAEE
1. Java Enterprise Edition
ArquitecturadeJavaEE7
•  JavaEEesunconjuntodeespecificacionesdelibreríasquecualquier
empresaocomunidaddesoftwarelibrepuedenimplementar
•  LasespecificacionesdeJavaEEsedefinenenunaorganización
llamadaJavaCommunityProcess(JCP)creadaen1998
•  CadaespecificaciónsedenominaJavaSpecificationRequests(JSR)
§ 
Porejemplo,JSR317correspondeconJPA2.0
•  ExistenJSRumbrella(paraguas)queagrupandiferentesJSRs
§ 
Porejemplo,elJSR316correspondeconJavaEE6
8
SPRINGYJAVAEE
1. Java Enterprise Edition
ArquitecturadeJavaEE7
• JavaEE7esunaespecificaciónumbrella
(paraguas)definidaporelJSR342quecontiene
38especificaciones,porejemplo:
§ 
JavaServlet3.1(JSR340)
§ 
JavaServerPages2.3(JSR245)
§ 
JavaAPIforJSONProcessing(JSR353)
§ 
JavaPersistenceAPI2.1JPA(JSR338)
§ 
…
9
SPRINGYJAVAEE
1. Java Enterprise Edition
ArquitecturadeJavaEE7
•  ParareducireltamañodeJavaEEsehancreado
losperfiles(profiles)queimplementanun
subconjuntodelaespecificacióncompletaJavaEE
•  ElúnicoperfildefinidoeselWebProfileconlas
especificacionesnecesariasparaeldesarrollode
aplicacionesweb
§ 
JSP,Servlets,JSF,JPA,EJBLite,etc…
10
SPRINGYJAVAEE
1. Java Enterprise Edition
ArquitecturadeJavaEE7
11
SPRINGYJAVAEE
1. Java Enterprise Edition
Servidordeaplicaciones
•  Unservidordeaplicacionesesunframeworkque
proporcionainfraestructuraparaeldespliegue,ejecucióny
gestióndeaplicaciones
•  Típicamenteconsisteenunservidorweb(HTTP)queejecuta
aplicacionesdinámicasenelladoservidor
•  EnelmundoJavatambiénseconocealosservidoresde
aplicacionescomocontenedores(containers)
§ 
ComoJavaEEesunsuperconjuntodeJavaSE,cualquier
aplicaciónJavaEEpuedeusarlaAPIdeJavaSE
12
SPRINGYJAVAEE
1. Java Enterprise Edition
Servidordeaplicaciones
•  ContenedoresJavaEE:cumpleconlaespecificación
JavaEEcompleta(oalmenoselperfilWeb)
Glassfish 4.0
(Java EE 7)
WildFly 8.0
(Java EE 7)
TomEE 1.6
(Java EE 6 Web Profile)
13
SPRINGYJAVAEE
1. Java Enterprise Edition
Servidordeaplicaciones
•  Contenedoresweb:ofrecenlaAPIsdeServletsyJSPs.Selepueden
añadirotraslibreríasJavaEEcomplementarias(exceptoEJB)
Apache Tomcat 8
(Servlets 3.1 y JSPs 2.3)
Eclipse Jetty 9.1
(Servlets 3.1 y JSPs 2.3)
14
SPRINGYJAVAEE
1. Java Enterprise Edition
EmpaquetadodeaplicacionesJavaEE
•  UnaaplicaciónJavaSEseempaquetaenunficheroJAR
(Javaarchive)
§ 
UnJAResunficherocomprimidoquecontieneclasesJava
compilados(bytecodes,ficheros.class)yotrosrecursos
•  UnaaplicaciónwebJavaEEseempaquetaenunfichero
WAR(Webapplicationarchive)
§ 
UnWARestambiénunficherocomprimidoquecontienelos
componentesJavaactivosenelservidor(servlets,etc)yla
aplicaciónweb(HTML,CSS,Java-Scripts,imágenes,etc)
15
SPRINGYJAVAEE
Índice de contenidos
1.  JavaEnterpriseEdition
2.  Maven
§ 
§ 
§ 
§ 
§ 
Introducción
Gestióndedependencias
Gestióndelciclodevida
Ejemplo:creacióndeunproyectoMavendesde
Eclipse
Ejemplo:usodelog4jenunaaplicaciónJava
3.  Spring
16
SPRINGYJAVAEE
2. Maven
Introducción
•  Mavenesunaherramientaquepermitelaautomatizacióndelciclo
devidadeaplicacionesJava
§ 
Compilación,ejecución,pruebas,despliegue,gestióndedependencias…
•  DesarrolladoporlafundaciónApache
•  Softwarelibre(licenciaApache2.0)
•  Versiónactualestable(noviembre2015):3.3.9
•  Otrasherramientassimilares:Ant,Gradle
https://maven.apache.org/
17
SPRINGYJAVAEE
2. Maven
ProyectoMaven
•  Mavensigueelprincipioágilde“convenciónsobreconfiguración”
•  UnproyectoMaventieneunaestructuradecarpetasdeterminada
•  src/main/java:clases
Java
•  src/main/resources:
recursos(≠clasesJava)
•  src/test/java:testsJava
•  src/tets/resources:
recursosparatests
18
SPRINGYJAVAEE
2. Maven
Introducción
•  UnproyectoMavendebeincluirensuraízunficheropom.xml
(projectobjectmodel).Laestructurabásicaescomosigue:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.web</groupId>
<artifactId>examples</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
El groupId,
artifactId y version
forman las coordenadas
del proyecto. Deben
identificar unívocamente
dicho proyecto.
El prefijo -SNAPSHOT en
la versión se suele
emplear para identificar la
versión de desarrollo
19
SPRINGYJAVAEE
2. Maven
Gestióndedependencias
•  Mavenseencargadedescargarladependenciassimplemente
añadiendoladependenciaenlaseccióndependenciesdel
pom.xml
•  Pordefectolasdependenciassedescargandelrepositoriocentralde
Maven:http://search.maven.org/
•  Sedescarganenelrepositoriolocalennuestrosistemaubicadoen
~/.m2/repository
20
SPRINGYJAVAEE
2. Maven
Gestióndedependencias
principales
•  Lasdependenciaspuedentenerlossiguientesámbitos:
§ 
<scope>compile</scope>:Dependenciavisibleparatodoslasclasesdelproyecto
(dentrodemainydetest).Opciónpordefecto(noesnecesarioponerlaexplícitamente)
§ 
<scope>test</scope>:Dependenciavisiblesóloparalostests(dentrodecarpeta
test)
§ 
<scope>provided</scope>:Dependencianecesariaentiempodecompilaciónpero
noenruntime
§ 
<scope>runtime</scope>:Dependencianonecesariaentiempodecompilación
perosíenruntime
§ 
<scope>system</scope>:LadependenciaestafueradelrepositoriolocalMaven(en
larutaindicadapor<systemPath>/path-to/lib.jar</systemPath>)
21
SPRINGYJAVAEE
2. Maven
Gestióndedependencias
•  LasdependenciasMavenmásusadasenproyectosJavadeGitHubson:
http://blog.takipi.com/githubs-10000-most-popular-java-projects-here-are-the-top-libraries-they-use/
22
SPRINGYJAVAEE
2. Maven
Gestióndelciclodevida
•  Mavensepuedeusardesdelaconsoladecomandosobienintegradoenun
entornodedesarrollo(porejemploEclipse)
•  LasprincipalesfasesdelciclodevidamanejadasporMavenson:
§ 
mvn compile:CompilaelcódigofuenteJava
§ 
mvn test:Ejecutalaspruebasunitarias
§ 
mvn package:Empaquetalosbinarios(JAR,WAR)
§ 
mvn install:Instalaelbinarioempaquetadoenelrepositoriolocal
•  Mavengeneralosartefactosenlacarpetatargetenlaraízdelproyecto.
Paraborraresosartefactosusamoselcomandomvn clean
23
SPRINGYJAVAEE
2. Maven
Arquetipos
•  UnarquetipoesunaplantillaparaundeterminadotipodeproyectoMaven
•  Ejemplodeproyectonuevocreadoconelarquetipomaven-archetypewebapp
24
SPRINGYJAVAEE
2. Maven
Ejemplo:creacióndeunproyectoMavendesdeEclipse
•  FileàNewàOther
25
SPRINGYJAVAEE
2. Maven
Ejemplo:creacióndeunproyectoMavendesdeEclipse
Con arquetipo
Sin arquetipo
26
SPRINGYJAVAEE
2. Maven
Ejemplo:usodelog4jenunaaplicaciónJava
•  Estructuradelproyecto:
•  pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.web</groupId>
<artifactId>examples</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
27
SPRINGYJAVAEE
2. Maven
•  LogExample.java:
import org.apache.log4j.Logger;
public class LogExample
{
public static final Logger logger = Logger.getLogger(LogExample.class);
}
public static void main( String[] args ) {
logger.info( "¡Hola mundo!" );
}
•  log4j.properties:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
28
SPRINGYJAVAEE
Índice de contenidos
1.  JavaEnterpriseEdition
2.  Maven
3.  Spring
§ 
§ 
§ 
§ 
§ 
Introducción
SpringvsJavaEE
Inyeccióndedependencias
ArquitecturadeunaaplicaciónwebSpring
SpringBoot
29
SPRINGYJAVAEE
3. Spring
Introducción
•  Springesunframeworkdedesarrollodeaplicacionesempresariales
basadoentecnologíasJava
•  ElobjetivofundamentaldeSpringessimplificareldesarrolloJava
§ 
LaprimeraversiónfueescritaporRodJohnsonydescritaensulibro
ExpertOne-on-OneJ2EEDesignandDevelopment(octubre2002)
•  Opensource(licenciaApache2.0)
•  Versiónestable(octubre2015):4.2.2
http://spring.io/
30
SPRINGYJAVAEE
3. Spring
Introducción
•  Springtieneunaestructuramodular
•  AlgunosdelosproyectosSpringmássignificativosson:
•  Núcleo de Spring
•  Proporciona
inyección de
dependencias
•  Incluye Spring MVC
•  Simplifica el
despliegue de
aplicaciones
•  Convención sobre
configuración
Spring
Framework
Spring Boot
•  Proporciona acceso
a bases de datos
•  Relacionales o no
relacionales
•  Soporte para
autenticación y
autorización
Spring
Data
Spring
Security
•  Haytodavíamás:https://spring.io/projects
31
SPRINGYJAVAEE
3. Spring
SpringvsJavaEE
•  JavaEEesunconjuntodelibreríasestándarenJava
•  Springesunframeworksoftwarelibrequeseapoyaen
algunosestándaresJavaEE
•  HaydesarrolladoresquesólousanJavaEEyotrosque
combinanSpringyJavaEEensusaplicaciones
32
SPRINGYJAVAEE
3. Spring
SpringvsJavaEE
•  EsquematípicodeunaaplicaciónJavaEE:
Aplicaciónweb
ContenedorJavaEE
JavaSE
Para implementar la aplicación web se pueden usar librerías de Java SE
y las librerías de Java EE proporcionadas por el servidor de aplicaciones
33
SPRINGYJAVAEE
3. Spring
SpringvsJavaEE
•  EsquematípicodeunaaplicaciónSpring:
Aplicaciónweb
Spring
Contenedorweb
JavaSE
Para implementar la aplicación web se pueden usar librerías de Java SE,
las librerías proporcionadas por el contenedor web y el framework Spring
34
SPRINGYJAVAEE
3. Spring
Inyeccióndedependencias
•  AloscomponentesdelaaplicaciónSpringselosdenominabeans
•  Springdisponedeunsistemadeinyeccióndedependenciasparabeans
§ 
Creaunobjetoporcadamódulodefinido
§ 
Inyectalasdependenciasenlosmódulosquedependendeél
•  EnlasversionesinicialesdeSpring,losbeanssedefiníanenXML
•  EnSpring2.5seintrodujolaanotación@Componentquepermitedefinir
uncomponentequeesautomáticamentedescubiertoporSpring
•  Siuncomponentedependeotro,defineesecomponentecomounatributo
anotadocon@Autowired
35
SPRINGYJAVAEE
3. Spring
Inyeccióndedependencias
•  Ejemplo:
GreetingController
@Component
public class UsersService {
public int getNumUsers() {
return 5;
}
UsersService
}
@Controller
public class GreetingController {
@Autowired
private UsersService usersService;
@RequestMapping("/greeting")
public ModelAndView greeting() {
return new ModelAndView("greeting_template")
.addObject("name", usersService.getNumUsers() + " users");
}
}
36
SPRINGYJAVAEE
3. Spring
Inyeccióndedependencias
•  Enalgunasocasionesesnecesarioconfigurarloscomponentesdela
aplicación
•  Paraello,enlaclasedelaaplicaciónsepuedecrearelcomponente
manualmentepasandocualquierconfiguracióncomoparámetroen
elconstructoroinvocandolosmétodosdelobjeto
•  Sedefineunmétodoanotadocon@Beanquecreaelcomponente
37
SPRINGYJAVAEE
3. Spring
Inyeccióndedependencias
•  Ejemplo:
Lacreaciónmanual
delcomponente
permiteconfigurarlo
@SpringBootApplication
public class Application {
@Component
public class UsersService {
@Bean
public UsersService usersService(){
return new UsersService(10);
}
private int numUsers;
public UsersService(int numUsers){
this.numUsers = numUsers;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
public int getNumUsers(){
return numUsers;
}
}
}
38
SPRINGYJAVAEE
3. Spring
ArquitecturadeunaaplicaciónwebSpring
Controlador
Usuarios
Servicio
Usuarios
Controlador
Pedidos
Servicio
Pedidos
Controlador
Productos
Servicio
Productos
Controladores
(Interfaz)
Servicios
(Lógica de negocio)
Repositorio
Usuarios
Sistema envío
de correos
Repositorio
Pedidos
Módulo de
Integración
con otros
sistemas
Repositorio
Productos
Repositorios
(Persistencia)
Módulos de
Integración
39
SPRINGYJAVAEE
3. Spring
ArquitecturadeunaaplicaciónwebSpring
•  Lamayoríadelasaplicacioneswebutilizanbasesdedatos
paraguardarsuinformación
•  Todasesasaplicacionestienenunaarquitecturasimilarque
facilitasudesarrolloymantenimiento
•  Losserviciosylosmódulosdeintegraciónsuelenestar
anotadoscon@Serviceparaindicarsunaturaleza
•  @Serviceessimilara@Component(sepuedeninyectar
enotroscomponentes)
40
SPRINGYJAVAEE
3. Spring
SpringBoot
•  Esunabibliotecaquefacilitaeldesarrollodeaplicaciones
conSpring
•  PermiteusarelservidordeaplicacioneswebTomcat
empotradoenlaaplicación
•  Simplificalaconfiguraciónyaceleraeldesarrollo
•  Esunalibreríabastantereciente,antesseimplementaban
lasaplicacionesusandodirectamenteSpring
41
SPRINGYJAVAEE
3. Spring
SpringBoot
•  EsquematípicodeunaaplicaciónSpringBoot:
Aplicaciónweb
SpringBoot
Spring
Contenedorweb
JavaSE
Para implementar la aplicación web se pueden usar librerías de Java SE,
las librerías proporcionadas por el contenedor web y el framework Spring
y Spring Boot
42
SPRINGYJAVAEE
3. Spring
SpringBoot
•  PodemoscrearaplicacionesSpringBootdeformasencillaconlaaplicación
webhttps://start.spring.io/
•  VamosaverunodelosejemplosmássimplesdeaplicaciónSpringBoot
(HelloWorld)
43
SPRINGYJAVAEE
3. Spring
pom.xml
SpringBoot
•  HelloWorld:
Proyectopadredel
queseheredala
configuración
Java8
Tipodeproyecto
Springqueestás
desarrollando
Plugindespringboot(sirvepara
empaquetarla
aplicación)
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.web</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.7.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
44
SPRINGYJAVAEE
3. Spring
SpringBoot
•  HelloWorld:
DemoApplication.java
packageio.github.web;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
publicclassDemoApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(DemoApplication.class,args);
}
}
index.html
<!DOCTYPEhtml>
<html>
<head>
<title>Springboot-helloworld</title>
</head>
<body>Helloworld!
</body>
</html>
45
SPRINGYJAVAEE
3. Spring
SpringBoot
•  HelloWorld:
logback.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>
<includeresource="org/springframework/boot/logging/logback/base.xml"/>
<loggername="org.springframework.web"level="INFO"/>
</configuration>
application.properties
server.port=8080
46
SPRINGYJAVAEE
3. Spring
SpringBoot
•  ExtendiendoelHelloWorld:
§ 
Añadimoslog4jcomodependenciaenpom.xml
§ 
CreamosunControllerqueaceptapeticionesconparámetros
DemoApplication.java
packageio.github.web;
import
import
import
import
import
java.util.Arrays;
org.apache.log4j.Logger;
org.springframework.boot.SpringApplication;
org.springframework.boot.autoconfigure.SpringBootApplication;
org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static final Logger logger = Logger.getLogger(DemoApplication.class);
}
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
String[] beans = ctx.getBeanDefinitionNames();
Arrays.sort(beans);
for (String b : beans)
logger.info("Bean: "+b);
}
47
SPRINGYJAVAEE
3. Spring
SpringBoot
•  ExtendiendoelHelloWorld:
HelloController.java
packageio.github.web;
import
import
import
import
org.apache.log4j.Logger;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestParam;
org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
public static final Logger logger = Logger.getLogger(HelloController.class);
}
@RequestMapping("/hello")
String hello(@RequestParam String name) {
logger.info("Recibida solicitud con parámetro name="+name);
return "Hello "+name+"!";
}
48