Servlet JSP MVC Spring

[Servlet] 포워드(dispatch), 바인딩

vhxpffltm 2020. 3. 3. 21:21

포워드: 하나의 Servlet에서 다른 Servlet이나 JSP와 연동하는 방법

- 요청에 대한 추가 작업을 다른 Servlet에게 수행

- Request에 포함된 정보를 다른 Servlet이나 JSP가 공유할 수 있음

- Request에 정보를 포함시켜 다른 Servlt에 전달

- MVC 패턴에서 Servlet에서 JSP로 데이터를 전달하는데 사용

 

redirect, Refresh, location, dispatch방식이 존재하는데 여기서는 dispatch방식만을 다룰것이다.

dispatch는 Servlet에서 클라이언트를 거치지않고 바로 다른 Servlet에게 요청하는 방식이다.

 

dispatch

 

웹 브라우어 주소창의 URL이 변경되지 않는다. 클라이언트에서 포워드가 진행되었는지 알 수 없다.

프로젝트를 생성하고 패키지에 2개의 클래스를 생성하고 코드를 한번 보자.

 

num1.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
package htk.ex01;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class num1
 */
@WebServlet("/num1")
public class num1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Number1 Servlet....");
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        RequestDispatcher dispatch = request.getRequestDispatcher("num2?name=HUR");
        dispatch.forward(request, response);
        //위 두문장이 dispatch 방식을 사용햐 num2 Servlet으로 전달한다.
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

num2.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
package htk.ex01;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class num2
 */
@WebServlet("/num2")
public class num2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Second Servlet.......");
    }
 
    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"); // 다른 Servlet에서 전달된 데이터를 가져옴
        out.println("<html><body>");
        out.println("이름  : " + name);
        out.println("</br>");
        out.println("Dispatch Foward.......");
        out.println("</body></html>");
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

실행결과는 아래와 같다.

 

웹 브라우저의 URL이 변경되지 않는다는 걸 알자. Servlet의 포워드가 서버에서 수행되기 때문이다.

 

바인딩

 

바인딩은 Servlet에서 다른 Servlet 또는 JSP로 대량의 데이터를 공유하거나 전달할때 사용한다.

웹 프로그램 실행시, 자원을 Servlet 관련 객체에 저장하는 방법으로 HttpServletRequest, ServletContext 객체에서 사용되며 이 자원은 프로그램 실행 시 Servlet이나 JSP에서 공유하여 사용한다.

 

여기서는 HttpServletRequest를 이용한 dispatch 포워드시 바인딩을 진행한다.

 

포워딩 실습할때와 같이 새로운 패키지를 만들고 2개의 클래스를 추가한다. 각 코드의 내용은 아래와 같다.

 

first.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
package htk.ex02;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class first
 */
@WebServlet("/first")
public class first extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Binding Dispatch First.....");
    }
 
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("address""서울특별시 강남구");// 바인딩: 두 객체를 묶는다. 웹 브라우저의 요청 request에 바인딩
        RequestDispatcher dispatch = request.getRequestDispatcher("second"); 
        dispatch.forward(request, response); 
        //바인딩된 request를 다시 2번째 Servlet에 포워딩
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

second.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
package htk.ex02;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
/**
 * Servlet implementation class second
 */
@WebServlet("/second")
public class second extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Binding dispatch Second......");
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String address = (String) request.getAttribute("address");
        out.println("<html><body>");
        out.println("주소:" + address);
        out.println("<br>");
        out.println("dispatch with Binding........");
        out.println("</body></html>");
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

결과는 아래와 같다. 포워딩 과정은 첫 번째 Servlet에서 두 번째 Servlet으로 전달되는 request가 브라우저를 거치지 않고 바로 전달되며 첫 번째 Servlet의 request에 바인딩된 데이터가 그대로 전달된 것이다.

 

 

 

바인딩 실습

이전의 코드를 가지고 바인딩으로 바꾸어보자. 이전에 사용한 DAO 클래스와 VO클래스를 새로운 패키지를 생성하여 그대로 복사한다. 그리고 2개의 클래스를 만들것이다.

또한 현 프로젝트 lib에 OJDBC 및 Tomcat-dbcp 라이브러리를 추가시켜야 제대로 실행될 것이다.

 

MemberServlt.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
package htk.ex03;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
@WebServlet("/memberservlet")
public class MemberServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        start(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        start(request, response);
    }
 
    private void start(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        MemberDAO dao = new MemberDAO();
        //List membersList = dao.listMembers();
        List<MemberVO> membersList = dao.listMembers();
        request.setAttribute("membersList", membersList); //조회된 회원 정보를 객체에 저장한 후 request에 바인딩
        RequestDispatcher dispatch = request.getRequestDispatcher("view");
        dispatch.forward(request, response);
        //바인딩한 request를 viewMembers Servlet으로 포워딩
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

ViewServlet.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
package htk.ex03;
 
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
@WebServlet("/view")
public class ViewServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,HttpServletResponse response)
                                                    throws ServletException, IOException {
          request.setCharacterEncoding("utf-8");        
          response.setContentType("text/html;charset=utf-8");
          PrintWriter out=response.getWriter();
        List membersList = (List) request.getAttribute("membersList"); //바인딩해서 넘어온 request에서 회원 정보를 가져옴
        out.print("<html><body>");
        out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
        out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td >삭제</td></tr>");
        for (int i = 0; i < membersList.size(); i++) {
            MemberVO memberVO = (MemberVO) membersList.get(i);
            String id = memberVO.getId();
            String pwd = memberVO.getPwd();
            String name = memberVO.getName();
            String email = memberVO.getEmail();
            Date joinDate = memberVO.getJoinDate();
            out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>"
                    + joinDate + "</td><td>" + "<a href='/JSP_DB/member3?command=delMember&id=" + id
                    + "'>삭제 </a></td></tr>");
 
        }
        out.print("</table></body></html>");
        out.print("<a href='/JSP_DB/Form.html'>새 회원 등록하기</a");
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

보면, MemberServlet에서 조회한 회원 정보를 List에 저장하여 바인딩 후 두 번째 Servlet인 ViewServlet으로 전달한다. 

viewServlet 클래스에서는 getAttribute() 메서드를 통해 MemberServlet에서 바인딩한 회원 정보를 List로 가져오고 출력한다.

 

그림의 결과를 보면 현재 테이블의 상태를 나타내고 있다. 또한 URL을 확인해보면 MemberServlet의 URL로 표시되어있다. ViewServlet은 출력하는 역할임을 알 수 있다. 이를 발전한것이 JSP이다.

 

자바의경우 클래스이름으로 생성하기 때문에 이름의 오탈자를 신경써서 작성하자. 그렇지않으면 원하는 결과가 제대로 나타나지 않거나 오류가 자주 발생한다.