이것은 폼이다
<form action="create">
작성자: <input type="text" name="writer" value="${dto.writer }"><br>
내용: <input type="text" name="content" value="${dto.content }"><br>
<input type="submit" value="전송"><br>
</form>
Validator를 상속받아왔다.
이 객체를 검증할거다
값을 검증해서 값이 비었거나 하는 경우 오류났다고 알려준다.
public class ContentValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return ContentDto.class.isAssignableFrom(clazz);//검증할 객체의 클레스타입정보
}
@Override
public void validate(Object target, Errors errors) {
//형변환
ContentDto dto = (ContentDto)target;
String writer = dto.getWriter();
if(writer == null||writer.trim().isEmpty()) {
System.out.println("writer is null");
errors.rejectValue("writer","trouble");
}
String content = dto.getContent();
if(content == null||content.trim().isEmpty()) {
System.out.println("content is null");
errors.rejectValue("content", "trouble");
}
}
}
폼을 처리하는 @RequestMapping("create")
insert2는 매개변수로 DTO객체와 폼의 결과BindingResult result를 받아온다
validator.validate(contentDto, result); 함수에 넣어준다
얘는 void타입인데 에러인 Errors errors를 result로 돌려준다
그래서 if문에서 에러가 발생하면 페이지를 넘기지 않고 그대로 시작페이지에서 머물게 한다.
@RequestMapping("create")
public String insert2(@ModelAttribute("dto") ContentDto contentDto, BindingResult result) {
String page = "createDonePage";
System.out.println(contentDto);
ContentValidator validator = new ContentValidator();
validator.validate(contentDto, result);
if(result.hasErrors()) {
page = "createPage";
}
return page;
}
implementation 'org.springframework.boot:spring-boot-starter-validation'
그냥 제공해주는 거로 비었는지 확인 가능하다
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"객체이름","콘솔에 표시되는 문구")
public class ContentValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return ContentDto.class.isAssignableFrom(clazz);//검증할 객체의 클레스타입정보
}
@Override
public void validate(Object target, Errors errors) {
//형변환
ContentDto dto = (ContentDto)target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"writer","writer is empty");
//이거는 길이알아보는거.
String writer = dto.getWriter();
if(writer.length()<3) {
errors.rejectValue("writer", "writer is too short");
}
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"content","content is empty");
String content = dto.getContent();
if(content.length()<3) {
errors.rejectValue("content", "content is too short");
}
}
}
위에는 똑같고 받아오는 result가
에러가 있으면..result.hasErrors()가 true로 되어
result.getFieldError("writer").getCode()
해당 이름의 에러를 들고와서 알려주는데
값이 없으면 1: writer is empty
값이 짧으면 1: writer is too short하고 알려준다.
@RequestMapping("create1")
public String insert3(@ModelAttribute("dto") ContentDto contentDto, BindingResult result) {
String page = "createDonePage";
System.out.println(contentDto);
ContentValidator validator = new ContentValidator();
validator.validate(contentDto, result);
if(result.hasErrors()) {
System.out.println("getAllErros : "+result.getAllErrors());
if(result.getFieldError("writer")!=null) {
System.out.println("1: "+result.getFieldError("writer").getCode());
}
if(result.getFieldError("content")!=null) {
System.out.println("2: "+result.getFieldError("content").getCode());
}
page="createPage";
}
return page;
}
@ModelAttribute("dto") @Valid ContentDto contentDto
@Valid라는 어노테이션을 사용해서
객체를 new로 만들지 않고 @InitBinder로 처리한다
@RequestMapping("create")
public String insert2(@ModelAttribute("dto") @Valid ContentDto contentDto, BindingResult result) {
String page = "createDonePage";
System.out.println(contentDto);
// ContentValidator validator = new ContentValidator();
// validator.validate(contentDto, result);
if(result.hasErrors()) {
System.out.println("getAllErros : "+result.getAllErrors());
if(result.getFieldError("writer")!=null) {
System.out.println("1: "+result.getFieldError("writer").getCode());
}
if(result.getFieldError("content")!=null) {
System.out.println("2: "+result.getFieldError("content").getCode());
}
page="createPage";
}
return page;
}
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new ContentValidator());
}
이전까지는 그냥 dto였는데 여기서는 null empty size등을 어노테이션으로 먼저 처리해준다.
(나머지 양식은 init과 같다)
public class ContentDto {
private int id;
@NotNull(message="writer is null")
@NotEmpty(message="writer is empty")
@Size(min=3, max=10, message="writer min 3, max 10.")
private String writer;
@NotNull(message="content is null")
@NotEmpty(message="content is empty")
private String content;
}