DISEÑO DE APLICACIONES WEB Bloque 3: Parte servidora …

Post on 05-Jul-2022

4 views 0 download

Transcript of DISEÑO DE APLICACIONES WEB Bloque 3: Parte servidora …

Bloque 3: Parte servidora (backend)

DISEÑODEAPLICACIONESWEB

JesúsMontesjmontes@fi.upm.es

TEMA3.1:SPRINGYJAVAEE

Disclaimer

• Estematerialestábasadoenunmaterialoriginalde:§  BoniGarcía(boni.garcia@urjc.es)

SPRINGYJAVAEE

2

Índice de contenidos

1.  JavaEnterpriseEdition2. Maven3.  Spring

SPRINGYJAVAEE

3

Índice de contenidos

1.  JavaEnterpriseEdition§  Introducción

§  EvolucióndeJavaEE

§  ArquitecturadeJavaEE7

§  Servidordeaplicaciones

§  EmpaquetadodeaplicacionesJavaEE2.  Maven3.  Spring

SPRINGYJAVAEE

4

1. Java Enterprise Edition

Introducción•  JavaEnterpriseEditionaparecióafinalesdelos90paraeldesarrollodeaplicacionesempresariales

§  Necesitaaccesoadatos

§  Aplicalalógicadelnegocio

§  Añadecapasdepresentaciónalainformación

§  Secomunicaconsistemasexternos

•  Actualmente,lasaplicacionesempresarialesmásextendidassonlasaplicacionesweb

SPRINGYJAVAEE

5

1. Java Enterprise Edition

EvolucióndeJavaEE

SPRINGYJAVAEE

6

1. Java Enterprise Edition

EvolucióndeJavaEE

•  CaracterísticascomunesJ2EE1.x:

§  Resultóserunatecnologíacomplicadacontiempodedesarrollolargo

§  PorestarazónaparecierontecnologíascomoSpring,conelobjetivodepermitirundesarrollomuchomásligero

•  ApartirdeJavaEE5sesimplificóelmodelodedesarrollo:

§  Anotacionesenelcódigo(envezdeficherosdeconfiguraciónXML)

§  Programaciónconobjetossimples(PlainOldJavaObjects,POJOs)

§  Convenciónsobreconfiguración:Loquenoseespecifica,seconsideraquetieneelvalorpordefecto(quesueleserrazonable)

§  JavaEEpuedeserusadadeformacompletaojuntoconelframeworkSpring

§  Másinformación:http://docs.oracle.com/javaee/7/tutorial/

SPRINGYJAVAEE

7

1. Java Enterprise Edition

ArquitecturadeJavaEE7•  JavaEEesunconjuntodeespecificacionesdelibreríasquecualquierempresaocomunidaddesoftwarelibrepuedenimplementar

•  LasespecificacionesdeJavaEEsedefinenenunaorganizaciónllamadaJavaCommunityProcess(JCP)creadaen1998

•  CadaespecificaciónsedenominaJavaSpecificationRequests(JSR)

§  Porejemplo,JSR317correspondeconJPA2.0

•  ExistenJSRumbrella(paraguas)queagrupandiferentesJSRs

§  Porejemplo,elJSR316correspondeconJavaEE6

SPRINGYJAVAEE

8

1. Java Enterprise Edition

ArquitecturadeJavaEE7• JavaEE7esunaespecificaciónumbrella(paraguas)definidaporelJSR342quecontiene38especificaciones,porejemplo:§  JavaServlet3.1(JSR340)

§  JavaServerPages2.3(JSR245)

§  JavaAPIforJSONProcessing(JSR353)

§  JavaPersistenceAPI2.1JPA(JSR338)

§  …

SPRINGYJAVAEE

9

1. Java Enterprise Edition

ArquitecturadeJavaEE7• ParareducireltamañodeJavaEEsehancreadolosperfiles(profiles)queimplementanunsubconjuntodelaespecificacióncompletaJavaEE

• ElúnicoperfildefinidoeselWebProfileconlasespecificacionesnecesariasparaeldesarrollodeaplicacionesweb§  JSP,Servlets,JSF,JPA,EJBLite,etc…

SPRINGYJAVAEE

10

1. Java Enterprise Edition

ArquitecturadeJavaEE7

SPRINGYJAVAEE

11

1. Java Enterprise Edition

Servidordeaplicaciones•  Unservidordeaplicacionesesunframeworkqueproporcionainfraestructuraparaeldespliegue,ejecuciónygestióndeaplicaciones

•  Típicamenteconsisteenunservidorweb(HTTP)queejecutaaplicacionesdinámicasenelladoservidor

•  EnelmundoJavatambiénseconocealosservidoresdeaplicacionescomocontenedores(containers)

