Thymeleaf

Anuncio
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
Descargar