Day 86, 87

dokiru·2023년 5월 31일
0

학원

목록 보기
47/51

퀴즈 피드백
1. type 전달. (a+b)
=> 화면에서 구분해서 출력


2. type보고 a or b만 전달
=> 화면에서 그냥 출력


3. type보고 화면 자체를 다르게 구분
=> 각자 다른 화면에서는 그냥 출력


redirect와 forward

redirect

  • 클라이언트 쪽에서 요청
  • 사용자에게 다시 요청해라! 다른 페이지로 이동

redirect로 데이터 전달

  • redirect는 request객체를 유지할 수가 없다 (페이지를 새로 요청하면서 새로운 request객체가 만들어지기 때문에)
  • 그래서 브라우저가 유지되는 동안 저장해서 값을 불러올 수 있는 sessionScope에 값을 저장

ex.
화면 페이지

<%@ 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>flowsession</h1>
  	<%-- 세션 안에 있는 값에 접근 --%>
	<p>sessionKey: ${sessionScope.sessionKey}</p>
    <p>requestKey: ${requestScope.sessionKey}</p>
	<hr />
    <%-- request 안에 있는 값에 접근 --%>
	<p>${requestScope.pd1.category} ${pd1.product}</p>
	<p>${sessionScope.pd2.category} ${pd2.product}</p>
</body>
</html>

controller 코드

@RequestMapping("/flowsession")
	public String flowsession(HttpServletRequest request) {
		HttpSession session = request.getSession();
		// 변수의 범위가 다르다 (session 범위)
		// 브라우저가 유지가 되는 동안에 접근을 할 수 있는 session에 저장된 값
		session.setAttribute("sessionKey", "sessionValue값");
		
		// 변수의 범위가 다르다 (request 범위)
		// session에 넣은 값을 request에도 넣어줌
		request.setAttribute("sessionKey", "sessionValue값");
		return "flowsession";
	}
    
@RequestMapping("/flowsession2")
	public String flowsession2(HttpServletRequest request) {
		// 자체적으로 바꾸는 게 없고 저장되어 있는 값 출력하는 용도
		return "flowsession2";
	}
	
@RequestMapping("/flowsession3")
	public String flowsession3(HttpSession session, Model model) {
		// session을 받아다가 새로 저장
		session.setAttribute("sessionKey", "session 받아다가 저장함.");
		
        // dto 가져와서 model에 저장 -> request로 넘겨짐
		ProductDto pd1 = new ProductDto();
		pd1.setCategory("pd1 cate");
		pd1.setProduct("pd1 prod");
		model.addAttribute("pd1", pd1); // request범위
        model.addAttribute("sessionKey", "request에 넣는 key값"); // request범위
		
		ProductDto pd2 = new ProductDto();
		pd2.setCategory("pd2 cate");
		pd2.setProduct("pd2 prod");
		session.setAttribute("pd2", pd2);
		
		return "flowsession";
	}
	
  • flowsession 페이지
  • flowsession3 페이지

: pd1은 request단에 넘겨주고, pd2는 session단에 넘겨줌
: flowsession페이지를 다시 들어가면 session단에 저장된 pd2의 값만 화면에 보여질 것

  • flowsession2 페이지

: flowsession3을 갔다가 2를 가면 session에 새롭게 저장된 값인 "session 받아다가 저장함." 값이 뜨지만, flowsession을 갔다가 2를 가면 "sessionValue값"이 화면에 뜸

(flowsession을 갔다가 2를 간 경우)


forward

  • 서버 쪽에서 요청
  • 사용자에게 보여줄 화면을 다른 쪽으로 조정

ex. flowmain 페이지에서 flowRedirect, flowForward 요청 추가

  • /flowRedirect 페이지로 갔을 때

    : 리다이렉트 갔다가 메인으로 재연결 (주소도 flowmain으로 바뀜)
    : redirect:flowmain을 리턴하면, 클라이언트 쪽에서 서버에 다시 flowmain을 요청, flowmain 리턴

  • /flowForward 페이지로 갔을 때

    : flowForward만 연결, 주소는 그대로고 화면만 flowmain
    : forward:flowmain 리턴, 서버 단에서 바로 flowmain에 요청 보내고, flowmain 리턴

forward로 데이터 전달

  • model에 데이터를 저장하고 forward로 화면만 바꿔준다고 해서 데이터를 보여주는 화면에서 model로 접근할 수 X
  • 데이터를 표시하려고 하는 화면 단에서 request로 접근해야함

ex.

@RequestMapping("/flowmain")
	public String flowMain(HttpServletRequest req) {
		System.out.println("flowmain 들어옴");
        // 객체 타입으로 넘어와서 String으로 변환해줘야함
		String fwd1 = (String)req.getAttribute("fwd1");
		System.out.println("forward에서 넘어온 값: " + fwd1);
		return "flowmain";
	}
        
@RequestMapping("/flowForward")
	public String flowForward(Model model) {
		System.out.println("flowforward 들어옴");
		model.addAttribute("fwd1", "forward로 전달하는 값");
		return "forward:/flowmain";
	}
  • 바로 flowmain으로 들어갔을 때

  • flowForward에서 타고 flowmain으로 갔을때

+ Redirect VS, Forward (Redirect와 forward의 차이)
리다이렉트(Redirect)와 포워드(Forward)의 차이는 무엇인가?

: 리다이렉트는 클라이언트의 요청에 의해 서버의 DB에 변화가 생기는 작업에 사용 (요청을 중복해서 보내는 것을 방지), 포워드는 특정 URL에 대해 외부에 공개되지 말아야하는 부분을 가리는데 사용하거나 조회를 위해 사용

pagescope

: 선언된 한 페이지 내에서만 사용할 수 있는 scope (가장 작은 단위)

sessionscope

: 세션 객체가 생성돼서 이 세션 객체가 소멸될때까지
: 여러 개의 요청이 들어와도 계속 남아있는 scope

applicationscope

: 하나의 애플리케이션이 생성되서 이 애플리케이션이 소멸(종료)될 때까지 계속 유지되는 scope

requestscope

: 클라이언트로부터 요청이 들어와서 서버가 어떤 일들을 수행한 다음에 응답을 보낼 때까지 계속 사용할 수 있는 scope

(출처 : scope의 4가지 종류 - BE)

ex.

	 if(true)
		{
			//application scope
			int a = 10;
			if(true)
			{
				//session scope
				int b = 20;
				if(true) 
				{
					int c = 30;		
					//request scope
				}
				if(true) 
				{
					int d = 40;
					//request scope
				}
				if(true) 
				{
					//request scope
				}
			}
			if(true)
			{
				//session scope
				int b = 50;
				if(true) 
				{
					//request scope
				}
				if(true) 
				{
					//request scope
				}
				if(true) 
				{
					//request scope
				}
			}
		}
profile
안녕하세요!

0개의 댓글