§  ComoJavaEEesunsuperconjuntodeJavaSE,cualquieraplicaciónJavaEEpuedeusarlaAPIdeJavaSE

SPRINGYJAVAEE

12

1. Java Enterprise Edition

Servidordeaplicaciones•  ContenedoresJavaEE:cumpleconlaespecificaciónJavaEEcompleta(oalmenoselperfilWeb)

SPRINGYJAVAEE

13

Glassfish 4.0 (Java EE 7)

WildFly 8.0 (Java EE 7)

TomEE 1.6 (Java EE 6 Web Profile)

1. Java Enterprise Edition

Servidordeaplicaciones•  Contenedoresweb:ofrecenlaAPIsdeServletsyJSPs.SelepuedenañadirotraslibreríasJavaEEcomplementarias(exceptoEJB)

SPRINGYJAVAEE

14

Apache Tomcat 8 (Servlets 3.1 y JSPs 2.3)

Eclipse Jetty 9.1 (Servlets 3.1 y JSPs 2.3)

1. Java Enterprise Edition

EmpaquetadodeaplicacionesJavaEE•  UnaaplicaciónJavaSEseempaquetaenunficheroJAR(Javaarchive)

§  UnJAResunficherocomprimidoquecontieneclasesJavacompilados(bytecodes,ficheros.class)yotrosrecursos

•  UnaaplicaciónwebJavaEEseempaquetaenunficheroWAR(Webapplicationarchive)

§  UnWARestambiénunficherocomprimidoquecontieneloscomponentesJavaactivosenelservidor(servlets,etc)ylaaplicaciónweb(HTML,CSS,Java-Scripts,imágenes,etc)

SPRINGYJAVAEE

15

Índice de contenidos

1.  JavaEnterpriseEdition2. Maven

§  Introducción

§  Gestióndedependencias

§  Gestióndelciclodevida

§  Ejemplo:creacióndeunproyectoMavendesdeEclipse

§  Ejemplo:usodelog4jenunaaplicaciónJava3.  Spring

SPRINGYJAVAEE

16

2. Maven

Introducción•  MavenesunaherramientaquepermitelaautomatizacióndelciclodevidadeaplicacionesJava

§  Compilación,ejecución,pruebas,despliegue,gestióndedependencias…

•  DesarrolladoporlafundaciónApache•  Softwarelibre(licenciaApache2.0)

•  Versiónactualestable(noviembre2015):3.3.9

•  Otrasherramientassimilares:Ant,Gradle

SPRINGYJAVAEE

17

https://maven.apache.org/

2. Maven

ProyectoMaven•  Mavensigueelprincipioágilde“convenciónsobreconfiguración”

•  UnproyectoMaventieneunaestructuradecarpetasdeterminada

SPRINGYJAVAEE

18

•  src/main/java:clasesJava

•  src/main/resources:recursos(≠clasesJava)

•  src/test/java:testsJava

•  src/tets/resources:recursosparatests

2. Maven

Introducción•  UnproyectoMavendebeincluirensuraízunficheropom.xml (projectobjectmodel).Laestructurabásicaescomosigue:

SPRINGYJAVAEE

19

<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

2. Maven

Gestióndedependencias•  Mavenseencargadedescargarladependenciassimplementeañadiendoladependenciaenlaseccióndependenciesdelpom.xml

•  PordefectolasdependenciassedescargandelrepositoriocentraldeMaven:http://search.maven.org/

•  Sedescarganenelrepositoriolocalennuestrosistemaubicadoen~/.m2/repository

SPRINGYJAVAEE

20

2. Maven

Gestióndedependencias

•  Lasdependenciaspuedentenerlossiguientesámbitos:

§  <scope>compile</scope>:Dependenciavisibleparatodoslasclasesdelproyecto(dentrodemainydetest).Opciónpordefecto(noesnecesarioponerlaexplícitamente)

§  <scope>test</scope>:Dependenciavisiblesóloparalostests(dentrodecarpetatest)

§  <scope>provided</scope>:Dependencianecesariaentiempodecompilaciónperonoenruntime

§  <scope>runtime</scope>:Dependencianonecesariaentiempodecompilaciónperosíenruntime

§  <scope>system</scope>:LadependenciaestafueradelrepositoriolocalMaven(enlarutaindicadapor<systemPath>/path-to/lib.jar</systemPath>)

SPRINGYJAVAEE

21

prin

cipa

les

2. Maven

Gestióndedependencias

•  LasdependenciasMavenmásusadasenproyectosJavadeGitHubson:

SPRINGYJAVAEE

22

http://blog.takipi.com/githubs-10000-most-popular-java-projects-here-are-the-top-libraries-they-use/

