1.HttpServletRequest(자바 웹 개발 표준)
2.@RequestParam
3.커맨드 객체
컨트롤러로 요청을 보낸다.
<%-- MyController03으로 요청 --%>
<div>
<a href="${contextPath}/blog/detail.do?blogNo=100">블로그 상세보기</a>
</div>
1) Java EE 표준 방식이다.
2) 파라미터뿐만 아니라 HttpSession session, String contextPath 등과 같은 정보도 꺼낼 수 있으므로 여전히 강력한 도구이다.
요청을 받아올 때 매개변수로 HttpServletRequest를 선언해 받아오고
request.getParameter로 요청에 들어있는 파라미터의 값을 저장한 후
jsp파일로 되돌려준다. 이때 이동방식은 spring의 기본방식인 forward이다
@Controller
public class MyController03 {
@RequestMapping("/blog/detail.do") // GET 방식의 method는 생략할 수 있다. value만 작성할 땐 value= 부분도 생략할 수 있다.
public String blogDetail(HttpServletRequest request) {
String blogNo = request.getParameter("blogNo");
// ViewResolver의 prefix : /WEB-INF/views/
// ViewResolver의 suffix : .jsp
request.setAttribute("blogNo", blogNo);
return "blog/detail"; // /WEB-INF/views/blog/detail.jsp로 forward(디폴트)한다.
}
자바 웹개발 표준코드에서 포워딩을 할 때
request에 정보를 저장해서 넘기는 부분이 혼동이 올 수 있어서 스프링에서는 이를 개선했다.
org.springframework.ui.Model 인터페이스(java.util.Map 기반으로 만들어짐)
형식
파라미터에 Model 선언 후
model.addAttribute("blogNo", blogNo);
request를 명시하지 않아 요청할 정보와 포워딩할 정보가 명확하게 구분된다.
하지만 여전히 내부로직은 request를 이용해서 작동함
@Controller
public class MyController03 {
@RequestMapping("/blog/detail.do") // GET 방식의 method는 생략할 수 있다. value만 작성할 땐 value= 부분도 생략할 수 있다.
public String blogDetail(HttpServletRequest request, Model model) {
String blogNo = request.getParameter("blogNo");
// ViewResolver의 prefix : /WEB-INF/views/
// ViewResolver의 suffix : .jsp
model.addAttribute("blogNo", blogNo);
return "blog/detail"; // /WEB-INF/views/blog/detail.jsp로 forward(디폴트)한다.
}
1) 파라미터의 개수가 적은 경우에 유용하다.
2) 주요 메소드
(1) value : 요청 파라미터의 이름
(2) required : 요청 파라미터의 필수 여부(디폴트 true - 요청 파라미터가 없으면 오류 발생)
(3) defaultValue : 요청 파라미터가 없는 경우에 사용할 값
3) @RequestParam을 생략할 수 있다.
요청 파라미터를 변수로 정의할 때 타입변환이 필요한 경우 스프링이 처리한다.
(아래의 경우 String -> int)
@RequestMapping("/blog/detail.do")
public String blogDetail2(@RequestParam(value="blogNo", required = false, defaultValue = "1") int blogNo, Model model) {
model.addAttribute("blogNo", blogNo);
return "blog/detail";
}
포워딩으로 전달된 정보 출력하기
<%@ 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>
${blogNo}
<br>
${requestScope.blogNo}
</body>
</html>
결과

1) 요청 파라미터를 필드로 가지고 있는 객체를 커맨드 객체라고 한다.
2) 요청 파라미터를 필드에 저장할 때 Setter가 사용된다.
3) 요청 파라미터가 많은 경우에 유용하다.
4) 커맨드 객체는 자동으로 Model에 저장된다.
저장될 때 객체명(dto)이 아닌 클래스명(BlogDto)으로 저장된다.(클래스명을 LowerCamelCase로 바꿔서 저장한다.)
객체 생성
@NoArgsConstructor
@AllArgsConstructor
@Data
public class BlogDto {
private int blogNo;
private String title;
}
커맨드 객체 BlogDto dto
@RequestMapping("/blog/detail.do")
public String blogDetail3(BlogDto dto) { // Model에 저장된 이름은 dto가 아니라 blogDto 이다.
return "blog/detail";
}
@ModelAttribute를 이용해서 Model에 저장되는 커맨드 객체의 이름을 지정할 수 있다.
@RequestMapping("/blog/detail.do")
public String blogDetail4(@ModelAttribute("dto") BlogDto blogDto) { // Model에 저장되는 이름은 dto 이다.
return "blog/detail";
}
결과 확인 detail.jsp의 body태그
<body>
${blogDto.blogNo} <!-- LowerCamelCase로 저장된 클래스명을 통해 정보확인 -->
<br>
${blogDto.getBlogNo()}
<br>
${dto.blogNo} <!-- @ModelAttribute 이용함 -->
</body>