[국비학원 기록/Servlet] 서블릿 포워드, Redirect(리다이렉트), refresh, location
my code archive
article thumbnail
반응형
서블릿 포워드

1. 서블릿 포워드 기능

-하나의 서블릿에서 다른 서블릿 혹은 JSP와 연동하는 방법

 

2. 포워드 기능의 용도

1)요청(request)에 대한 추가 작업을 다른 서블릿에게 수행하게 함.

2)요청(request)에 포함된 정보를 다른 서블릿 혹은 JSP와 공유함.

3)요청(request)에 정보를 포함시켜 다른 서블릿에 전달할 수 있음.

 

3. 서블릿 포워드 방법

 

1)redirect(리다이렉트)를 이용한 포워딩

-HttpServletResponse 객체의 sendRedirect( ) 메서드 이용.

-웹 브라우저에 재요청하는 방식

-형식 :

sendRedirect("포워드할 서블릿 or JSP");

-redirect는 클라이언트 요청에 대한 HTTP 응답을 나타내는 response의 메소드

-이동할 페이지로 요청과 응답 객체를 새로 생성하여 전송

-페이지를 재요청하는 것

-redirect 방법으로 이동한 페이지는 이전 페이지와 데이터를 공유하거나 주고받는 것이 없고

 실제 데이터를 공유할 수도 없다.

 

redirect 예제

<FirstServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        response.sendRedirect("second");    //웹 브라우저에게 다른 서블릿인 second로 재요청함.
        
    }
}
cs

<SecondServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/second")
public class SecondServlet extends HttpServlet{
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        out.println("<html><body>");
        out.println("sendRedirect를 이용한 redirect 실행!");
        out.println("</body></html>");
    }
}
 
cs

실행해보면

=>URL이 변경되어 있다. !!!

 

그런데 너무 순식간에 (?) 바뀌기 때문에

재요청 시간을 설정하는 방법도 있다.

 

2)refresh 방법

-HttpServletResponse 객체의 addHeader( ) 메서드 이용.

-앱 브라우저에 재요청하는 방식

-형식:

response.addHeader("Refresh", 경과 시간(초); url=요청할 서블릿 or JSP);

 

refresh 예제

<FirstServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/first2")
public class FirstServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        response.addHeader("Refresh","2;url=second2");    //웹 브라우저에게 1초 후 서블릿인 second2로 재요청함.
        
    }
}
cs

<SecondServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/second2")
public class SecondServlet extends HttpServlet{
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        out.println("<html><body>");
        out.println("refresh를 이용한 redirect 실행!");
        out.println("</body></html>");
    }
}
cs

실행해보면

=>아까와 다르게 1초 뒤 재요청, 페이지가 바뀐다.

 

3)location 방법

-자바스크립트 location 객체의 href 속성 이용

-자바스크립트에서 재요청하는 방식

-형식 :

location.href = '요청할 서블릿 or JSP';

 

location 예제

<FirstServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/first3")
 
public class FirstServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("<script type='text/javascript'>");
        out.print("location.href='second3';");
        out.print("</script>");
    }
 
}
cs

<SecondServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/second3")
 
public class SecondServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        out.print("<html><body>");
        out.print("location을 이용한 redirect 테스트입니다.");
        out.print("</body></html>");
    }
 
}
cs

실행해보면

=>큰 차이는 없지만 어쨋든 자바스크립트를 활용 가능하다는 것.

 

4)dispatch 방법

-일반적으로 포워딩 기능을 지칭
-서블릿이 직접 요청하는 방법
-RequestDispatcher 클래스의 forward() 메서드 이용

-모델2나 스프링 프레임워크에서 포워딩 시 사용
-웹 브라우저 주소 창의 URL이 변경되지 않고 그대로임.★★★★★
 -서블릿의 포워드가 서버에서 수행되었기 때문임.

-형식:

RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 or JSP"); dis.forward(request,response);

 

dispatch 예제

<FirstServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/first5")
 
public class FirstServlet extends HttpServlet{
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        //dispatch 방법을 이용해 second로 전달함.
        RequestDispatcher dispatcher = request.getRequestDispatcher("second5?name=lee2");
        dispatcher.forward(request, response);
    }
 
}
cs

<SecondServlet>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/second5")
 
public class SecondServlet extends HttpServlet{
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        
        String name = request.getParameter("name");        //다른 서블릿에서 전달된 데이터를 가져옴.
        out.println("<html><body>");
        out.println("이름 : "+name);
        out.println("<br>");
        out.println("dispatch를 이용한 forward 테스트입니다.");
        out.println("</body></html>");
    }
}
cs

실행해보면

=>URL이 변경되지 않음!!!

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형