BackEnd/Java

[Servlet/JSP]Redirect(재 요청)

Hojung7 2024. 8. 16. 16:05
▶ Redirect(재요청)

클라이언트의 요청을 받은 Servlet/JSP에서

직접 응답하지 않고

다른 Servlet/JSP를 다시 요청 하는 것

 

1)  보통 Servlet 요청 처리 후 특정 JSP로 요청을 위임해

결과 화면을 응답해 주는 것이 아닌다른 Servlet을 다시 요청하여

다른 Servlet의 결과 화면을 응답해줌

(요청 받은 Servlet이 응답해줄 JSP가 없음)

 

2) redirect는 다시 요청 하는 것!!!

→ 기존 client의 req, resp 객체가 "사라지고" 새로운 "req, resp 객체가 생성"된다!!!

 

 request scope에 세팅된 값들이 모두 사라짐!!

 

3) redirect는 응답 화면의 주소가

처음 요청한 Servlet 주소가 아닌

다시 요청한 Servlet 주소로 변경된다!

 

- 다른 Servlet을 요청하기 위해서는

"요청 주소"를 작성해야 한다

 

#예제

  <form action="/fr/redirect">
    redirect 입력 1 : <input type="text" name="redirectInput1">
    <br>
    redirect 입력 2 : <input type="text" name="redirectInput2">
    <button>redirect 확인하기</button>
  </form>

 

[Servlet]

package edu.kh.jsp2.controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

@WebServlet("/fr/redirect")
public class RedirectServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// request scope에 값 추가
		req.setAttribute("str2", "가나다라마바");
		
		// session scope에 값 추가
		HttpSession session = req.getSession();
		session.setAttribute("sessionNum", 10000);
		
		// resp.sendRedirect("다시 요청할 Servlet 주소")
		// -> 파일 경로가 아닌
		//   다시 요청할 Servlet의 @WebServlet()에 작성된 주소
		resp.sendRedirect("/fr/result");
		
		
		
	}
}

 

[result Servlet]

package edu.kh.jsp2.controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/fr/result")
public class ResultServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 요청 위임할 JSP 파일 경로 작성
		String path = "/WEB-INF/views/fr/redirect_result.jsp";
	
		req.getRequestDispatcher(path).forward(req, resp);
	
	}
	
	
}

 

[redirect_result]

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>redirect 결과 페이지</title>
</head>
<body>
  <h3>
  /fr/redirect 요청 시 
  재요청 되어 보여지는 페이지
  </h3>

  <h3 id = "print"></h3>

  <hr>
  <h3>request scope로 전달된 값이 존재하나 확인</h3>

  <ul>
    <li>redirectInput1 : ${param.redirectInput1}</li>
    <li>redirectInput2 : ${param.redirectInput2}</li>
    <li>str : ${str2}</li>
  </ul>

  <h3>session scope로 전달된 값 : ${sessionNum}</h3>




  <script>
  // 아이디가 print인 요소의 내부 내용으로
  // 현재 페이지 주소를 대입
  document.querySelector("#print").innerText = location.pathname
  
  </script>



</body>
</html>

 

#결과