ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • requestScope
    웹페이지 제작을 위한 스프링공부 2020. 5. 5. 13:43

     

    원리

    1.브라우저에서 서버로 요청관련된 정보를 전송

    2.브라우저로부터 온 정보를 보관하기위해 httpServletRequest객체를 생성해 보관

    3.응답결과가 전달될 때 까지 httpServletRequest객체는 유지가된다

     

     

    새로운 요청이 발생하고 브라우저에 전달 될 때 까지 request객체를 사용할 수 있는데 이 사용범위를 requestscope이라고 부른다

     

    redirect와 forward에서는 request객체가 어떻게 생성 소멸될까?

     

        @GetMapping("/test1")//redirect와 같은 경우 브라우저에게 result1을 요청하기때문에 객체가 다시 생성되서 현재 메소드에서 생성한 객체의 값을 불러올 수 없다 하지만 forward는 서버상에서 이동하는것이기 때문에 request객체가 소멸되지않음
    	public String test1(HttpServletRequest request) {
    		request.setAttribute("data1", "문자열1");
    		return "redirect:/result1";
    	}
    	
    
    	
    	@GetMapping("/result1")
    	public String result1(HttpServletRequest request) {
    		
    		String data1 = (String)request.getAttribute("data1");
    		System.out.printf("data1 : %s\n", data1);
    		
    		return "result1";
    	}

    test1메소드에서 request객체에 값을 주입한후 result1메소드에서 출력을 해보면 그 결과를 알 수 있다.

     

    redirect

    redirect와 같은경우 출력값이 data1:null이 나왔다 이 말은 request객체가 data1값이 없어졌다는 소리이다.

    redirect는 브라우저에게 result1.jsp를 실행해달라고 요청을 하는것 이기때문에 브라우저는 새로운 request객체를 생성해버린다 그렇기 때문에 이전객체가 소멸됨과 동시에 데이터 값이 소멸되버린다

     

    forward

    forward와 같은경우 서버상에서의 이동이기 때문에 request객체가 소멸되지 않고 전달된다 

    따라서 출력값이 data1:문자열1로 잘 출력되었다

     

    여기서 난 그럼 그냥 문자열만 return할땐 어떨까?라는 생각을 해서 실험을 해보았다.

    	//return result1이라고 해도 request객체가 전달됨 소멸되지않음
    	  @GetMapping("/test1")
           public String test1(HttpServletRequest request) {
    	   request.setAttribute("data1", "문자열1");
           return "result1";
         }
    	
    	
    	@GetMapping("/result1")
    	public String result1(HttpServletRequest request) {
    		
    		String data1 = (String)request.getAttribute("data1");
    		System.out.printf("data1 : %s\n", data1);
    		
    		return "result1";
    	}

     

    문자열 return인 경우도 forward처럼 request객체가 소멸되지않고 데이터값이 잘 출력되었다.

     

     

    model객체 주입후 데이터불러오기

     

    model객체도 결국엔 request영역에 담겨서 전송되기때문에 request객체의 메소드를 사용해야 값을 출력할 수 있다.

    model.getAttribute하면 값이 출력되지않음 ->request.getAttribute

     

    modelandview객체 주입후 데이터 불러오기

     

    modelandview객체 또한 데이터가 request객체에 담기기 때문에 request객체의 메소드를 사용해야 값을 출력할 수 있다.

     

    객체에 데이터 주입후 데이터 불러오기

    package kr.co.softcampus.beans;
    
    public class DataBean1 {
    	
    	private String data1;
    	private String data2;
    	
    	public String getData1() {
    		return data1;
    	}
    	public void setData1(String data1) {
    		this.data1 = data1;
    	}
    	public String getData2() {
    		return data2;
    	}
    	public void setData2(String data2) {
    		this.data2 = data2;
    	}
    	
    	
    }
    

     

    	@GetMapping("/test5")
    	public String test5(@ModelAttribute("bean1") DataBean1 bean1) {
    		bean1.setData1("문자열6");
    		bean1.setData2("문자열7");
    		
    		return "result5";
    	}
    	

     

    <%@ 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>result5</h1>
    	<h3>bean1.data1 : ${requestScope.bean1.data1 }</h3>
    	<h3>bean1.data2 : ${requestScope.bean1.data2 }</h3>
    </body>
    </html>

     

    객체의 데이터가 request영역에 담기기 때문에 requestScope를 사용하면 데이터가 잘 출력됨

     

    forward를 사용하여 객체 데이터 넘겨보기

     

        	@GetMapping("/test5")
    	public String test5(@ModelAttribute("bean1") DataBean1 bean1) {
    		bean1.setData1("문자열6");
    		bean1.setData2("문자열7");
    		
    		return "forward:/result5";
    	}
    	
    	@GetMapping("/result5")
    	public String result5(@ModelAttribute("bean1") DataBean1 bean1) {
    		System.out.println("bean1.data1:"+bean1.getData1());
    		System.out.println("bean1.data2:"+bean1.getData2());
    		return "result5";
    	}

     

    이렇게 test5에서 생성한 bean1객체의 데이터를 result5에서 호출해서 출력해봤지만 null값이 나왔다 그 이유는 result5에서 주입받은 bean1객체는 초기화처럼 새로운 bean1객체를 주입받기때문에 이전 데이터가 다 사라져있다

     

    그럼 어떻게 하면 제대로 데이터를 받을 수 있을까?

     

    @GetMapping("/result5")
    	//public String result5(@ModelAttribute("bean1") DataBean1 bean1) {
    	public String result5(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 "result5";
    	}

    객체의 데이터 또한 request영역에 담기기 때문에 다음과 같이 HttpServletRequest를 주입받은후 request영역에 있는bean1객체를 불러온후 getter를 사용하여 값을 불러오면 된다.

    '웹페이지 제작을 위한 스프링공부' 카테고리의 다른 글

    Session  (0) 2020.05.07
    RequestScope 빈 주입  (0) 2020.05.06
    redirect forward  (0) 2020.05.04
    Form 요소2  (0) 2020.05.04
    Form 요소1  (0) 2020.05.04
Designed by Tistory.