Spring
request.setAttribute, model.addAttribute, ModelAndView
shika
2022. 1. 22. 14:00
스프링에서 정보를 전달할때 크게 4가지 방식이 있다.
코드로 살펴보자
Controller의 코드다.
@Controller
public class TestControlelr { //4개의 방식으로 정보전달 가능
@GetMapping("/test1")
public String test1() { //파라미터로 정보를 넘기는 경우 test1.jsp에서 ${param. } 으로 출력이 가능하다
return "test1";
}
@GetMapping("/test2")
public String test2(HttpServletRequest request) {
request.setAttribute("data1", 100);//HttpServletRequest로 정보전달 방식, jsp에서 ${data1}로 출력가능
request.setAttribute("data2", 200);
return "test2";
}
@GetMapping("/test3")
public String test3(Model model) { //Model을 이용한 정보전달(4개 다 비슷하지만 이게 가장 편한듯?)
model.addAttribute("data1", 300); //model을 통해서 정보를 전달하고 jsp에서 ${data1}로 출력 가능
model.addAttribute("data2", 400);
return "test3";
}
@GetMapping("/test4")
public ModelAndView test4(ModelAndView mv) { //ModelAndView방식 리턴값이 ModelAndView이고 파라미터에서 객체를 만들어 사용
mv.addObject("data1", 500); //만들어논 객체어 data1을 삽입
mv.addObject("data2", 600);
mv.setViewName("test4"); //setViewName 메소드를 사용해서 view의 이름을 정해주고
return mv; // 객체를 리턴해준다
}
}
이렇게 하고
test1 ,2 ,3 jsp를 살펴보자 순서대로 써보겠다
test1.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test1</h1>
<h3>data1 : ${param.data1}</h3> <!-- param. 은 파라미터를 뜻함 (저거 안붙이고 그냥 data1만 치면 아무것도 안뜬다) -->
<h3>data2 : ${param.data2}</h3>
<h3>data2 : ${data2}</h3> <!-- 위에줄과 다른결과! 이건 출력안됨 결과값 -> data2 : 만 뜬다 파라미터는 앞에 param. 을 추가하자 -->
</body>
</html>
test2.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test2</h1>
<h3>${requestScope.data1 }</h3>
<h3>${requestScope.data2 }</h3> <!-- requestScope는 생략가능 -->
<h3>${data2 }</h3> <!-- 위에줄과 동일함(but 유지보수할때 편하려면 붙히는것도 좋다) -->
</body>
</html>
test3.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test3</h1>
<h3>${requestScope.data1 }</h3>
<h3>${requestScope.data2 }</h3>
<%-- <h3>${data2 }</h3> 위와 동일--%>
</body>
</html>
다 정상적으로 출력가능한것을 확인할 수 있다.
중요한것은 다 requestScope의 영역이라는 것이다.
HttpServletRequest request 는 당연히 request영역이고
Model 또한 request 영역에 존재한다
때문에 jsp에서
${requestScope.data2 } 이렇게 해도 출력이 되는것이다
물론 ${data2 } 이렇게해도 출력이 가능하고 더 간편하다.
단점이라면 앞에 영역을 명시해주지 않는다면
많은 영역이 있는 코드라면 헷갈릴 수 있다는 점이다.
붙이고 안붙이고는 취향차이? 라고 들었기때문에
편한대로 써주면 된다.
하 test1.jsp은
<body>
<a href="test1?data1=100&data2=200">test1</a><br>
<hr>
<a href="test2">test2</a><br>
<hr>
<a href="test3">test3</a><br>
<hr>
<a href="test4">test4</a><br>
<hr>
<hr>
</body>
이렇게 보내주었기 때문에
${param.data1}이 가능한 것이다.
${requestScope.data1 } 얘는 ${data1 } 이렇게 써도 출력이 잘 되는 반면
param은
${param.data1 } 이렇게 써야만 출력이 가능하다
${data1 } 그냥 이렇게 쓰면 출력이 안되고 그냥 빈값으로 나오게 된다!
param으로 넘어오는 것은 꼭 범위를 지정해주는
${param. }을 써주도록 하자