2. Maven

Gestióndelciclodevida

•  Mavensepuedeusardesdelaconsoladecomandosobienintegradoenunentornodedesarrollo(porejemploEclipse)

•  LasprincipalesfasesdelciclodevidamanejadasporMavenson:

§  mvn compile:CompilaelcódigofuenteJava

§  mvn test:Ejecutalaspruebasunitarias

§  mvn package:Empaquetalosbinarios(JAR,WAR)

§  mvn install:Instalaelbinarioempaquetadoenelrepositoriolocal

•  Mavengeneralosartefactosenlacarpetatargetenlaraízdelproyecto.Paraborraresosartefactosusamoselcomandomvn clean

SPRINGYJAVAEE

23

2. Maven

Arquetipos

•  UnarquetipoesunaplantillaparaundeterminadotipodeproyectoMaven

•  Ejemplodeproyectonuevocreadoconelarquetipomaven-archetype-webapp

SPRINGYJAVAEE

24

2. Maven SPRINGYJAVAEE

25

Ejemplo:creacióndeunproyectoMavendesdeEclipse•  FileàNewàOther

2. Maven SPRINGYJAVAEE

26

Ejemplo:creacióndeunproyectoMavendesdeEclipse

Con arquetipo Sin arquetipo

2. Maven

Ejemplo:usodelog4jenunaaplicaciónJava

SPRINGYJAVAEE

27

•  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>

2. Maven

28

SPRINGYJAVAEE

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!" ); }}

•  LogExample.java:

log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

•  log4j.properties:

Índice de contenidos

1.  JavaEnterpriseEdition2.  Maven

3.  Spring§  Introducción

§  SpringvsJavaEE

§  Inyeccióndedependencias

§  ArquitecturadeunaaplicaciónwebSpring

§  SpringBoot

SPRINGYJAVAEE

29

3. Spring

Introducción•  SpringesunframeworkdedesarrollodeaplicacionesempresarialesbasadoentecnologíasJava

•  ElobjetivofundamentaldeSpringessimplificareldesarrolloJava§  LaprimeraversiónfueescritaporRodJohnsonydescritaensulibro

ExpertOne-on-OneJ2EEDesignandDevelopment(octubre2002)

•  Opensource(licenciaApache2.0)

•  Versiónestable(octubre2015):4.2.2

SPRINGYJAVAEE

30

http://spring.io/

3. Spring

Introducción•  Springtieneunaestructuramodular

•  AlgunosdelosproyectosSpringmássignificativosson:

•  Haytodavíamás:https://spring.io/projects

SPRINGYJAVAEE

31

• Núcleo de Spring • Proporciona

inyección de dependencias

•  Incluye Spring MVC

Spring Framework

• Simplifica el despliegue de aplicaciones

• Convención sobre configuración

Spring Boot

• Proporciona acceso a bases de datos

• Relacionales o no relacionales

Spring Data

• Soporte para autenticación y autorización

Spring Security

3. Spring

SpringvsJavaEE

•  JavaEEesunconjuntodelibreríasestándarenJava•  SpringesunframeworksoftwarelibrequeseapoyaenalgunosestándaresJavaEE

•  HaydesarrolladoresquesólousanJavaEEyotrosquecombinanSpringyJavaEEensusaplicaciones

SPRINGYJAVAEE

32

3. Spring

SpringvsJavaEE•  EsquematípicodeunaaplicaciónJavaEE:

SPRINGYJAVAEE

33

JavaSE

ContenedorJavaEE

Aplicaciónweb

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

3. Spring

SpringvsJavaEE•  EsquematípicodeunaaplicaciónSpring:

SPRINGYJAVAEE

34

JavaSE

Contenedorweb

Aplicaciónweb

Spring

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

3. Spring

Inyeccióndedependencias

•  AloscomponentesdelaaplicaciónSpringselosdenominabeans

•  Springdisponedeunsistemadeinyeccióndedependenciasparabeans

§  Creaunobjetoporcadamódulodefinido

§  Inyectalasdependenciasenlosmódulosquedependendeél

•  EnlasversionesinicialesdeSpring,losbeanssedefiníanenXML

•  EnSpring2.5seintrodujolaanotación@ComponentquepermitedefiniruncomponentequeesautomáticamentedescubiertoporSpring

•  Siuncomponentedependeotro,defineesecomponentecomounatributoanotadocon@Autowired

SPRINGYJAVAEE

35

3. Spring

Inyeccióndedependencias•  Ejemplo:

SPRINGYJAVAEE

36

@Component public class UsersService { public int getNumUsers() { return 5; } }

