UNIDAD 8: Validación de formularios
eugeniaperez.es
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.validation del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.validation.git
eugeniaperez.es
8.1 Validación en el Servidor
La base de las aplicaciones web es la arquitectura cliente servidor mediante peticiones que deben ser validadas para no caer en errores o inconsistencias.
Es imprescindible realizar validación en el servidor, puesto que la validación cliente puede ser burlada fácilmente.
La validación en el cliente es necesaria para evitar peticiones innecesarias.
eugeniaperez.es
8.1 Validación en el Servidor
Lo primero que se debe hacer es añadir las dependencias:
Son necesarias las dos: validation y también la de hibernate.
<!-- Validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>4.1.0.Final</version>
</dependency>
8.1 Validación en el Servidor
Las reglas de validación recaen sobre las entidades, por tanto, habrá que validar sus atributos:
public class User {
private int id;
@Size(min = 4, max = 15, message = "Login must be between 4 and 15 characters long")
@Pattern(regexp = "[A-Za-z0-9]+", message = "Must contain only chars and numbers")
private String login;
@Size(min = 6, max = 15, message = "Password must be between 6 and 15 characters long")
private String password;
@Size(max = 255, message = "Description must be less than 255 characters long")
private String description;
public User() {
}
...
eugeniaperez.es
8.1 Validación en el Servidor
Modificaremos los métodos del controlador que impliquen validación: reciben un @Valid usuario y un BindingResult, que almacenará los resultados de la validación.
@RequestMapping(method = RequestMethod.POST, value = { "/users/new" })
public ModelAndView createUser(@Valid User user, BindingResult bindingResult) {
ModelAndView modelAndView = new ModelAndView();
if (bindingResult.hasErrors()) {
modelAndView.setViewName("user/newuser");
modelAndView.addObject("user", user);
return modelAndView;
}
eugeniaperez.es
8.1 Validación en el Servidor
Finalmente para mostrar el resultado BindingResult en la vista utilizamos el tag de sf llamado errors:
<sf:form id="createUserForm" method="post" modelAttribute="user">
<div class="form-group">
<label for="login">Login</label>
<sf:input path="login" class="form-control" placeholder="Login" />
<sf:errors path="login" cssClass="error" />
</div>
<div class="form-group">
<label for="password">Password</label>
<sf:input path="password" class="form-control" type="password" placeholder="Password" />
<sf:errors path="password" cssClass="error" />
</div>
eugeniaperez.es
8.1 Validación en el Servidor
En este proyecto está habilitada también la validación cliente. Para que veas qué fácil es saltársela, desactiva el Javascript de tu navegador...
eugeniaperez.es
8.2 Validación en el Cliente
La validación Cliente no es del Fw de Spring, puesto que debemos realizarla con tecnología cliente: jQuery.
Vamos a sacar la lógica JS de validación a un fichero a parte para mantener el código limpio.
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<script
src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.min.js">
</script>
8.2 Validación en el Cliente
Dentro del fichero JS para validación de un nuevo usuario:
Definimos el método validate:
<script src="<c:url value="/resources/js/validateUserForm.js" />"></script>
eugeniaperez.es
8.2 Validación en el Cliente
Recuerda activar el Javascript...
eugeniaperez.es
8.3 Layouts: Apache Tiles
Todas estas vistas tienen una estructura común: barra de menú, cuerpo y pie de página...
Lo más lógico es incluir el código común en layouts: header, footer, etc y que cada vista contenga su parte característica.
Para ello, Spring MVC se integra con Apache Tiles, ya que es uno de los más maduros (lleva mucho tiempo en el mercado, al haber nacido con Struts 1).
eugeniaperez.es
8.3 Layouts: Apache Tiles
Se añade la dependencia:
Y los beans en el mvc-config / servlet-context:
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.5</version>
</dependency>¡Importante! Para que Apache acepte
Tiles, se necesita una versión
del FW de Spring superior a 3.1
eugeniaperez.es
8.3 Layouts: Apache Tiles
En el fichero definitions.xml definimos las secciones que contendrá cada plantilla:
<tiles-definitions>
<definition name="defaultTemplate" template="/WEB-INF/templates/template.jsp">
<put-attribute name="header" value="/WEB-INF/templates/header.jsp" />
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/WEB-INF/templates/footer.jsp" />
<put-attribute name="pageScripts" value="" />
</definition>
</tiles-definitions>
eugeniaperez.es
8.3 Layouts: Apache Tiles
Por lo tanto se crearán ficheros que contendrán la cabecera común (header.jsp), el pie de página (footer.jsp)
Y una plantilla por defecto que especificará dónde se debe insertar cada sección: template.jsp
Incluye:
Para especificar la plantilla que se utiliza: insertDefinition
Para indicar la sección a incluir: putAttribute
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>