퀴즈 피드백
1. type 전달. (a+b)
=> 화면에서 구분해서 출력
2. type보고 a or b만 전달
=> 화면에서 그냥 출력
3. type보고 화면 자체를 다르게 구분
=> 각자 다른 화면에서는 그냥 출력
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";
}
: pd1은 request단에 넘겨주고, pd2는 session단에 넘겨줌
: flowsession페이지를 다시 들어가면 session단에 저장된 pd2의 값만 화면에 보여질 것
: flowsession3을 갔다가 2를 가면 session에 새롭게 저장된 값인 "session 받아다가 저장함." 값이 뜨지만, flowsession을 갔다가 2를 가면 "sessionValue값"이 화면에 뜸
(flowsession을 갔다가 2를 간 경우)
ex. flowmain 페이지에서 flowRedirect, flowForward 요청 추가
/flowRedirect 페이지로 갔을 때
: 리다이렉트 갔다가 메인으로 재연결 (주소도 flowmain으로 바뀜)
: redirect:flowmain을 리턴하면, 클라이언트 쪽에서 서버에 다시 flowmain을 요청, flowmain 리턴
/flowForward 페이지로 갔을 때
: flowForward만 연결, 주소는 그대로고 화면만 flowmain
: forward:flowmain 리턴, 서버 단에서 바로 flowmain에 요청 보내고, flowmain 리턴
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에 대해 외부에 공개되지 말아야하는 부분을 가리는데 사용하거나 조회를 위해 사용
: 선언된 한 페이지 내에서만 사용할 수 있는 scope (가장 작은 단위)
: 세션 객체가 생성돼서 이 세션 객체가 소멸될때까지
: 여러 개의 요청이 들어와도 계속 남아있는 scope
: 하나의 애플리케이션이 생성되서 이 애플리케이션이 소멸(종료)될 때까지 계속 유지되는 scope
: 클라이언트로부터 요청이 들어와서 서버가 어떤 일들을 수행한 다음에 응답을 보낼 때까지 계속 사용할 수 있는 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
}
}
}