Purple Bobblehead Bunny

Backend/JSP SERVLET

[JSP] 포워딩, 리다이렉트

준영어린이 2022. 6. 27. 12:43

 

redirect, forwarding

한 페이지에서 다른 URL로 이동할 때 사용하는 HTTP 프로토콜

 

 

forward

request.response가 유지된다.

이동된 url이 화면에 보이지 않는다.

 

pageContext.forward("이동 할 페이지");

<jsp:forward page="이동 할 페이지"/>;

RequestDispatcher dis = request.getRequestDispatcher("이동 할 페이지");

     dis.forward(request, response);

 

  1. 최초 요청 (클라이언트 -> request -> URL1)
  2. forward (URL 1 -> forward -> URL2)
  3. 응답 (URL2 -> response -> 클라이언트)

 

 

redirect

- 클라이언트가 새로 페이지를 요청한 것과 같은 방식으로 페이지가 이동된다.

   request, response가 유지되지 않는다. -> 새로 만들어짐

- 이동된 url이 화면에 보인다.

 

response.sendRedirect("이동 할 페이지");

 

  1. 최초 요청 (클라이언트 - request 1 ->  URL1)
  2. redirect 할 새로운 URL 2 return (URL1 -> redirect -> 클라이언트)
  3. URL2 요청(클라이언트 -> request 2-> URL2)
  4. 응답 (URL2 ->respose -> 클라이언트)

 

forward, redirect 차이점

  • forward
    • JSP 액션 태그
    • 요청 정보 유지
    • URL이 변화하지 않는다.
    • 객체 재사용
    • 시스템 변화가 생기지 않는 요청에 적합( 검색 등 단순 조회 )
  • sendRedirect
    • JSP 내장 객체 (response)
    • 새로운 요청이 수행된다.
    • URL이 변화한다.
    • 객체 재사용 X
    • 시스템 변화가 생기는 요청에 적합( 로그인, 글쓰기 등)

로그인 예제

// login.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>
	
   <form method="post" action="loginok.jsp">
   ID<input type="text" name="id"/><br>
   PW<input type="password" name="pwd"/><br>
   <input type="submit" value="LOGIN"/>
   </form>
</body>
</html>

// LoginOK.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>
	<%
    	String id = request.getParameter("id");
        String pwd = request.getParameter("pwd");
        
        //request스코프에 값 저장
        request.setAttribute("id", id);
        request.setAttribute("pwd", pwd);
        
        // forward
        // pageContext.forward("result.jsp");
        
        // redirect
        // response.sendRedirect("result.jsp");
        
        // <jsp:forward page="result.jsp"></jsp:forward>
    %>    
</body>
</html>
// result.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>
	<%
    	String id = (String)request.getAttribute("id");
        String pwd = (String)request.getAttribute("pwd");
        
        id = request.getParamter("id");
    %>
    
    <h1>request 에 담긴 데이터 <br></h1>
    
    ID : <%=id %><br>
    PW : <%=pwd %><br>
</body>
</html>

 

forward 방식으로 값을 전달을 하게 되면 값은 전달되지만, 주소는 resultjsp로 변경이 되지 않는다.

 

redirect 방식으로 값을 전달하면 주소는 바뀌어있고 login.jsp에서 값을 넘기지 않았기 때문에 값은 null값이 된다.

redirect는 request를 유지하지 않기 때문에 다른 페이지로 이동을 하게 되면 사라지게 된다.

 

 

예제2 

ID/PWD가 맞지 않으면 오류, 맞으면 페이지 이동

 

// loginerr.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>
<style type="text/css">
	#error{
    	color:red;
        font-size:10px;
	}
    </style>
	<%
    	// reuqest에 담긴 오류메시지 가져오기
        String errmsg = (String)request.getAttribute("errmsg");
        if(errmsg==null){
        	errmsg="";
        }
     %>
</head>
<body>
    <form action="loginerrok.jsp" method="post">
    ID : <input type="text" name="id" /> <br>
    PW : <input type="password" name="pwd"> <br>
    <div id="error"> <%=errmsg %> </div>
    
    <input type="submit" value="login" />
    </form>
</body>
</html>

 

 

 

// loginerrok.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>
<body>
	<%
    	String id=request.getParameter("id");
        String pwd=request.getParameter("pwd");
        if(id.equals("junyoung") && pwd.eqauls("1153")) {
        	session.setAttribute("id",id);
            response.sendRedirect("../main.jsp");
        }else{
        // request에 오류메세지 담기
        request.setAttribute("errmsg","아이디 또는 비밀번호가 일치하지 않습니다.");
        RequestDispatcher rd = request.getRequestDispatcher("loginerr.jsp");
        rd.forward(request,response);
        }
     %>   
</body>
</html>

아이디 또는 비밀번호가 일치하지 않다면 request에 담아서 loginerr.jsp로 dispatch (forward)

'Backend > JSP SERVLET' 카테고리의 다른 글

[JSP] 내장 객체(implicit object)  (0) 2022.06.28
[JSP] useBean, setProperty, getProperty  (0) 2022.06.27
[JSP] form  (0) 2022.06.26
[JSP] ActionTag  (0) 2022.06.24
[JSP] 지시자  (0) 2022.06.24