-
RequestScope 빈 주입웹페이지 제작을 위한 스프링공부 2020. 5. 6. 14:43
java
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; } }
package kr.co.softcampus.controller; import javax.servlet.http.HttpServletRequest; 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 org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.servlet.ModelAndView; import kr.co.softcampus.beans.DataBean1; @Controller public class TestController { @Autowired//type을 통한 주입을 받게됨 DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서) //test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨 @GetMapping("/test1") public String test1(HttpServletRequest request) { requestBean1.setData1("문자열1"); requestBean1.setData2("문자열2"); return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용) } @GetMapping("/result1") public String result1() { System.out.println("requestBean1.data1:"+requestBean1.getData1()); System.out.println("requestBean1.data2:"+requestBean1.getData2()); return "result1"; } }
package kr.co.softcampus.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.annotation.RequestScope; import kr.co.softcampus.beans.DataBean1; import kr.co.softcampus.beans.DataBean2; // 프로젝트 작업시 사용할 bean을 정의하는 클래스 @Configuration public class RootAppContext { @Bean @RequestScope// bean이 주입되는 시점이 새로운 요청이 발생했을 때 bean을 주입한다는 의미 public DataBean1 dataBean1() { return new DataBean1(); } }
정리
1.controller에 타입으로 주입받겠다고 명시
2..정의되어져있는 bean들 중에 DataBean1을 반환하는 메소드를 찾아서 호출
3.Scope가 requestScope가 붙어져있음
4.이말은 즉슨 1번의 bean이 주입되는 시점이 새로운 요청이 발생했을 때 bean을 주입한다는 의미
5.controller에서 test1을 요청하게되면 bean이 자동 주입됨
6.그것을 활용하여 forward함 forward는 서버상의 이동이기에 새로운 요청이 발생하지 않아서 test1요청시 만들어진 bean을 사용
7.requestScope 는 bean객체가 주입되는 시점을 설정하는것이지 request영역에 bean객체를 저장한다 그런 의미는 아님따라서 jsp에서 사용하려면 model객체를 주입받아 값을 넘겨야함
결과
requestBean1.data1:문자열1
requestBean1.data2:문자열2jsp로 값 넘겨보기
@GetMapping("/result1") public String result1(Model model) { System.out.println("requestBean1.data1:"+requestBean1.getData1()); System.out.println("requestBean1.data2:"+requestBean1.getData2()); model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다 return "result1"; }
model객체를 활용
<%@ 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>result1</h1> <h3>requestBean1.data1:${requestScope.requestBean1.data1}</h3> <h3>requestBean1.data1:${requestScope.requestBean1.data2}</h3> </body> </html>
결과창
xml
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; } }
package kr.co.softcampus.controller; import javax.servlet.http.HttpServletRequest; 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 org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.servlet.ModelAndView; import kr.co.softcampus.beans.DataBean1; @Controller public class TestController { //새로운 요청이 발생하지 않았는데도 bean을 주입하려고 시도를 함 하지만 bean이 requestScope로 설정되어있어서 에러가 날 수 있음,해결방안:다양함 @lazy를 붙여서 나중에 주입하도록하는 방법(서버가 가동이 될 때 자동으로 주입되지 않고 일단 대기하고 있다가 실제 request요청이 발생했을때 bean이 주입됨 @Autowired//type을 통한 주입을 받게됨 @Lazy DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서) //test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨 @GetMapping("/test1") public String test1(HttpServletRequest request) { requestBean1.setData1("문자열1"); requestBean1.setData2("문자열2"); return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용) } @GetMapping("/result1") public String result1(Model model) { System.out.println("requestBean1.data1:"+requestBean1.getData1()); System.out.println("requestBean1.data2:"+requestBean1.getData2()); model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다 return "result1"; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class='kr.co.softcampus.beans.DataBean1' scope='request'/> </beans>
java와 달리 root-context에서 bean을 정의
<%@ 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>result1</h1> <h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3> <h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3> </body> </html>
결과창
byname
java
package kr.co.softcampus.beans; public class DataBean2 { private String data3; private String data4; public String getData3() { return data3; } public void setData3(String data3) { this.data3 = data3; } public String getData4() { return data4; } public void setData4(String data4) { this.data4 = data4; } }
package kr.co.softcampus.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.annotation.RequestScope; import kr.co.softcampus.beans.DataBean1; import kr.co.softcampus.beans.DataBean2; // 프로젝트 작업시 사용할 bean을 정의하는 클래스 @Configuration public class RootAppContext { @Bean @RequestScope public DataBean1 dataBean1() { return new DataBean1(); } @Bean("requestBean2")//bean객체의 이름을 부여=byname @RequestScope public DataBean2 dataBean2() { return new DataBean2(); } }
package kr.co.softcampus.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; 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 org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.servlet.ModelAndView; import kr.co.softcampus.beans.DataBean1; import kr.co.softcampus.beans.DataBean2; @Controller public class TestController { @Autowired//type을 통한 주입을 받게됨 DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서) @Resource(name="requestBean2")//이름을 통한 주입에는 Resource DataBean2 requestBean2; //test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨 @GetMapping("/test1") public String test1(HttpServletRequest request) { requestBean1.setData1("문자열1"); requestBean1.setData2("문자열2"); requestBean2.setData3("문자열3"); requestBean2.setData4("문자열4"); return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용) } @GetMapping("/result1") public String result1(Model model) { System.out.println("requestBean1.data1:"+requestBean1.getData1()); System.out.println("requestBean1.data2:"+requestBean1.getData2()); System.out.println("requestBean1.data3:"+requestBean2.getData3()); System.out.println("requestBean1.data4:"+requestBean2.getData4()); model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다 model.addAttribute("requestBean2",requestBean2); return "result1"; } }
<%@ 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>result1</h1> <h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3> <h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3> <h3>requestBean2.data3 : ${requestScope.requestBean2.data3 }</h3> <h3>requestBean2.data4 : ${requestScope.requestBean2.data4 }</h3> </body> </html>
결과창
xml
package kr.co.softcampus.beans; public class DataBean2 { private String data3; private String data4; public String getData3() { return data3; } public void setData3(String data3) { this.data3 = data3; } public String getData4() { return data4; } public void setData4(String data4) { this.data4 = data4; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class='kr.co.softcampus.beans.DataBean1' scope='request'/> <bean id='requestBean2' class='kr.co.softcampus.beans.DataBean2' scope='request'/> //id속성을 써서 이름을 부여 </beans>
package kr.co.softcampus.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; 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 org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.servlet.ModelAndView; import kr.co.softcampus.beans.DataBean1; import kr.co.softcampus.beans.DataBean2; @Controller public class TestController { //새로운 요청이 발생하지 않았는데도 bean을 주입하려고 시도를 함 하지만 bean이 requestScope로 설정되어있어서 에러가 날 수 있음,해결방안:다양함 @lazy를 붙여서 나중에 주입하도록하는 방법(서버가 가동이 될 때 자동으로 주입되지 않고 일단 대기하고 있다가 실제 request요청이 발생했을때 bean이 주입됨 @Autowired//type을 통한 주입을 받게됨 @Lazy DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서) @Resource(name="requestBean2") @Lazy DataBean2 requestBean2; //test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨 @GetMapping("/test1") public String test1(HttpServletRequest request) { requestBean1.setData1("문자열1"); requestBean1.setData2("문자열2"); requestBean2.setData3("문자열3"); requestBean2.setData4("문자열4"); return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용) } @GetMapping("/result1") public String result1(Model model) { System.out.println("requestBean1.data1:"+requestBean1.getData1()); System.out.println("requestBean1.data2:"+requestBean1.getData2()); System.out.println("requestBean1.data3:"+requestBean2.getData3()); System.out.println("requestBean1.data4:"+requestBean2.getData4()); model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다 //xml에서는 id를 준 bean은 model을 활용하여 값을 넘겨줄 필요가없다 왜냐 bean이 주입될때 request영역에 자동으로 저장됨 return "result1"; } }
<%@ 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>result1</h1> <h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3> <h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3> <h3>requestBean2.data3 : ${requestScope.requestBean2.data3 }</h3> <h3>requestBean2.data4 : ${requestScope.requestBean2.data4 }</h3> </body> </html>
결과창
'웹페이지 제작을 위한 스프링공부' 카테고리의 다른 글
session scope (0) 2020.05.08 Session (0) 2020.05.07 requestScope (0) 2020.05.05 redirect forward (0) 2020.05.04 Form 요소2 (0) 2020.05.04