

Ở phần trước chúng đa đã validate được form trong spring web mvc phần này chúng ta tìm cách custome validate trong ví dụ validate file
Bước 1: Định nghĩa annotation: FileNotNull , ValidImage và class FileNotNullValidator và ValidImageValidator.java trong package validator
Tạo interface FileNotNull
package validator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {FileNotNullValidator.class})
public @interface FileNotNull {
String message() default "Not empty file image";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Tạo Class FileNotNullValidator
package validator;
import javax.validation.ConstraintValidator;
public class FileNotNullValidator implements ConstraintValidator<FileNotNull, MultipartFile>{
@Override
public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
if(value.getOriginalFilename().isEmpty()) {
return false;
}
return true;
}
}
Tạo interface ValidImage
package validator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidImageValidator.class})
public @interface ValidImage {
String message() default "Invalid image file";
String[] type();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Tạo Class ValidImageValidator
package validator;
import javax.validation.ConstraintValidator;
public class ValidImageValidator implements ConstraintValidator<ValidImage, MultipartFile> {
private String[] types;
@Override
public void initialize(ValidImage validImage) {
this.types = validImage.type();
}
@Override
public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
Boolean bl = false;
if(value.getOriginalFilename().isEmpty()) {
bl = true;
}
for (String type : types) {
if(type.equals(value.getContentType())) {
return true;
}
}
return bl;
}
}
B2: Tạo ProductDTO trong package dto
public class ProductDTO {
private Integer productId;
@NotEmpty(message = "Khong duoc trong")
private String productName;
@FileNotNull(message = "Khong duoc trong")
@ValidImage(type = {"image/jpeg","image/png","image/jpg"},message = "Khong dung dinh dang nhe")
private MultipartFile image;
@NotNull(message = "Khong duoc trong")
private Float price;
@NotEmpty(message = "Khong duoc trong")
private String description;
private Category category;
public ProductDTO() {
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public MultipartFile getImage() {
return image;
}
public void setImage(MultipartFile image) {
this.image = image;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
B3: Tạo ProductController trong package controllers
package controllers;
@Controller
public class ProductController {
@Autowired
private ProductDAO productDAO;
@Autowired
private CategoryDAO categoryDAO;
@RequestMapping(value = "/product")
public String index(Model model) {
List<Product> list = productDAO.getAll();
model.addAttribute("list", list);
return "product/index";
}
@GetMapping(value = "/addProduct")
public String add(Model model) {
ProductDTO product = new ProductDTO();
List<Category> listCategory = categoryDAO.getAll();
model.addAttribute("product", product);
model.addAttribute("listCategory", listCategory);
return "product/add";
}
@PostMapping(value = "/insertProduct")
public String save(@Valid @ModelAttribute("product") ProductDTO product,BindingResult result, Model model,
HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(result.hasErrors()) {
return "not ok";
} else {
return "not not ok";
}
}
}
B4 : tạo views add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-6">
<form:form action="insertProduct" method="POST"
modelAttribute="product" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputEmail1">Product Name</label>
<form:input type="text" path="productName" class="form-control" />
<form:errors path="productName" cssClass="text-danger"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">price</label>
<form:input type="text" path="price" class="form-control" />
<form:errors path="price" cssClass="text-danger"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Image</label> <form:input type="file"
path="image" class="form-control" />
<form:errors path="image" cssClass="text-danger"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Category</label>
<form:select path="category.categoryId" class="form-control">
<form:options items="${listCategory}" itemLabel="categoryName"
itemValue="categoryId" />
</form:select>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Description</label>
<form:textarea path="description" class="form-control" />
</div>
<button type="submit" class="btn-block btn-primary">Add</button>
</form:form>
</div>
</div>
</div>
</body>
</html>
Cấu trúc thư mục :
Kết Quả:
TÁC GIẢ : LẠI HỮU BÁCH FB
Sử dụng i18n Internationalization(Quốc tế hóa) làm đa ngôn ngữ trong ứng dụng web với Spring MVC
Read MoreTải giao diện Admin LTE 2 bản rút gọn nhẹ làm trang quản trị cho ứng dụng web ...............
Read MoreHướng dẫn CRUD Spring WebMVC vs Hibernate phần 2 (Quản lý sản phẩm), CRUD có upload image và có quan hệ khóa ngoại
Read MoreHướng dẫn Thêm sửa xóa dữ liệu với spring webmvc sử dụng hibernate , trong bài viết này mình sử dụng database oracle
Read MoreHướng dẫn upload file trong spring webmvc sử dụng common-io, common-fileupload ...
Read MoreHướng dẫn validate form trong springMVC sử dụng javax-validate
Read MoreLà một framework phát triển ứng dụng phổ biến nhất cho ứng dụng doanh nghiệp trong Java Là một nền tảng Java mã nguồn mở. Được viết đầu tiên bởi Rod Johnson và được phát hành lần đầu dưới phiên bản Apache 2.0 vào tháng 6 năm 2003
Read More