@Controller public class GreetingController { @Autowired private UsersService usersService; @RequestMapping("/greeting") public ModelAndView greeting() { return new ModelAndView("greeting_template") .addObject("name", usersService.getNumUsers() + " users"); } }

GreetingController UsersService

3. Spring

Inyeccióndedependencias•  Enalgunasocasionesesnecesarioconfigurarloscomponentesdelaaplicación

•  Paraello,enlaclasedelaaplicaciónsepuedecrearelcomponentemanualmentepasandocualquierconfiguracióncomoparámetroenelconstructoroinvocandolosmétodosdelobjeto

•  Sedefineunmétodoanotadocon@Beanquecreaelcomponente

SPRINGYJAVAEE

37

3. Spring

Inyeccióndedependencias•  Ejemplo:

SPRINGYJAVAEE

38

@Component public class UsersService { private int numUsers; public UsersService(int numUsers){ this.numUsers = numUsers; } public int getNumUsers(){ return numUsers; } }

@SpringBootApplication public class Application { @Bean public UsersService usersService(){ return new UsersService(10); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

Lacreaciónmanualdelcomponente

permiteconfigurarlo

3. Spring

ArquitecturadeunaaplicaciónwebSpring

SPRINGYJAVAEE

39

Controlador Usuarios

Sistema envío de correos

Servicio Usuarios

Repositorio Usuarios

Controlador Productos

Controlador Pedidos

Servicio Productos

Servicio Pedidos

Módulo de Integración con otros sistemas

Repositorio Productos

Repositorio Pedidos

Controladores (Interfaz)

Servicios (Lógica de negocio)

Repositorios (Persistencia)

Módulos de Integración

3. Spring

ArquitecturadeunaaplicaciónwebSpring•  Lamayoríadelasaplicacioneswebutilizanbasesdedatosparaguardarsuinformación

•  Todasesasaplicacionestienenunaarquitecturasimilarquefacilitasudesarrolloymantenimiento

•  Losserviciosylosmódulosdeintegraciónsuelenestaranotadoscon@Serviceparaindicarsunaturaleza

•  @Serviceessimilara@Component(sepuedeninyectarenotroscomponentes)

SPRINGYJAVAEE

40

3. Spring

SpringBoot•  EsunabibliotecaquefacilitaeldesarrollodeaplicacionesconSpring

•  PermiteusarelservidordeaplicacioneswebTomcatempotradoenlaaplicación

•  Simplificalaconfiguraciónyaceleraeldesarrollo•  Esunalibreríabastantereciente,antesseimplementabanlasaplicacionesusandodirectamenteSpring

SPRINGYJAVAEE

41

3. Spring

SpringBoot•  EsquematípicodeunaaplicaciónSpringBoot:

SPRINGYJAVAEE

42

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

JavaSE

Contenedorweb

Spring

SpringBoot

Aplicaciónweb

3. Spring

SpringBoot•  PodemoscrearaplicacionesSpringBootdeformasencillaconlaaplicación

webhttps://start.spring.io/

•  VamosaverunodelosejemplosmássimplesdeaplicaciónSpringBoot(HelloWorld)

SPRINGYJAVAEE

4343

3. Spring SPRINGYJAVAEE

4444

<?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>

pom.xml

Proyectopadredelqueseheredalaconfiguración

TipodeproyectoSpringqueestásdesarrollando

Java8

Plugindespring-boot(sirveparaempaquetarlaaplicación)

SpringBoot•  HelloWorld:

3. Spring SPRINGYJAVAEE

4545

packageio.github.web;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}

DemoApplication.java SpringBoot•  HelloWorld:

<!DOCTYPEhtml><html><head><title>Springboot-helloworld</title></head><body>Helloworld!</body></html>

index.html

3. Spring SPRINGYJAVAEE

4646

<?xmlversion="1.0"encoding="UTF-8"?><configuration><includeresource="org/springframework/boot/logging/logback/base.xml"/><loggername="org.springframework.web"level="INFO"/></configuration>

logback.xml

SpringBoot•  HelloWorld:

server.port=8080

application.properties

3. Spring SPRINGYJAVAEE

4747

SpringBoot•  ExtendiendoelHelloWorld:

§  Añadimoslog4jcomodependenciaenpom.xml

§  CreamosunControllerqueaceptapeticionesconparámetros

packageio.github.web;

import java.util.Arrays;import org.apache.log4j.Logger;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;

@SpringBootApplicationpublic 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); }}

DemoApplication.java

3. Spring SPRINGYJAVAEE

4848

SpringBoot•  ExtendiendoelHelloWorld:

packageio.github.web;

import org.apache.log4j.Logger;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;

@RestControllerpublic 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+"!";

}}

HelloController.java