카테고리 없음
[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";
}
}
- 이런저런 테스트 기록