클라이언트의 요청을 Servlet에 전달하여 Controller로 전달 할 경우 해당 값을 전송하게 됩니다.
이번 포스트에서는 해당 과정에서 사용되는 방식들에 대해 설명 드리겠습니다.
1) HttpServletRequest
HttpServletRequest는 request가 들어왔을 때 요청 메시지를 하나씩 파싱하게 되는데 이를 객체를 통해 해당 요청을 저장하였다가 해당 값을 불러올 수 있도록 해줍니다.
<h1>ex01</h1>
<hr>
<form method="POST">
<p>
<input type="number" name="n1" min="0" max="10" placeholder="n1">
+
<input type="number" name="n2" min="0" max="10" placeholder="n2">
</p>
<p><input type="submit"></p>
</form>
@Controller
public class Ex01Controller {
@RequestMapping(value="/ex01", method=RequestMethod.POST)
public String ex01(HttpServletRequest request) {
int n1 = Integer.parseInt(request.getParameter("n1"));
int n2 = Integer.parseInt(request.getParameter("n2"));
int answer = n1 + n2;
request.setAttribute("answer", answer);
return "ex01-result";
}
}
<h1>ex01-result</h1>
<hr>
<h3>${param.n1 } + ${param.n2 } = ${answer }</h3>
<a href="${cpath }"><button>홈으로</button></a>
제일 처음
ex01.jsp 에서 데이터 값의 이름과 함께 POST형식으로 넘겨주게 되면
Controller에서
@RequestMapping을 통해 해당 경로에서 넘어 오는 값을
HttpServletRequest자료형의 매개변수로 전달받아
getParameter라는 내장 메서드를 통해 "n1"과 "n2"의 이름을 가진 값을 각각의 변수에 저장하는 방식입니다.
이렇게 저장된 값을 다시 연산처리를 해주고 해당값을 변수에 담아
Map에 값을 저장하는 방식처럼 해당 값의 키와 값을
setAttribute를 통해 담아주게 됩니다.
해당 값은
ex01-result.jsp로 보내지게 되고 EL태그를 통해
Attribute값을 불러오게 됩니다.
이번에 소개드릴 Model과 ModelAndView는 SpringFramework등장 이후 어노테이션의 등장 이전 가장 흔히 사용되던 요청 처리 방식이라 할 수 있습니다.
2) Model
Model은 SpringFramework의 등장이후 요청값을 처리한 데이터를 담아 전달하는데 사용되었습니다.
여기까지가 큰 틀의
Model 이긴 하지만 사실
Model이라는 클래스는 객체 생성을 통해 결과값을 저장하기도 하지만 입력값을 받아오는 역할도 수행합니다.
@Controller
public class HomeController {
@RequestMapping("home")
public String home(Model model) {
String name = model.getAttribute("name");
name = "velog";
model.addAttribute("name", name);
return "home";
}
}
위의 로직이 사실 이해하기 좋거나 잘쓴코드는 아닙니다만 나름대로 설명을 해보도록 하겠습니다.
먼저
getAttribute 를 통해 "
name"이라는
key 값을 가진 객체나 문자열을 받아오게 됩니다.
처음
name 변수에 저장된 값이 "
github"라면 다음 행에서
name 변수에 "
velog"라고 저장한뒤
addAttribute 를 통해
model에 다시 저장해주면 해당 값으로 변환되어 출력되게 됩니다.
다음은
Model에서 사용하는 내장 메서드입니다.
- addAttribute : 속성 추가
- getAttribute : 속성 조회
- containsAttributes : 입력된 속성이 있는지 확인
- mergeAttributes : model을 합병