DISEÑODEAPLICACIONESWEB Bloque 3: Parte servidora (backend) TEMA3.2:APLICACIONESWEBCONSPRING MVCYTHYMELEAF JesúsMontes jmontes@fi.upm.es APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Disclaimer • Estematerialestábasadoenunmaterial originalde: § BoniGarcía([email protected]) 2 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC 2. Thymeleaf 3. Envíodeinformaciónalservidor 4. Gestióndedatosdesesión 5. Soportedeinternacionalización(I18N) 3 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC § § § § Introducción Controladores Vistas Ejemplo 2. Thymeleaf 3. Envíodeinformaciónalservidor 4. Gestióndedatosdesesión 5. Soportedeinternacionalización(I18N) 4 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Introducción • Elmodelovistacontrolador(MVC)separalosdatosylalógicadenegociodeuna aplicacióndelainterfazdeusuario. • ElesquemadelpatrónMVCenSpringes: Controlador Petición URL desde el Navegador GreetingController.java Vista (Plantilla) Página HTML Modelo greeting_template.html http://spring.io/guides/gs/serving-web-content/ 5 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Controladores • Loscontroladores(Controllers)sonclasesJavaencargadas deatenderlaspeticionesweb. • Procesanlosdatosquelleganenlapetición(parámetros). • Hacenpeticionesalabasededatos,usandiversosservicios, etc… • Definenlainformaciónqueserávisualizadaenlapáginaweb (elmodelo). • Determinanquevistaserálaencargadadegenerarlapágina HTML. 6 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Vistas • LasvistasenSpringMVCseimplementancomo plantillasHTML. • GeneranHTMLpartiendodeunaplantillayla informaciónquevienedelcontrolador(modelo). • Existendiversastecnologíasdeplantillasquese puedenusarconSpringMVC:JSP,Thymeleaf, FreeMarker,etc… • NosotrosusaremosThymeleaf. 7 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Ejemplo • EstructuradelaaplicaciónvistadesdeEclipse: 8 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC pom.xml Ejemplo Proyectopadredel queseheredala configuración (SpringBoot) Java8 Tipodeproyecto SpringBoot <?xml version="1.0" encoding="UTF-8"?> <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>spring-mvc-hello-world</artifactId> <version>1.0.0</version> <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-thymeleaf</artifactId> </dependency> </dependencies> </project> 9 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Ejemplo GreetingController.java package io.github.web.springmvc; SeindicalaURLcon laqueseejecutan import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class GreetingController { @RequestMapping("/greeting") public ModelAndView greeting() { return new ModelAndView("greeting_template").addObject("name", "World"); } } Seindicaelnombredela plantillaquegenerarála páginaHTML Seincluyela informaciónenel modelo 10 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Ejemplo • Vistas(implementadoconThymeleaf) greeting_template.html <html xmlns:th="http://www.thymeleaf.org"> <body> <p>Hello <span th:text="${name}">Friend</span>!</p> </body> </html> Seaccedealosobjetosqueel controladorhapuestoenel modelo Elvalordelobjetoname sustituiráalapalabraFriend cuandosegenereelHTML 11 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 1. Spring MVC Ejemplo • LaaplicaciónseejecutacomounaappJavanormal • EnEclipse:botónderechoproyecto>Runas…>JavaApplication… SpringMvcHelloWorldApp.java @SpringBootApplication public class SpringMvcHelloWorldApp extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(SpringMvcHelloWorldApp.class, args); } } 12 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC 2. Thymeleaf § § § § § Introducción Ejemplo Manejandotexto Condicionales Iteraciones 3. Envíodeinformaciónalservidor 4. Gestióndedatosdesesión 5. Soportedeinternacionalización(I18N) 13 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Introducción • SpringMVCseapoyaenalgunatecnologíadeplantillaspara lageneracióndepáginasHTML: http://freemarker.org/ http://www.thymeleaf.org/ http://www.oracle.com/technetwork/java/javaee/jsp/ http://velocity.apache.org/ 14 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Introducción • Todasestastecnologíassonconceptualmentesimilares. § § LosficherosHTMLsegenerarconplantillasquecontienencódigoHTMLjunto conreferenciasavariablesyfunciones. EjemploimplementadoconFreeMarker: <html> <body> <p>Hello ${name}!</p> </body> </html> • Thymeleafsediferenciadelasdemásenquelasplantillassonficheros HTMLválidosquepuedenverseenunnavegadorsinnecesidaddeservidor web(naturaltemplating). • Estacaracterísticaesidealparalaseparaciónderoles:diseñadoresy desarrolladores. 15 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Introducción • LatecnologíadeplantillasJSP(JavaServerPage)eslamásextendida • AmbaspuedenserusadasenconjunciónconSpringMVC • ThymeleafpermiterealizarlamaquetaciónHTMLsinnecesidaddeque intervengaelservidor • Másinformación:http://www.thymeleaf.org/doc/articles/thvsjsp.html 16 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Introducción • ThymeleafestátotalmenteIntegradoconSpring(MVC,Security) • Soportadostipodelenguajesdeexpresiones(EL,ExpressionLanguage) paraelaccesoaobjetosJava: § OGNL(Object-GraphNavigationLanguage): ${myObject.property} ${myObject.method()} § SpringEL(SpringExpressionLanguage) ${@myBean.method()} • Tutorial:http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html 17 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Introducción • LasintaxisdelasplantillasThymeleafsedefineenlas páginasHTMLmediantelaetiquetath • Losnavegadoresignoraránelespaciodenombrequeno entienden(th)conloquelapáginaseguirásiendoválida <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <p>Hello <span th:text="${name}"></span></p> </body> </html> El atributo xmlns define el espacio de nombres (XML Namespace) para th. Un espacio de nombres permite definir nombres de elementos y atributos únicos en un documento XML (o HTML) 18 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Ejemplo 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.bonigarcia.web</groupId> <artifactId>ThymeLeafDemo</artifactId> <version>1.0.0</version> <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-thymeleaf</artifactId> </dependency> </dependencies> </project> 19 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Ejemplo SpringMvcThymeleafApp.java package io.github.web.thymeleaf; import org.springframework.boot.*; import org.springframework.web.servlet.config.annotation.*; @SpringBootApplication public class SpringMvcThymeleafApp extends WebMvcConfigurerAdapter { MyObject.java public static void main(String[] args) { SpringApplication.run(SpringMvcThymeleafApp.class, args); } package io.github.web.thymeleaf; public class MyObject { } private String name; private String description; public MyObject(String name, String description) { this.name = name; this.description = description; } public String sayHello() { return "Hello!!!"; } // Getters and setters } 20 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Manejandotexto • Paramostrartextoenlaplantillausamoslaetiquetath:text TextController.java package io.github.web.thymeleaf; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; text_page.html @Controller public class TextController { @RequestMapping("/text") public ModelAndView text() { MyObject myObject = new MyObject("my name", "my description"); return new ModelAndView("text_page").addObject("greetings", "Hello world!").addObject("myobj", myObject); } } <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="${greetings}"></p> <p th:text="${myobj.name}"></p> <p th:text="${myobj.sayHello()}"></p> <p th:text="|I say: ${myobj.description}!|"></p> </body> </html> 21 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Condicionales • Etiquetath:if TextController.java package io.github.web.thymeleaf; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class TextController { @RequestMapping("/text") public ModelAndView text() { MyObject myObject = new MyObject("my name", "my description"); return new ModelAndView("text_page") .addObject("greetings", "Hello world!") .addObject("myobj", myObject).addObject("hidden", false); } text_page.html } <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="${greetings}"></p> <p th:text="${myobj.name}"></p> <p th:text="${myobj.sayHello()}"></p> <p th:text="|I say: ${myobj.description}!|"></p> <p th:if="${not hidden}">This is visible!</p> </body> </html> 22 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 2. Thymeleaf Iteraciones • Etiquetath:each TextController.java iteration_template.html @RequestMapping("/iteration") public ModelAndView iteration() { List<String> colors = Arrays.asList("Red", "Blue", "Green"); return new ModelAndView("iteration_template").addObject("colors", colors); } <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <p>Colors in list:</p> <ul> <li th:each="color : ${colors}" th:text="${color}">Color</li> </ul> <p>Colors in table:</p> <table border="1"> <tr th:each="color, it : ${colors}"> <td th:text="${it.index}">1</td> <td th:text="${color}">Color</td> </tr> </table> </body> </html> Se puede declarar una variable adicional para guardar información de la iteración 23 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC 2. Thymeleaf 3. Envíodeinformaciónalservidor § § § Envíomedianteformulario EnvíomedianteURL URLsenThymeleaf 4. Gestióndedatosdesesión 5. Soportedeinternacionalización(I18N) 24 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor • Formascomunesdeenviarinformacióndelnavegadoral servidor: § § MedianteformulariosHTML:Lainformaciónlaintroduce manualmenteelusuario. InsertandoinformaciónenlaURLenenlaces:Lainformaciónla incluyeeldesarrolladorparaqueestédisponiblecuandoelusuario pulsaelenlace. • Accesoalainformaciónenelservidor § § Lainformaciónseenvíacomopares(clave,valor). Seaccedealainformacióncomoparámetrosenlosmétodosdel controlador. 25 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor Envíomedianteformulario • EjemplodeformularioHTML(partecliente)y controlador(parteservidor): <!DOCTYPE html> <html> <body> <form action="processForm" method="post"> <h1>Form</h1> <label for="input">Input</label> <input type="text" name="input" id="input"> <input type="submit"> </form> </body> </html> import import import import org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMapping; org.springframework.web.bind.annotation.RequestParam; org.springframework.web.servlet.ModelAndView; @Controller public class FormController { @RequestMapping("/processForm") public ModelAndView process(@RequestParam String input) { return new ModelAndView("result").addObject("result", input); } } 26 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor EnvíomedianteURL(opción1) • LaprimeraopcióndeenviardatosmedianteURLconsisteensimular elenvíoGETdeunformulario: § SeincluyenalfinaldelaURLseparadoscon?(query) § Losparámetrosseseparanentresícon& § Cadaparámetrosecodificacomonombre=valor • Ejemplo: http://my-server.com/path?option=web&view=category&lang=es 27 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor EnvíomedianteURL(opción1) • Formato:Codificacióndelosnombresylosvalores § Loscaracteresalfanuméricos"a"hasta"z","A"hasta"Z"y"0"hasta"9"se quedanigual § Loscaracteresespeciales".","-","*",y"_"sequedanigual § Elcarácterespacio" "esconvertidoalsigno"+"oconsuvalorhexadecimal%20 § Todoslosotroscaracteressoncodificadosenunoomásbytes.Despuéscada byteesrepresentadoporlacadenade3caracteres"%xy",dondexyesla representaciónenhexadecimal • Ejemplo: http://localhost:8080/demo?parameter=hello%20world 28 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor EnvíomedianteURL(opción1) • Paraaccederalainformaciónseusaelmismomecanismoquepara leerloscamposdelformulario • Ejemplo: http://my-server.com/path?option=web&view=category&lang=es @RequestMapping("/path") public ModelAndView path(@RequestParam String option, @RequestParam String view, @RequestParam String lang) { // Create and return model } 29 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor EnvíomedianteURL(opción2) • Lainformacióntambiénsepuedenincluircomopartedelapropia URL,envezdecómoparámetros • Ejemplo: http://my-server.com/path/web/category/es @RequestMapping("/path/{option}/{view}/{lang}") publicModelAndViewpath(@PathVariableStringoption, @PathVariableStringview,@PathVariableStringlang){ //Createandreturnmodel } 30 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 3. Envío de información al servidor URLsenThymeleaf • Debidoasuimportancia,lasURLsson“ciudadanosdeprimeraclase” enThymeleafytienenunasintaxisespecial • Losenlacestambiénsepuedenconstruirenunaplantillaconla informacióndelmodelo • Ejemplo:Modeloconunobjetoid : <!-- Will produce '/order/details?orderId=3' --> <a href="details.html" th:href="@{/order/details(orderId=${id})}">view</a> <!-- Will produce '/order/3/details' --> <a href="details.html" th:href="@{/order/{orderId}/details(orderId=${id})}">view</a> La etiqueta th:href generará el atributo href del enlace Se usa con el símbolo @ 31 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC 2. Thymeleaf 3. Envíodeinformaciónalservidor 4. Gestióndedatosdesesión § § § ObjetoHttpSession GestióndelasesiónenSpring ObjetoHttpSessionvssesiónSpring 5. Soportedeinternacionalización(I18N) 32 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión • Eshabitualquelasaplicacioneswebgestioneninformación diferenteparacadausuarioqueestánavegando.Porejemplo: § AmigosenFacebook. § ListadecorreosenGmail. § CarritodelacompraenAmazon. • Sepuedegestionarlainformacióndelusuarioendosámbitos diferentes: § § Informaciónqueseutilizadurantelanavegacióndelusuario,durantela sesiónactual. Informaciónqueseguardamientrasqueelusuarionoestánavegandoy queserecuperacuandoelusuariovuelveavisitarlapáginaweb (informaciónpersistente). 33 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión • Sesión:Mantenerinformaciónmientraselusuarionavegaporla web. § Cuandoelusuariopasaciertotiemposinrealizarpeticionesalaweb,la sesiónfinalizaautomáticamente(caducidad). § Eltiempoparaquecaducidadesconfigurable. § Lainformacióndesesiónseguardaenmemoriadelservidorweb. • Informaciónpersistente:Guardarinformaciónentredistintas navegacionesporlaweb. § § § Paraquepodamosguardarinformacióndelusuarioenelservidor,es necesarioqueelusuarioseidentifiquealaccederalapágina. LainformaciónsesueleguardarenelservidorwebenunaBBDD. LalógicadelaaplicacióndeterminaaquéinformacióndelaBBDD puedeaccedercadausuario. 34 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión • Existendostécnicasprincipales: 1. ObjetoHttpSession § EslaformabásicadegestióndesesionesenJavaEE. § ExisteunobjetoHttpSessionporcadausuarioquenavegaporlaweb. § § Sepuedealmacenarinformaciónenunapeticiónyrecuperarlainformaciónen otrapeticiónposterior. Esdemásbajonivel. 2. Componenteespecíficoparacadausuario. § § § CadausuarioguardasuinformaciónenunoovarioscomponentesSpring. Existeunainstanciaporcadausuario(cuandolohabitualestenerunaúnica instanciaporcomponente). Esdemásaltonivel. 35 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSession • Lasesiónserepresentacomounobjetodelinterfaz javax.servlet.http.HttpSession. • ElframeworkSpringeselencargadodecrearunobjetodelasesión diferenteparacadausuario. • Paraaccederalobjetodelasesióndelusuarioqueestáhaciendouna petición,bastaincluirlocomoparámetroenelmétododelcontrolador. @RequestMapping("/mypath") public ModelAndView process(HttpSession session, ...) { Object info = ...; session.setAttribute("info", info); return new ModelAndView("template"); } 36 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSession • Ejemplo: § Laaplicaciónrecogelainformacióndeformularioylaguardade dosformas: Atributodelcontrolador(compartida). Atributodelasesión(usuario). § § Unavezguardadalainformación,sepuedeaccederaellay generarunapágina. Sidosusuariosvisitanestapáginaalavez,sepuedevercómola informacióndelcontroladorescompartida(laqueguardael últimousuarioeslaquesemuestra),perolaqueseguardaenla sesiónesdiferenteparacadausuario. 37 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSession • Ejemplo: Guardalainformaciónenlaunatributodela sesiónyenunatributodelcontrolador Recuperalainformacióndelasesión (usuario)ydelcontrolador(compartida) 38 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSession • Ejemplo: @Controller public class SessionController { private String sharedInfo; @RequestMapping(value = "/processForm") public ModelAndView processForm(@RequestParam String info, HttpSession sesion) { sesion.setAttribute("userInfo", info); sharedInfo = info; return new ModelAndView("form_result"); } @RequestMapping("/showData") public ModelAndView showData(HttpSession sesion) { String userInfo = (String) sesion.getAttribute("userInfo"); return new ModelAndView("data").addObject("userInfo", userInfo).addObject("sharedInfo", sharedInfo); } } 39 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSession • MétodosdeHttpSession: § void setAttribute(String name, Object value):Asociaun objetoalasesiónidentificadoporunnombre. § Object getAttribute(String name):Recuperaunobjeto previamenteasociadoalasesión. § boolean isNew():Indicasieslaprimerapáginaquesolicitaelusuario (sesiónnueva) § void invalidate():Cierralasesióndelusuarioborrandotodossusdatos. Sivisitanuevamentelapágina,seráconsideradocomounusuarionuevo. § void setMaxInactiveInterval(int seconds):Configuraeltiempode inactividadparacerrarautomáticamentelasesióndelusuario. 40 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión GestióndelasesiónenSpring • EnSpringexisteunaformademásaltonivelparaasociar informaciónalusuario. • Consisteencrearun@Componentespecialqueseasociaráacada usuarioyhacer@Autowire delmismoenelcontroladorquese utilice. • InternamenteSpringhacebastantemagiaparaquelainformaciónse gestionedeformaadecuada. 41 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión GestióndelasesiónenSpring • Ejemplo: import import import import org.springframework.context.annotation.Scope; org.springframework.context.annotation.ScopedProxyMode; org.springframework.stereotype.Component; org.springframework.web.context.WebApplicationContext; @Component @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class User { private String info; public void setInfo(String info) { this.info = info; } public String getInfo() { return info; } Laanotación @Scopeconestos valoreshaceque hayauncomponente porcadausuario } 42 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión GestióndelasesiónenSpring • Ejemplo: @Controller public class SessionController2 { @Autowired private User user; private String sharedInfo; @RequestMapping(value = "/processForm") public ModelAndView processForm(@RequestParam String info) { user.setInfo(info); sharedInfo = info; return new ModelAndView("info_result"); } @RequestMapping("/showData") public ModelAndView showData(HttpSession sesion) { String userInfo = user.getInfo(); return new ModelAndView("data_page").addObject("userInfo", userInfo).addObject("sharedInfo", sharedInfo); } } 43 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 4. Gestión de datos de sesión ObjetoHttpSessionvssesiónSpring • Ambastécnicassepuedencombinar. • ElobjetoHttpSessionseutilizaráparacontrolarelciclodevidadela sesión(siesnueva,invalidarla,etc…). • Elcomponenteseusaráparagestionarlainformaciónasociadaalusuario. 44 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF Índice de contenidos 1. SpringMVC 2. Thymeleaf 3. Envíodeinformaciónalservidor 4. Gestióndedatosdesesión 5. Soportedeinternacionalización(I18N) 45 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 5. Soporte de internacionalización (I18N) messages_en.properties welcome=Welcome to my web! messages_es.properties welcome=Bienvenido a mi web! messages_fr.properties welcome=Bienvenue sur mon site web! 46 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 5. Soporte de internacionalización (I18N) Nombre del fichero que contiene los mensajes de I18N Región (locale) por defecto Parámetro con el que cambiar la región desde URL SpringMvcI18nApp.java @SpringBootApplication public class SpringMvcI18nApp extends WebMvcConfigurerAdapter { @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("messages"); return messageSource; } @Bean public LocaleResolver localeResolver() { SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH); return sessionLocaleResolver; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor result = new LocaleChangeInterceptor(); result.setParamName("lang"); return result; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } 47 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 5. Soporte de internacionalización (I18N) I18NController.java i18n_page.html package io.github.web.springmvc; <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="#{welcome}">Default greetings</p> </body> </html> import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class I18NController { @RequestMapping("/i18n") public ModelAndView i18n() { return new ModelAndView("i18n_page"); } El símbolo # hace que la plantilla se rellene con los datos de I18N } 48 APLICACIONESWEBCONSPRINGMVCYTHYMELEAF 5. Soporte de internacionalización (I18N) 49