Menu

Spring Boot Aplicacion Web Parte 5.

0 Comment


Crear Usuario y Validacion de campos

Necesitaremos un método en el controlador que reciba el formulario, lo valide, guarde el usuario y retorne una respuesta a la vista.

Este metodo recibira mas que Model como parametro, necesitara un objeto User que tendra mapeado todos los campos del formulario y un objecto con el resultado de la validacion del formulario.


Contenido

  1. Agregar Validacion a la entidad Usuario.
  2. Agregar mensajes de error al HTML.
  3. Crear metodo en el controlador.
  4. Crear Servicio para guardar usuario.
  5. Arreglar Formulario HTML
  6. Git Commit.

1.Agregar Validacion

Para usar el BindingResult cuando tratamos de crear un usuario, necesitaremos anotar los campos que queramos validar. Hay una gran lista de anotacions que se pueden usar, puedes encontrar mas informacion en este link (click aqui).

Utilizaremos solo dos (@NotBlank, @Email) en nuestro ejemplo pero puedes probar los que quieras.

*@NotBlank: El valor no puede ser null y debe contener al menos un caracter que no sea espacio.
*@Email: Valida que el valor ingresado tenga el formato valido de email.

	@Column 
	@NotBlank
	private String firstName;
	
	@Column 
	@NotBlank
	private String lastName;
	
	@Column(unique = true) 
	@Email 
	@NotBlank
	private String email;
	
	@Column(unique = true) 
	@NotBlank
	private String username;
	
	@Column 
	@NotBlank
	private String password;

2.Agregar mensajes de error

Inmediatamente debajo de cada campo de texto deberas colocar la siguiente linea de codigo, que solo aparecera si hay un error para ese campo.

<div class="alert-danger" th:if="${#fields.hasErrors('Nombre_del_atributo')}" th:errors="*{Nombre_del_atributo}">Name Error</div>

Como resultado todos tus campos se deberian de ver de la siguiente manera

<div class="form-group row">
	<label class="col-lg-3 col-form-label 	form-control-label">First name</label>
	<div class="col-lg-9">
		<input class="form-control" type="text" th:field="${userForm.firstName}" th:disabled="${disableFields}">
		<div class="alert-danger" th:if="${#fields.hasErrors('firstName')}" th:errors="*{firstName}">Name Error</div>
	</div>
</div>

3.Crear metodo en el Controlador.

Para este metodo necesitaremos agregar mas que el modelo a la firma como lo hicimos en el metodo anterior, esta vez recibiremos 2 parametros mas, uno que es el usuario mapeado desde el formulario y el otro sera el resultado de ese mapeo.

@PostMapping("/userForm")
public String postUserForm(@Valid @ModelAttribute("userForm")User user, BindingResult result, ModelMap model)
Java
  • @PostMapping: Indica que para acceder a este metodo debe ser utilizando un llamado POST y no GET, ademas que la ruta debe de ser /userForm
  • @Valid: Indica Spring que verifique los atributos del entity, en este caso @NotBlank y @Email.
  • @ModelAttribute: El constructor de esta anotacion recibe el nombre del formulario html y lo convierte a un objeto Java.
  • BindingResult: Contendra la informacion del resultado entre el mapeo del formulario html y el objeto Java User.

Lo primero que debemos hacer es verificar que no hayan errores dentro de nuestro BindingResult de la siguiente manera: result.hasErrors().

Si hay errores necesitaremos regresar a la pantalla para poder mostrar estos errores, esto lo hicimos en el punto #2 poniendo una seccion de errores debajo de cada input, y ademas debes indicar que la pestaña del formulario debe de estar activa y sino hay errores hay que proceder a crear el usuario.

El codigo final del metodo descrito seria el siguiente dentro de la clase UserController:

@PostMapping("/userForm")
public String postUserForm(@Valid @ModelAttribute("userForm")User user, BindingResult result, ModelMap model) {
		if(result.hasErrors()) {
			model.addAttribute("userForm", user);
			model.addAttribute("formTab","active");
		}else {
			try {//Aca tendras error porque este metodo no existe, pero lo crearemos en la siguiente seccion.
				userService.createUser(user);
				model.addAttribute("userForm", new User());
				model.addAttribute("listTab","active");
			} catch (Exception e) {
				model.addAttribute("formError",e.getMessage());
				model.addAttribute("userForm", user);
				model.addAttribute("formTab","active");
			}
		}

		model.addAttribute("userList", userService.getAllUsers());
		model.addAttribute("roles",roleRepository.findAll());
		return "user-form/user-view";
	}
Java

4. Crear Servicio

Tendras que agregar el metodo a la interfaz del servicio y luego crear el metodo en la implementacion. Pero antes de crear el usuario tenemos que hacer dos validaciones, que el username no este ocupado por otra persona y que el password y el confirmPassword sean iguales.

UserService
public User createUser(User formUser) throws Exception;

UserServiceImpl
@Override
	public User createUser(User formUser) throws Exception {
		if( !checkUsernameExists(formUser)
				&& checkPasswordMatch(formUser)){

			formUser.setPassword(formUser.getPassword());
			
			User createdUser = userRepository.save(formUser);
			return createdUser;
		}
		return formUser;
	}
	
	private boolean checkUsernameExists(User user) throws Exception{
		Optional existentUser = userRepository.findByUsername(user.getUsername());
		if(existentUser.isPresent()) {
			throw new Exception("Username already exists");
		}
		return false;
	}

	private boolean checkPasswordMatch(User user)throws Exception{
		if( user.getPassword()!=null
				&& !user.getPassword().equals(user.getConfirmPassword()) ){
			
			throw new Exception("Passwords does not match");
		}
		return true;
	}

Nota:Cuando agregemos Spring Boot Security necesitaremos encriptar el password antes de guardar el usuario.

5.Arreglar Formulario HTML

Para poder que el formulario haga el request apropiadamente asegurate que este usando el metodo post, el action sea userForm y el boton de guardar los cambios sea tipo submit.

<form id="userForm" th:object="${userForm}" method="post" class="form" role="form" th:action="@{/userForm}">

Ademas asegurate de haber programado el cambio de pestañas adecuadamente en el archivo form-view.html. Tanto los enlaces de cada tab como el cuerpo deben de tener el atributo th:classappend.

6.Git Commit

Se me olvido tomar la captura de pantalla antes de hacer el commit por lo tanto esta imagen es diferente a las anteriores. Esta imagen muestra la informacion del commit, como el commit Id, el mensaje y los archivos modificados en ese commit.

Git Commit of CreateUser Service
Git Commit of CreateUser Service

Menu

  1. Setup
  2. Entidades y POJOS
  3. Basic HTML
  4. Lista de Usuarios
  5. Crear Usuario y Validar Campos
  6. Editar Usuario
  7. Eliminar Usuario
  8. Cambiar Contraseña
  9. Spring Security
  10. Paginas de Error

Gracias por llegar al final de este post.
No se te olvide dejar tus comentario o preguntas aca abajo o en mi twitter @Cruizg93

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *