본문 바로가기

서버/Servlet-JSP
[Servlet-JSP] Redirection

// Redirection

- 서버에서 페이지를 전환해 준다.

- html 주소를 설정하면 submit 할 때 뒤로가기 하지 않아도 됨!

~ pageContext.forward()
    - 데이터를 넘기면서 이동할 때 주로 사용 
    - 서버측 이동 > 주소 바뀌지 않음  

~ response.sendRedirect()
    - 일반적으로 사용
    - 클라이언트측 이동 > 주소 바뀜


- response.sendRedirect()

//calc2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="calc2" method="post">
		<div>
			<label>입력 : </label>
			<input type="text" name="v" />
		</div>
		<div>
			<input type="submit" name="operator" value="+" />
			<input type="submit" name="operator" value="-" />
			<input type="submit" name="operator" value="=" />
		</div>
	</form> 	
</body>
</html>

 

package com.sorrelcalc.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calc2")
public class Calc2 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie[] cookies = request.getCookies(); 		
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		
		String v_ = request.getParameter("v");
		String op = request.getParameter("operator");		
		
		int v = 0;
		if(!v_.equals("")) v = Integer.valueOf(v_);
		
		if(op.equals("=")) {
			
			int x = 0;
			int y = v;						
			
			for (Cookie c : cookies) { //쿠키 읽기
				if (c.getName().equals("value")) {
					x = Integer.valueOf(c.getValue());
					break;
				}
			}
			
			String operator = "";
			for (Cookie c : cookies) {
				if (c.getName().equals("op")) {
					operator = c.getValue();
					break;
				}
			}
			
			int result = 0;
			
			if(operator.equals("+")) 
				result = x+y;
			else 
				result = x-y;
			out.println("계산 결과는 = " + result);
			
		} else { //operator가 + 또는 -			
			Cookie valueCookie = new Cookie("value", String.valueOf(v));
			Cookie opCookie = new Cookie("op", op);
			valueCookie.setPath("/calc2");
			valueCookie.setMaxAge(60*60*24); 
			opCookie.setPath("/calc2");
			response.addCookie(valueCookie); //클라이언트에 전달
			response.addCookie(opCookie);
			
			response.sendRedirect("calc2.html");
		}		
	}
}

- pageContext.forward()

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    /*  
    
        서버측 자원의 생명 주기
        - 서블릿 or JSP > 여러 가지 자원 > 언제 생성 ~ 소멸
        - 현재 JSP 페이지가 실행 중일 때 > JSP 페이지 처리 종료 > 자원 소멸
        
    */
    
    int a = 10;
        
    pageContext.setAttribute("b", 20); //pageContext 변수
    request.setAttribute("c", 30); //request 변수
    
    /* response.sendRedirect("ex12_pagecontext_two.jsp"); */ //http://localhost:8090/jsp/ex12_pagecontext_two.jsp
    pageContext.forward("ex12_pagecontext_two.jsp"); //http://localhost:8090/jsp/ex12_pagecontext_one.jsp
        
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
<style>

</style>
</head>
<body>

    <h1>첫 번째 페이지</h1>
    
    <div>a: <%= a %></div>
    
    <div>b: <%= pageContext.getAttribute("b") %></div>
    
    <div>c: <%= request.getAttribute("c") %></div>    
    
    <a href="ex12_pagecontext_two.jsp?a=<%= a %>">두 번째 페이지로 이동하기</a>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>

</script>
</body>
</html>