본문 바로가기
자바과정/스프링

스프링 실습예제(Validator와 redirect)

by Parkej 2021. 4. 12.
- 디렉터리 구조


- 간단한 유효성검사와 Redirect에 대해 알아보겠습니다.

JSP 페이지 생성
createPage.jsp 생성
- 테스트를 위한 입력 페이지입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
    	String conPath = request.getContextPath();
    %>
    
    <form action = "/student/create">
    	이름 : <input name ="name" value ="${student.name }"><br/>
    	아이디 : <input name ="id" value ="${student.id }"><br/>
    	<input type="submit" value="전솜"><br/>
    </form>
</body>
</html>

createDonePage.jsp
- 검사결과가 적합할시 이동되는 페이지입니다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
    	String conPath = request.getContextPath();
    %>
    
    <form action = "./student/create">
    	이름 : <input name ="name" value ="${student.name }"><br/>
    	아이디 : <input name ="id" value ="${student.id }"><br/>
    	<input type="submit" value="전솜"><br/>
    </form>
</body>
</html>

테스트할 빈 클래스 생성
Student.java
- 데이터를 저장하고 사용하기 위한 데이터 클래스입니다.
- 저는 lombok이라는 api를 써서 어노테이션으로 지정해줬는데 lombok.api를 사용하지 않으면 직접 Getter, Settere 생성하셔도 됩니다.
package com.study.member;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Student {
	private String name;
	private int id;
}

StudentValidator.java
- 유효성 검사를 할 클래스입니다. 
- 기본적으로 제공되는 Validator의 함수를 implements했습니다. 

- boolean supports(Class clazz) : 어떤 타입의 객체를 검증할 때 이 객체의 클래스가 이 Validator가 검증할 수 있는 클래스인 지를 판단하는 매서드
- void validate(Object target, Errors error) : 실제 검증 로직이 이루어지는 메서드, 구현할 때 ValidationUtils를 사용하여 편리하게 작성 가능


출처: https://engkimbs.tistory.com/728
package com.study.member;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

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;
		// student 객체에 student형으로 Object obj 동적 바인딩 
		
		String studentName = student.getName();
//		 student 빈에 이름게터를 다른 변수에 저장
//		 게터에 불러온 데이터가 null 이거나 문자열 공백제거를 한 후 비었으멶
		if(studentName == null || studentName.trim().isEmpty()) {
			System.out.println("studentName is null or empty");
			// 에러객체에 이름이 문제생겼다라는 의미를 전달
			errors.rejectValue("name", "trouble");
		}
		
//		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "trouble");
		
		int studentId = student.getId();
		if(studentId == 0) {
			System.out.println("studentId is 0");
			errors.rejectValue("id", "trouble");
		}
		
//		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "trouble");
		
	}

}

 

컨트롤러 생성 또는 기본 컨트롤러 사용
StudentController.java
- 주소가 입력될 시 해당 매핑 주소로 옮겨주는 부분입니다.
- studentCreate 함수에서 Validator로 유효성검사를 실시한 뒤 반환된 주소를를 page에 담아 리턴해 줍니다. 
package com.study.sl;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.study.member.Student;
import com.study.member.StudentValidator;

@Controller
public class StudentController {

	@RequestMapping("/studentForm2")
	public String studentForm() {
		return "createPage";
	}
	
	@RequestMapping("/student/create")
	public String studentCreate(
			@ModelAttribute("student") Student student,
			BindingResult result) 
			{
		String page = "createDonePage";
		
		//validator // 유효성검사 지정
		StudentValidator validator = new StudentValidator();
		validator.validate(student, result);
		if(result.hasErrors()) {
			page = "redirect:/studentForm2";
		}
		return page;
	}
	
}

 

 

유효성 검사 부적합 시 페이지 이동처리
처음엔 리턴값을 jsp로만 지정해줬습니다. 하지만 첫번째 부적합시 다음 부적합 테스트를 하려하니 404에러가 발생해 이를 해결하였습니다. 
- student/create -> student/student/create (비정상)
- student/create -> student/create?name=값&id=값 (정상)
- 검사결과 부적합 시 redirect를 사용해 매핑 주소를 반환시켜줬습니다. 

- 또 form action에서 값을 넘겨줄때 일반적인 /student/create가 아닌 ' . ' (점) 을 추가해 실 경로를 지정해주었습니다. 
- 제 생각으로는 form action에 /student/create 를 넘겨주면 url이 겹쳐지면서 원래 /student/가 인식되면서 시작 작 url로 붙여써지게 된것 같습니다.

- 이 부분은 따로 찾아보면서 다시 포스팅하겠습니다. 

 

반응형

댓글