Validator 를 이용한 검증
폼에서 전달되는 데이터를 커맨드 객체에 담아 컨트롤 객체에 전달 한다고 하였습니다.
이때 커맨드 객체의 유효성 검사를 할 수 있습니다.
참고로 javascript를 이용하는 것은 클라이언트에서 검사하는 방법이고, 지금하는 validator 인터페이스를 이용하는 방법은 서버에 검사하는 방법입니다.
@RequestMapping("/studentForm")
public String studentForm(){
return "createPage"
}
//url 에 /프로젝트명/studentForm 이 날라오면 createPage.jsp 로 날라갑니다
createPage.jsp
<%
String conPath = request.getContextPath(); // /프로젝트명
%>
<form action="student/create">
이름 : <input type="text" name="name" value="${student.name}">
아이디 : <input type="text" name="id" value="${student.id}">
<input type="submit" value="전송">
해당 input 박스에 submit 을 누르면 student/create 로 날라간다.
잠깐! 여태까지 dispatcheservlet 이 controller 에게 데이터를 보냈다고 배웠는데, 어노테이션 에선
dispatcherServlet 이 없이, controller 에 annotation 에 걸려서 작동하네.
@RequestMapping("/student/create")
public String studentCreate(@ModelAttribute("student") Student student, BindingResult result){//커맨드객체 이름 변경
String page = "createDonePage";
StudentValidator validator = new StudentValidator();//Validator interface 를 상속, 내장클래스, 오버라이딩 필요 (boolean supports, void validate(Object obj, Errors errors))
validator.validate(student, result);
if(result.hasErrors()){
page="createPage";
}
return page;
}
StudentValidator 클래스에 validate 메소드에 student랑 result 를 넘겨준다
StudentValidator.java
public class StudentValidator implements validator{
@Override
public boolean supports(Class<?> arg0){
return Student.class.isAssignableFrom(arg0);
}
@Override
public void validate(Object obj, Errors errors){
System.out.println("validate()");
Student student= (Student)obj;
String studentName = student.getName();
if(studentName == null || studentName.trim().isEmpty()){
System.out.println("studentName is null or empty");
errors.rejectValue("name","trouble");
}
int studentId = student.getId();
if(studentId == 0){
System.out.println("studentId is 0");
errors.rejectValue("id", "trouble");
}
}
}
errors 는 result 이다, 자료형 Errors 를 가지고 있다, 해당 클래스에 rejectValue 를 가지고 있다 () 인자값으로 String field 랑 String errcode 를 가진다,
String field 에 필드값이 들어간다 -> ${member.id} 일때 id 가 필드이다.
errors.rejectValue("name")
errors.rejectValue("id") 라면 ${member.id} 와 ${member.name} 이된다.
StudentController 에 if(result.hasErrors()) 로 가서 참이라면 createPage로 이동한다