이름과 나이를 저장하는 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";
}
}
'Spring > 코드로 배우는 스프링 웹 프로젝트' 카테고리의 다른 글
[게시판 만들기1] 초기 설정하기 (0) | 2021.02.24 |
---|---|
파일 업로드 처리 (servlet-context.xml) (0) | 2021.02.23 |
log4jdbc-log4j2 및 로고 레벨 설정 (0) | 2021.02.23 |
MyBatis의 Mapper 사용하기 (0) | 2021.02.22 |
마이 바티스 사용하기 (0) | 2021.02.22 |