반응형

오늘은 JSP의 Request dispatch 방식과 Redirect 방식에 대해서 간단하게 코드를 작성하여 공부해보았습니다.

 

1. Request dispatch 방식

  • Request(요청)이 살아있는 상태에서 수행을 이동시킵니다.
  • Request Scope를 이용해 데이터(Attribute)를 공유 할 수 있습니다.
  • Javax, ServletRequestDisapatcher 객체를 이용해 처리합니다.
  • 일반적으로 Request distpatch 방식이 더 많이 사용됩니다.

 

 

<Request dispatch 방식을 이용한 코드>

 

(1) request.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Redirect 화면</title>
</head>
<body>
<form action="/error_pron" method="post">
<b>Redirect 체크:</b>  <input type="checkbox" name="choose" value="yes" /><br/>
<input type="submit" value="전송" />
</form>
</body>
</html>
cs

 

 

(2) error.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Error.jsp</title>
</head>
<body>
    request 오류가 발생했습니다. 관리자에게 문의하세요.
    <br /> 오류 내용:
    <%
    String errorMessage = (String) request.getAttribute("error_message");
%>
    <%=errorMessage%>
</body>
</html>
cs

 

 

(3) ErrorPronServlet.java

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.requesterror.test;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ErrorPronServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        // request.html의 name을 파라미터로
        String choose = request.getParameter("choose");
        if (choose == null) {
            // 오류 메시지를 request scope에 binding
            request.setAttribute("error_message""체크되지 않았습니다.");
            // error.jsp로 수행이동 --> request scope를 이용하기 때문에 디스패치 요청 방식으로 이동
            RequestDispatcher rdp = request.getRequestDispatcher("/dispatch/error.jsp");
            rdp.forward(request, response);
            return;
        }
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("request 체크하여 넘어왔습니다." + choose);
        out.println("");
 
    }
 
}
 
cs

 

 

(4) web.xml --> Redirect의 servlet-nameRequest distpatch의 servlet-name을 둘다 넣었습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
id="WebApp_ID" version="3.1">
  <servlet>
  <description></description>
  <display-name>ErrorPronServlet2</display-name>
  <servlet-name>ErrorPronServlet2</servlet-name>
  <servlet-class>com.requesterror.test.ErrorPronServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>ErrorPronServlet2</servlet-name>
  <url-pattern>/error_pron_dispatch</url-pattern>
  </servlet-mapping>
      <servlet>
        <description></description>
        <display-name>ErrorPronServlet</display-name>
        <servlet-name>ErrorPronServlet</servlet-name>
        <servlet-class>com.redirect.test.ErrorPronServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ErrorPronServlet</servlet-name>
        <url-pattern>/error_pron</url-pattern>
    </servlet-mapping>
</web-app>
cs

 

 

2. Redirect 방식

  • 응답시에 클라이언트에게 요청할 URL을 알려주어 다시 요청하도록 하는 방식입니다.
  • 요청과 응답이 한번 더 일어나며 Request Scope를 이용한 데이터(Attirbute)를 공유 할 수 없습니다.
  • HttpServletResponse 객체를 이용해 처리합니다.

 

 

<Redirect 방식을 이용한 코드> 

(1) redirect.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Redirect 화면</title>
</head>
<body>
<form action="/error_pron" method="post">
<b>Redirect 체크:</b>  <input type="checkbox" name="choose" value="yes" /><br/>
<input type="submit" value="전송" />
</form>
</body>
</html>
cs

 

 

(2) error.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
redirect 실행 중 오류가 발생했습니다.<br/>
관리자에게 문의하십시오.<br/>
관리자페이지 kobalja2020@tistory.com
</body>
</html>
cs

 

 

(3) ErrorPronServlet.html

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
28
29
30
31
32
33
34
35
36
37
38
package com.redirect.test;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ErrorPronServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        String choose = request.getParameter("choose");
        if (choose == null) {
            //response.sendRedirect("/redirect/error.html"); //절대경로
            response.sendRedirect("redirect/error.html"); //서블릿 기준으로 URL 작성해야한다.(상대경로)
            return;
        }
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("redirect 체크하여 넘어왔습니다." + choose);
        out.println("");
 
    }
 
}
 
cs

 

 

(4) web.xml

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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
id="WebApp_ID" version="3.1">
  <servlet>
  <description></description>
  <display-name>ErrorPronServlet2</display-name>
  <servlet-name>ErrorPronServlet2</servlet-name>
  <servlet-class>com.requesterror.test.ErrorPronServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>ErrorPronServlet2</servlet-name>
  <url-pattern>/error_pron_dispatch</url-pattern>
  </servlet-mapping>
      <servlet>
        <description></description>
        <display-name>ErrorPronServlet</display-name>
        <servlet-name>ErrorPronServlet</servlet-name>
        <servlet-class>com.redirect.test.ErrorPronServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ErrorPronServlet</servlet-name>
        <url-pattern>/error_pron</url-pattern>
    </servlet-mapping>
</web-app>
cs

 

★ 프로젝트 구성은 이렇게 하였습니다.

dispatch와 redirect 폴더의 하위 파일에 생성

 

★ Request distpatch 코드 실행 결과입니다.(클릭 하셔서 보셔야 합니다.)

Request distpatch 방식 실행 결과

 

 

★ Redirect 코드 실행 결과입니다.(클릭 하셔서 보셔야 합니다.)

Redirect 방식 실행 결과

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기