ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Session
    웹페이지 제작을 위한 스프링공부 2020. 5. 7. 14:25

    package kr.co.softcampus.controller;
    
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    
    
    
    
    
    @Controller
    public class TestController {
    	@GetMapping("/test1")
    	public String test1(HttpServletRequest request) {//session은 request 영역으로 추출
    		
    		HttpSession session = request.getSession();
    		session.setAttribute("data1", "문자열1");
    		return "test1";
    	}
    	
    	@GetMapping("/result1")
    	public String result1(HttpServletRequest request) {
    		HttpSession session = request.getSession();
    		String data1 = (String)session.getAttribute("data1");
    		
    		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>
    	<a href='test1'>test1</a><br/>
    	<a href='result1'>result1</a><br/>
    </body>
    </html>

    index.jsp

     

    <%@ 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>test1</h1>
    	<h3>세션 영역에 저장완료</h3>
    </body>
    </html>

     

    test1.jsp

     

    <%@ 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>data1: ${sessionScope.data1 }</h3>
    </body>
    </html>
    
    
    
    
    
    
    
    

    result.jsp

     

    결과창

     

     

    	@GetMapping("/test1")
    	public String test1(HttpServletRequest request) {//session은 request 영역으로 추출
    		
    		HttpSession session = request.getSession();
    		session.setAttribute("data1", "문자열1");
    		return "test1";
    	}
        
        ->위는 jsp servlet과 동일한 session동작방법
    	
    	@GetMapping("/test1")
    	public String test1(HttpSession session) {//session을 바로주입
    		
    		session.setAttribute("data1", "문자열1");
    		return "test1";
    	}
    	
        ->밑에 방법이 spring 에서 session을 주입받고 바로 session을 사용하는 방법

     

    정석은 request객체로 부터 추출받아야하지만 spring에서는 객체를 바로 주입할 수 있다.

     

    @GetMapping("/test2")
    	public String test2(HttpSession session) {//session은 request 영역으로 추출
    		
    		session.setAttribute("data1", "문자열2");
    		return "redirect:/result1";
    	}
    	
    	@GetMapping("/test3")
    	public String test3(HttpSession session) {//session은 request 영역으로 추출
    		
    		session.setAttribute("data1", "문자열3");
    		return "forward:/result1";
    	}
    	
    	
    	@GetMapping("/result1")
    	public String result1(HttpServletRequest request) {
    		HttpSession session = request.getSession();
    		String data1 = (String)session.getAttribute("data1");
    		
    		return "result1";
    	}

    다음과 같이 redirect와 forward도 session값이 잘 넘어가는것을 확인 

     

    redirect는 응답결과로 브라우저한테 너 result1을 요청해라 라고 응답결과를 요청 이를 통해 새로운 요청이 발생된다

    session역역은 브라우저만 유지된다면(브라우저가 바뀌지 않는다면) 새로운 요청이 발생하든 forward로 이동하든 관계없이 데이터값이 계속 저장됨

     

    bean을 저장해서 사용

     

    객체 데이터를 session에 저장

    package kr.co.softcampus.beans;
    
    public class DataBean1 {
    	public String data1;
    	public 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("/test4")
    	public String test4(HttpSession session,DataBean1 bean1) {//객체와 세션 주입
    		bean1.setData1("문자열4");
    		bean1.setData2("문자열5");
    		session.setAttribute("bean1",bean1);//객체를 세션에 주입
    		return "test4";
    	}
        
    	@GetMapping("/result4")
    	public String result4(HttpSession session) {
    		DataBean1 bean1 = (DataBean1)session.getAttribute("bean1");
    		
    		return "result4";
    	}
    	

     

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

    출력창

     

     

     

    sessionattribute로 객체 사용

    @GetMapping("/result4")
    	public String result4(@SessionAttribute("bean1") DataBean1 bean1) {//session영역에 bean1이라고 저장된 객체를 bean1에 주입해줌
    	
    		
    		return "result4";
    	}

     

    session에 객체의 데이터값을 저장할때도 sessionattribute가 활용되는시 실험해보았다

    @GetMapping("/test4")
    	public String test4(@SessionAttribute("bean1") DataBean1 bean1) {//session은 request 영역으로 추출
    		bean1.setData1("문자열4");
    		bean1.setData2("문자열5");
    		
    		return "test4";
    	}
    	

    하지만 에러가 발생했다 에러 내용은 session 내에 bean1이라는 객체가 없다는 내용이었다 

    이를 봤을때 이미 bean1이라는 이름으로 저장된 객체를 주입받는거지 새로운객체가 만들어지면서 bean1에 저장되는것이 아니다 modelattribute와 다름

     

    따라서 최초에 session에 저장할 때 session을 주입받은후 session영역에 직접 저장해야함

     

    SessionAttributes

     

     

    @SessionAttributes("sessionBean1")//이 컨트롤러에서 sessionBean1이라는 이름으로 modelattribute를 통해서 주입받는 객체는 request영역에 아닌 session영역에 저장하겟습니다

     

    @ModelAttribute("sessionBean1")//새로운 요청이 발생하면 sessionBean1이라는 이름으로 등록되어져잇는 메소드가 자동호출되고 반환하는 객체주소값을 sessionBean1이라는 이름으로 session에 저장함
    	public DataBean1 sessionBean1() {
    		return new DataBean1();
    	}
    	

     

    @GetMapping("/test5")
    	public String test5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1) {//DataBean1 타입의 객체가 새로 하나 생성이되서 주입이되고 sessionBean1이라는 이름으로 request영역에 저장이됨
    	
    		sessionBean1.setData1("문자열6");//sessoinBean1이라는 이름으로 session에 저장되있는 sessionBean1객체를 주입
    		sessionBean1.setData2("문자열7");
    		
    		return "test5";
    	}
    	
    	@GetMapping("/result5")
    	public String result5(@ModelAttribute("sessionBean1") DataBean1 sessionBean1)
    	{
    		System.out.println(sessionBean1.getData1());
    		System.out.println(sessionBean1.getData2());
    		
    		return "result5";
    	}
    	

     

     

    브라우저가 최초의 요청을 발생하게되면 sessionBean1이라는 이름으로 등록된 메소드를찾아서 호출을해서 메소드가 반환하는 객체주소값을 sessionBean1이라는 이름으로 session영역에 저장

     

    주소와 매핑되어져있는 메소드가 호출될때(@ModelAttribute("sessionBean1") DataBean1 sessionBean1)

    sessionBean1 객체의 주소값을 가져와서  DataBean1에 주입시켜줌

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

    application scope  (0) 2020.05.08
    session scope  (0) 2020.05.08
    RequestScope 빈 주입  (0) 2020.05.06
    requestScope  (0) 2020.05.05
    redirect forward  (0) 2020.05.04
Designed by Tistory.