카테고리 없음

[Spring] RequestScope

321 2021. 4. 27. 13:43

 

아래와 같은 코드를 써서 실행한다고 해보자.

package kr.co.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;

import kr.co.beans.DataBean1;

@Controller
public class TestController {
	
    //--------------------1----------------------
	@GetMapping("/test1")
	public String test1(HttpServletRequest request) {
		
		request.setAttribute("data1", "테스트1");
		
		return "forward:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(HttpServletRequest request) {
		
		String data1 = (String)request.getAttribute("data1");
		System.out.println(data1);
		
		return "result1";
	}
	
    //--------------------2----------------------
	@GetMapping("/test2")
	public String test2(Model model) {
		
		model.addAttribute("data2", "테스트2");
		
		return "forward:/result2";
	}
	
	@GetMapping("/result2")
	public String result2(HttpServletRequest request) {
		
		String data2 = (String)request.getAttribute("data2");
		System.out.println(data2);
		
		return "result2";
	}
	
    //--------------------3----------------------
	@GetMapping("/test3")
	public ModelAndView test3(ModelAndView mv) {
		
		mv.addObject("data3", "테스트3");
		mv.setViewName("forward:/result3");
		
		return mv;
	}
	
	@GetMapping("/result3")
	public String result3(HttpServletRequest request) {
		
		String data3 = (String)request.getAttribute("data3");
		System.out.println(data3);
		
		return "result3";
	}
	
    //--------------------4----------------------
	@GetMapping("/test4")
	public String test4(Model model) {
		
		DataBean1 bean1 = new DataBean1();
		bean1.setData1("테스트4");
		bean1.setData2("테스트5");
		
		model.addAttribute("bean1", bean1);
		
		return "forward:/result4";
	}
	
	@GetMapping("/result4")
	public String result4(HttpServletRequest request) {
		
		DataBean1 bean1 = (DataBean1)request.getAttribute("bean1");
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		return "result4";
		
	}
	
    //--------------------5----------------------
	@GetMapping("/test5")
	public String test5(@ModelAttribute("bean1") DataBean1 bean1) {
		
		bean1.setData1("테스트6");
		bean1.setData2("테스트7");
		
		return "test5";
		
	}
	
	@GetMapping("/test55")
	public String test55(@ModelAttribute("bean1") DataBean1 bean1) {
		
		bean1.setData1("테스트6");
		bean1.setData2("테스트7");
		
		return "forward:/result55";
		
	}
	
	@GetMapping("/result5")
	public String result5(@ModelAttribute("bean1") DataBean1 bean1) {
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		return "result5";
	}
	
	
	@GetMapping("/result55")
	public String result55(HttpServletRequest request) {
		DataBean1 bean1 = (DataBean1)request.getAttribute("bean1");
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		return "result5";
	}
	

}

//--------------------1----------------------

  • test1() 메서드에서 request를 사용해서 data1을 설정 해줘도 리턴값으로 redirect를 쓰면 request객체가 보냄과 동시에 소멸되므로 result1()에서 null값이 프린트된다.
  • test1()에서 return "forword:/result1"; 으로 포워드를 쓰면 request객체가 다음으로 넘어간다.
  • 또, 아래 그림과 같이 result1.jsp파일을 만들어주면 결과도 잘 나온다. 

 

 

//--------------------2,3----------------------

  • Model을 사용해서 forward로 보내면 request영역에 저장된다. 그래서 받을때도 HttpServletRequest로 받으면 된다.(Model로 받아보려고 했더니 getAttribute자체가 없었음,,,toString()해도 아무것도 안뜸..)
  • 여기서도 result2.jsp에 ${requestScope.data2}해서 받을 수 있음
  • ModelAndView도 같음. setViewName할때는 ("forward:/result3")이렇게 하면됨

 

 

//--------------------4,5----------------------

  • 데이터빈 클래스를 만들어서 담아 사용해도 원리는 같다.
  • ----5----에서 result5()함수처럼 ModelAttribute로 데이터빈을 받아오면 받아오는 순간에 다시 재 정의가 되므로 getData1,2를 해도 값이 전송되지 않음
  • result55()함수처럼 HttpServlerRequest객체를 사용해서 받아오면 리퀘스트에 저장된 데이터의 값이 받아져와서 아래 그림과같이 jsp에서도 사용될 수 있게 출력된다.

 

 

package kr.co.controller;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import kr.co.beans.DataBean1;
import kr.co.beans.DataBean2;

@Controller
public class TestController {
	
	@Autowired
	DataBean1 requestBean1;
	
	//이름을 통한 주입일때 Resource사용
	@Resource(name="requestBean2")
	DataBean2 requestBean2;
	
	//java로 빈 주입
	@GetMapping("/test1")
	public String test1(){
		
		requestBean1.setData1("테스트1");
		requestBean1.setData2("테스트2");
		
		//@Resource테스트
		requestBean2.setData3("테스트3");
		requestBean2.setData4("테스트4");
		
		return "forward:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(Model model) {
		
		System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
		System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
	
		// autowired된 requestBean1을 사용해서 getData를 하면 test1()에서 setData한 내용을 가져온다는 의미
		// request에 저장하는 것과는 다름--> jsp에서 나타나지 않음
		
		model.addAttribute("requestBean1", requestBean1);
		//그래서 model객체에 '저장'해주어야함
		
		
		System.out.printf("requestBean2.data1 : %s\n", requestBean2.getData3());
		System.out.printf("requestBean2.data2 : %s\n", requestBean2.getData4());
		
		model.addAttribute("requestBean2", requestBean2);
		
		return "result1";
	}
	
	
	
	//xml로 빈 주입
	
	
	

}

 

 

package kr.co.controller;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import kr.co.beans.DataBean1;
import kr.co.beans.DataBean2;

@Controller
public class TestController2 {
	
	@Autowired
	@Lazy   //xml로 빈 주입할때 scope를 request로 해서 자동실행되서 오류나지 않게함.
	DataBean1 requestBean1;
	
	@Resource(name="requestBean2")
	@Lazy
	DataBean2 requestBean2;
	
	
	//java로 빈 주입
	@GetMapping("/test1")
	public String test1(){
		
		requestBean1.setData1("테스트1");
		requestBean1.setData2("테스트2");
		
		
		//@Resource테스트
		requestBean2.setData3("테스트3");
		requestBean2.setData4("테스트4");
		
		
		return "forward:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(Model model) {
		
		System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
		System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
	
		// autowired된 requestBean1을 사용해서 getData를 하면 test1()에서 setData한 내용을 가져온다는 의미
		// request에 저장하는 것과는 다름--> jsp에서 나타나지 않음
		
		model.addAttribute("requestBean1", requestBean1);
		//그래서 model객체에 '저장'해주어야함
		
		
		//@Resource부분
		System.out.printf("requestBean2.data1 : %s\n", requestBean2.getData3());
		System.out.printf("requestBean2.data2 : %s\n", requestBean2.getData4());
		
		//model.addAttribute("requestBean2", requestBean2);
		//xml파일에서 id, scope를 지정해줬을경우 request영역에 자동 저장된다.
		
		return "result1";
	}
	
	
	
	
	
	

}

 

 

 

 

 

 

  • 이런저런 테스트 기록