Request
- 브라우저에 의해 새로운 요청이 발생하면, 브라우저는 서버에 요청에 관련된 정보를 전송
- 이를 받은 서버는 브라우저가 보낸 요청 정보들을 보관하기 위해 HttpServletRequest객체를 생성해 담아둔다.
- HttpServletRequest객체는 응답결과가 브라우저로 전송될 때까지 유지되며 사용이 가능
RequestScope
- 새로운 요청이 발생하여 응답결과가 브라우저로 전달될 때 까지 요청 정보가 담겨있는 Request 객체를 사용 가능
- 이러한 사용 범위를 RequestScope라고 부른다.
- HttpServletRequest객체에는 서버 개발자가 필요에 의해 데이터나 객체를 저장할 수 있고, RequestScope내에서 사용이 가능
예제
1)index.jsp 생성하기
<%@ 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>
<a href='test1'>test1</a>
</body>
</html>
2)TestController 생성
@Controller
public class TestController {
@GetMapping("/test1")
public String test1() {
return "redirect:/result1";
}
@GetMapping("/result1")
public String result1() {
return "result1";
}
}
3) result1.jsp 만들기
<%@ 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>
<h1> result 1 </h1>
</body>
</html>
4-1) RequestScope 사용해보기 (redirect를 사용해서 시험)
@Controller
public class TestController {
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
request.setAttribute("data1","문자열1");
return "redirect:/result1";
}
@GetMapping("/result1")
public String result1(HttpServletRequest request) {
//test1 매소드가 요청되었을 때 생성된 HttpServletRequest가 그대로 있다면,
//해당 데이터를 쓸 수 있을 것이다.
String data1 = (String)request.getAttribute("data1");
System.out.printf("data1 : %s\n", data1);
return "result1";
}
}
-실행결과는 어떻게 될까? >> 콘솔 창에 data1 : null 이라고 출력된다.
-test1 매서드가 호출 되었을 때 생성된 HttpServletRequest객체는, result1으로 redirect한다는 새로운 요청을 return 하였기 때문에 HttpServletRequest객체는 소멸되었다!
-test1매서드와 result1매서드의 HttpServletRequest는 다른 객체이다.
-이런 경우는 request 객체에 담으면 안된다!
4-2) RequestScope 사용해보기 (forward를 사용해서 시험)
@Controller
public class TestController {
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
request.setAttribute("data1","문자열1");
return "forward:/result1";
}
@GetMapping("/result1")
public String result1(HttpServletRequest request) {
//test1 매소드가 요청되었을 때 생성된 HttpServletRequest가 그대로 있다면,
//해당 데이터를 쓸 수 있을 것이다.
String data1 = (String)request.getAttribute("data1");
System.out.printf("data1 : %s\n", data1);
return "result1";
}
}
-실행결과는 어떻게 될까? >> 콘솔 창에 data1 : 문자열1 이라고 정상 출력된다.
-test1매서드와 result1매서드의 HttpServletRequest는 동일한 객체이다.
-forward를 쓴다면, 응답 결과가 브라우저에 아직 전달되지 않고 코드의 흐름만 이동이 된다.
-이 경우, 아직 유지되고 있는 request 객체를 jsp에까지 끌어 쓸 수 있다
5) result1.jsp에서 request 객체 사용
<%@ 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>
<h1> result 1 </h1>
<h1> data1 : ${requestScope.data1} </h1>
</body>
</html>
Model 객체를 사용한 예제
1) index.jsp 생성하기
<%@ 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>
<a href='test2'>test2</a>
</body>
</html>
2)TestController 생성
@Controller
public class TestController {
@GetMapping("/test2")
public String test2(Model model) {
model.addAttribute("data2", "문자열2");
//request 영역에 저장된다.
return "forward:/result2";
}
@GetMapping("/result2")
public String result2(Model model) {
String data2 = (String)model.getAttribute("data2");
System.out.printf("data2 : %s\n", data2);
return "forward:/result2";
}
}
3) result2.jsp 생성
<%@ 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>
<h1> result 2 </h1>
</body>
</html>
-실행결과는 어떻게 될까? >> 콘솔 창에 data1 : null 이라고 출력된다.
-model.AddAttribute 했을 때는 model이 아닌, request 영역에 저장이 된다.
-그래서 result2 매서드에서 model을 주입받아도 데이터를 가져올 수 없는 것이다.
-따라서, result2 매서드에서는 request 객체를 주입 받아야 받아서 사용할 수 있다.
@Controller
public class TestController {
@GetMapping("/test2")
public String test2(Model model) {
model.addAttribute("data2", "문자열2");
//request 영역에 저장된다.
return "forward:/result2";
}
@GetMapping("/result2")
public String result2(HttpServletRequest request) {
String data2 = (String)request.getAttribute("data2");
System.out.printf("data2 : %s\n", data2);
return "forward:/result2";
}
}
public String result2(HttpServletRequest request)
ModelAndView 객체를 사용한 예제
1) index.jsp 생성하기
<%@ 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>
<a href='test3'>test3</a>
</body>
</html>
2)TestController 생성
@Controller
public class TestController {
@GetMapping("/test3")
public ModelAndView test2(ModelAndView mv) {
mv.addObject("data3","문자열3");
mv.setViewName("forward:/result3");
//request영역에 저장된다.
return mv;
}
@GetMapping("/result3")
public String result3(HttpServletRequest request) {
String data3 = (String)request.getAttribute("data3");
System.out.printf("data3 : %s\n", data3);
return "result3";
}
}
3) result3.jsp 생성
<%@ 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>
<h1> result 3 </h1>
<h1> data3 : ${requestScope.data3} </h1>
</body>
</html>
-실행결과는 어떻게 될까? >> result3.jsp 내에 정상적으로 "문자열3"이 나타난다.
-Model객체를 사용한 예시와 같이, ModelAndView 객체에 저장된 값은 request 객체에 담기므로
-result3 매서드에서는 이를 사용하기 위해 HttpServletRequest request 객체를 주입받아 사용한다!
Bean 객체를 사용한 예제
1) DataBean1 생성하기
public class DataBean1 {
private int data1;
private int data2;
public int getData1() {
return data1;
}
public void setData1(int data1) {
this.data1 = data1;
}
public int getData2() {
return data2;
}
public void setData2(int data2) {
this.data2 = data2;
}
}
2)index.jsp 생성하기
<%@ 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>
<a href='test4'>test4</a>
</body>
</html>
2)TestController 생성
@Controller
public class TestController {
@GetMapping("/test4")
public String test4(Model model) {
Databean1 bean1 = new DataBean1();
//bean객체 생성
bean1.setData1("문자열4");
bean1.setData2("문자열5");
model.addAttribute("bean1",bean1);
//model 객체에 bean 객체를 저장
//model을 가지고 저장했기 때문에 reqeust에 저장된다.
return "forward:/result4";
}
@GetMapping("/result4")
public String result2(HttpServletRequest request) {
Databean1 bean1 = (DataBean1)request.getAttribute("bean1");
System.out.printf("bean1.data1 : %s\n", bean1.getData1());
System.out.printf("bean1.data2 : %s\n", bean1.getData2());
return "result4";
}
}
3) result2.jsp 생성
<%@ 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>
<h1> bean1.data1 : ${requestScope.bean1.data1} </h1>
<h1> bean1.data2 : ${requestScope.bean1.data2} </h1>
</body>
</html>
-실행결과는 어떻게 될까? >> 콘솔 창에 data3 : 문자열3 data4 : 문자열4 라고 정상 출력된다.
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 component-scan 개념 및 동작 과정 (0) | 2021.07.27 |
---|---|
[SPRING] RequestScope Bean 주입 (0) | 2021.07.26 |
[SPRING] Redirect와 Forward (0) | 2021.07.24 |
[SPRING] FORM TAG 요소 - 2 (0) | 2021.07.23 |
[SPRING] FORM TAG 요소 - 1 (0) | 2021.07.21 |
댓글