SPRING

[SPRING] Request Scope

예나부기 2021. 7. 25.

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

댓글