diseÑo de aplicaciones web bloque 3: parte servidora …
TRANSCRIPT
Bloque 3: Parte servidora (backend)
DISEÑODEAPLICACIONESWEB
TEMA3.1:SPRINGYJAVAEE
Disclaimer
• Estematerialestábasadoenunmaterialoriginalde:§ BoniGarcía([email protected])
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