이름과 나이를 저장하는 SampleDTO클래스를 만들었다.

@Data
public class SampleDTO {
	private String name;
	private int age;
}

 

컨트롤러에서 SampleDTO를 파라미터로 받으면

자동으로 SampleDTO에서 setter를 통해 값을 저장한다.

 

@RequestParm을 사용해서 파라미터를 받을수도 있다.

이 경우는 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 사용하면 좋다.

	@GetMapping(value = "dto")
	public String dto(SampleDTO dto, @RequestParam(name = "name") String name
			,@RequestParam(name = "age") int age, ModelMap model) {
		
		model.addAttribute("dto",dto);
		model.addAttribute("name",name);
		model.addAttribute("age",age);
		return "basic";
	}

 

model에 값을 저장하면 이러한 값들을 jsp파일에서 사용할 수 있다. 

dto객체에 저장한 값은 .name과 같이 작성하면 꺼내올 수 있다.

 

 

 

수정) 여기서 model.addAttribute를 통해  SampleDTO클래스의 객체인 dto를 View에 넘겼다.

이 dto는 Java Beans의 규칙에 맞는 객체이므로 ModelMap에 담지 않고도 View에서 사용할 수 있다.

jsp페이지에서는 클래스명의 첫 글자를 소문자로 바꿔서 사용이 가능하다. ex) ${sampleDTO}

 

※Java Beans의 규칙 : 생성자가 없고(비어있는 생성자를 가지거나) getter/setter를 가진 클래스의 객체 

 

참고) @RequestParm을 통해 받은 데이터를 View에서 사용하기 위해 ModelMap에 담아서 데이터를 넘겼다.

하지만 @RequestParm(name="age") int age 대신에 @ModelAttribute("age") int age 와 같이 한다면

따로 모델에 담지 않아도 된다. 다음엔 이 방법을 사용해보자.

 

리스트 타입도 같은 방법으로 가져올 수 있다. 

	@GetMapping(value = "dto")
	public String dto(@RequestParam(name = "name")ArrayList<String> list, ModelMap model) {
		model.addAttribute("list",list);
		return "basic";
	}
   

 

아래 코드와 같이 URL을 작성하면 된다.

http://localhost:8080/sample/dto?name=dw1&name=dw2&name=dw3

 

 

객체 리스트도 파라미터로 받을 수 있다.

DTO를 리스트형으로 저장항 클래스를 만들어준다.

@Data 어노테이션으로 getter와 setter를 자동으로 만들어준다.

@Data
public class SampleDTOList {
	private List<SampleDTO> list;
	
	public SampleDTOList() {
		list = new ArrayList<SampleDTO>();
	}
}

 

list를 받아서 출력해봤다.

	@GetMapping(value = "exam")
	public String dto(SampleDTOList list, ModelMap model) {

		for(SampleDTO DTOList : list.getList()) {
			System.out.println(DTOList);
			System.out.println("");
		}
		 
		model.addAttribute("list", list.getList());
		return "exam";
	}

 

 

특수문자 [ 와 ] 같은 경우 Tomcat에서 허용하지 않아서 [ 는 %5B ]는 %5D로 바꿔서 url을 작성한다.

http://localhost:8080/sample/exam?list%5B0%5D.name=dw&list%5B0%5D.age=10&list%5B1%5D.name=aa&list%5B1%5D.age=20&list%5B2%5D.name=bb&list%5B2%5D.age=13

 

출력을 해봤다.

 

 

 

변환이 가능한 데이터는 자동으로 변환이 된다.

하지만 Date와 같은 날짜는 따로 변환을 해줘야한다.

 

날짜와 같이 2020-03-20을 문자로 받아서 Date형으로 저장할 때 말이다.

 

아래 두 코드에서 URL창에 date=2020-03-20와 같이 입력하게 되면

문자로 인식하여 Date형인 date에 바인딩할 수 없어 에러가 난다. 

이를 해결해주기 위해서 Date타입으로 변환해줘야한다.

@Data
public class TodoDTO {
	private String title;
	private Date date;
}
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {	
	@GetMapping(value = "/ex03")
	public String ex03(TodoDTO dto) {
		System.out.println(dto);
		return "ex03";
	}
}

 

아래 코드와 같이 @InitBinder를 사용해주면 된다.

@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dateFormat, false));
	}
	
	@GetMapping(value = "/ex03")
	public String ex03(TodoDTO dto) {
		System.out.println(dto);
		return "ex03";
	}
}

 

http://localhost:8080/sample/ex03?title=title&date=2020-03-20 와 같이

url을 작성하면 정상적으로 변환하여 출력한다.

 

 

 

하지만 날짜와 같은 경우에는 좀 더 간단한 방법이 있다.

@DateTimeFormat을 사용하면 된다.

 

pattern형식을 지정하여 pattern에 맞는 문자열이 들어오면 Date형으로 변환해준다.

@Data
public class TodoDTO {
	private String title;
	@DateTimeFormat(pattern = "yyyy/MM/dd")
	private Date date;
}

 

컨트롤러 코드가 좀 더 간단해졌다.

@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
	@GetMapping(value = "/ex03")
	public String ex03(TodoDTO dto) {
		System.out.println(dto);
		return "ex03";
	}
}

+ Recent posts