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