Publicado el 19 de Enero del 2019
531 visualizaciones desde el 19 de Enero del 2019
451,1 KB
18 paginas
Creado hace 11a (01/01/2013)
Experto Universitario Java Enterprise
Spring
Sesión 5: Spring MVC (II)
Validación e internacionalización
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
1
Experto Universitario Java Enterprise
Indice
• Validación
– Validación en Spring 2.x
– Validación en Spring 3 (JSR303)
• Restricciones predefinidas
• Validación de restricciones con JSR303 y en Spring MVC
•
Internacionalización
– Gestión del Locale
– Mensajes i18n
– Formateo de fechas y números
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
2
Experto Universitario Java Enterprise
Validación en Spring 2.x
•
Implementar el interface Validator
public class OfertaValidator implements Validator {
}
public boolean supports(Class arg0) {
}
public void validate(Object obj, Errors errors) {
}
return;
return arg0.isAssignableFrom(BusquedaOfertas.class);
ValidationUtils.rejectIfEmpty(errors, "precioMax","precioVacio");
BusquedaOfertas bo = (BusquedaOfertas) obj;
//comprobar que el precio no esté vacío
// (para que no haya null pointer más abajo)
if (bo.getPrecioMax()==null)
//comprobar que el número sea positivo
if (bo.getPrecioMax().floatValue()<0)
errors.rejectValue("precioMax", "precNoVal");
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
3
Experto Universitario Java Enterprise
JSR 303
• API que permite especificar restricciones usando
anotaciones en javabeans
• Hibernate validator es la implementación de referencia, y
es la usada por Spring 3
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
4
public class Reserva { @Future private Date entrada; @Range(min=1,max=15) private int noches; @Min(10) private BigDecimal pagoAnticipado; @NotNull private TipoHabitacion tipohabitacion; @NotNull private Cliente cliente; ...}
Experto Universitario Java Enterprise
Ejemplos de restricciones predefinidas
• Además el usuario puede definir las suyas propias
public class Usuario {
@NotNull
@Length(min=5,max=20)
private String login
@NotNull
@NotBlank
private String password
@Past
private Date alta;
@Valid
Direccion direccion;
@email
String email
@CreditCardNumber
String tarjeta;
}
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
5
Experto Universitario Java Enterprise
Validación en JSR303
• Las restricciones se comprueban a demanda, no en todo
momento
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
6
Usuario u = new Usuario();u.setEmail(“Esto no es un email”)ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Usuario>> errores = validator.validate(usuario);for (ConstraintViolation<Usuario> cv : errores) { System.out.println(cv.getMessage());}
Experto Universitario Java Enterprise
Validación en Spring 3
• 1. Se introducen datos en un formulario de Spring
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head><title>Alta de usuario</title></head>
<body>
<form:form modelAttribute="usuario">
<form:input path="login"/> <br/>
<form:errors path="login"
...
<input type="submit" value="Alta"/>
</form:form>
</body>
</html>
cssClass=”rojo”/> <br/>
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
7
Experto Universitario Java Enterprise
Validación en Spring 3 (controller)
• Aunque por debajo se invoca el API que hemos visto, no
hay que hacerlo “a mano”
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
8
@Controller@RequestMapping("/usuario")public class UsuarioController { @RequestMapping(method=RequestMethod.POST) public String alta(@Valid Usuario usuario, BindingResult result) { if (result.hasErrors()) return "altaUsuario"; }}
Experto Universitario Java Enterprise
Mensajes de error
• Se integran con los habituales de Spring, en .properties
(en el dispatcher-servlet.xml)
(en mensajesWeb.properties)
resultado
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
9
Min.noches = hay un mínimo de {1} noches de estanciapublic class OfertaAlojamiento { ... @Min(2) private int estancia; ...}hay un mínimo de 2 noches de estancia<bean id="messageSource" class="org.springframework.context. support.ResourceBundleMessageSource"> <property name="basename" value="mensajesWeb"/></bean>
Experto Universitario Java Enterprise
Mostrar los mensajes en un JSP
• Se usan las taglibs de Spring
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
10
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><html> <head><title>Hacer reserva</title></head> <body> <form:form modelAttribute="oferta"> <form:input path="estancia"/> <br/> <form:errors path="estancia" cssClass=”rojo”/> <br/> ... <input type="submit" value="Reservar"/> </form:form> </body></html>
Experto Universitario Java Enterprise
Internacionalización
• Según el idioma hay que cambiar
• Los textos del interfaz
• El formato de ciertos datos: ¿qué fecha es el 01/10/10? ¡depende del
país!
• Soporte de internacionalización de Java
•
•
java.util.Locale: representa idioma [+ país]
java.text.DateFormat, java.text.NumberFormat, permiten formatear
fechas y números. El aspecto final depende del Locale actual
• por convenio mensajes_es.properties contiene los mensajes para el
Locale “es”
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
11
Experto Universitario Java Enterprise
Traducción de los textos
• No poner textos fijos en los JSP
• Tag message muestra un mensaje
internacionalizado.
El fichero .properties usado depende del Locale establecido
para el usuario actual
mensajes_es.properties
mensajes_en.properties
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
12
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>...<spring:message code="alta.reserva"/>alta.reserva = Hacer reservaalta.reserva = Make reservation
Experto Universitario Java Enterprise
Trabajar con el Locale actual
•
Para saber cuál es el Locale actual simplemente usar
un parámetro de este tipo en el Controller
–
Por defecto se usa el de la cabecera HTTP “Accept-Language:”
que envía el navegador
•
Cambiar el Locale
–
Clase que intercepta cualquier petición y si lleva un parámetro
locale, cambia el locale actual
dispatcher-servlet.xml
index.jsp
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
13
<mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/></mvc:interceptors><a href=”index.do?locale=es”>Español</a><a href=”index.do?locale=de”>Deutsch</a>
Experto Universitario Java Enterprise
Cambiar el locale (II)
•
Para que el cambio se pueda guardar hay que hacerlo
en una cookie o en la sesión
Lo más simple es usar un bean de Spring que lo hace automáticamente, de
las clase CookieLocaleResolver o SessionLocaleResolver
dispatcher-servlet.xml
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
14
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/></mvc:interceptors>
Experto Universitario Java Enterprise
Formato de fechas y números
• Desde Spring 3.0 se puede hacer con anotaciones
• Para mostrar el formato en un JSP hay que usar tags de
Spring
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
15
public class Reserva { @Future @DateTimeFormat(style="S-") private Date entrada; @Range(min=1,max=15) private int noches; @Min(10) @NumberFormat(style=NumberFormat.Style.CURRENCY) private BigDecimal pagoAnticipado; @NotNull ...}Fecha de entrada: <spring:eval expression="reserva.entrada" />
Experto Universitario Java Enterprise
Formateo de fechas y números (II)
• @DateTimeFormat(style=“S-”)
• @NumberFormat(style=NumberFormat.Style.CURRENCY)
• Otros (consultar javadoc de DateTimeFormat y
NumberFormat)
@DateTimeFormat(pattern=“dd/MM/yyyy”)
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
16
Experto Universitario Java Enterprise
Conversión de datos
• Se pueden usar las anotaciones anteriores para convertir
también parámetros HTTP
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
17
tareas/crear.do?fecha=10-mar-2013public class TareasController { @RequestMapping("tareas/crear?") public int nuevaTarea(@RequestParam("fecha") @DateTimeFormat(style="S-") Date fecha, ...) { ... }}
Experto Universitario Java Enterprise
¿Preguntas...?
Validación e internacionalización
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
18
Comentarios de: Sesión 5: Spring MVC (II) - Validación e internacionalización (0)
No hay comentarios