ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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:문자열2

     

    jsp로 값 넘겨보기

    @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
Designed by Tistory.