본문 바로가기
✨ Back-end/Servlet

[Servlet] Servlet 하나로 여러 JSP 데이터 주고 받기

by 환풍 2023. 2. 18.
728x90

 

이전 까지는 각각 하나의 jsp로 servlet을 주고 받는 형식으로 늘 servelt을 새로 만들어주었다.

너무 번잡해지고 MVC 모델 패턴을 하는데 있어 효율적이지 않아 앞으로는 Servlet 하나로만 작업하기 위해 방법을 알아보았다.

먼저 생성하는 방법은 똑같지만, 통상적으로 서블릿 네임은 Controller 라고 한다.

Controller.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
 
// * : 에스테리스크 -> 전체(all)
// .do로 끝나는 요청 다받겠다.
@WebServlet("*.do")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
 
    public Controller() {
        super();
        
    }
 
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response); 
        // request 매개변수는 요청과 관련된 데이터를 들고온다.
        // response는 응답에 대한 모든 변수가 들어있다. 
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }
    
    // doProcess는 request, response 매개변수가 없기 때문에 위의 doPost, doGet에 있는 모든 매개변수를 복사 붙여넣기.
    public void doProcess(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException{
        //한글 요청
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
 
        
        //어떤 페이지에서 요청이 왔는지 확인
        String requestURI = request.getRequestURI();
        String contextPath = request.getContextPath();
        String command = requestURI.substring(contextPath.length());
        System.out.println("command = " + command);
        //command가 어디서 왔는지 정보를 알고있다.
        
        //응답 페이지 (보여줘야 할 페이지)
        String page = "";
        
        // first.jsp에서 들어왔을 떄
        if(command.equals("/firstToSecond.do"))
        {
            //할거한다
            page = "second.jsp";
        }
        
        // second.jsp에서 서블릿 실행됐을 때
        if(command.equals("/secondToThird.do"))
        {
            //할거한다
            page = "third.jsp";
        }
        
        //getRequestDispatcher( ) 에 원래 " "열로 jsp파일을 직접치는데, if에서 변수를 지정해줘 넣는다.
        RequestDispatcher dispatcher = request.getRequestDispatcher(page);
        dispatcher.forward(request, response);
 
        
    }
 
}
 
cs

14줄의 @WebServlet("*.do") 가 매우 중요한 부분이다.

JSP에서 form이나 a 태그를 이용해 넘겨준 .do를 이용한 모든 요청을 받겠다는 뜻이다.

 

36번째 줄의 doProcess 메소드를 새로 생성해주었고, doGet과 doPost에는 doProcess 메소드를 받아왔다.

 

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");

doProcess 메소드 시작부분에 먼저 위 코드를 삽입하여 한글이 깨지지 않도록 인코딩 타입을 설정해주었다.

 

RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);

 그리고 맨 아랫 줄에는 서블릿 데이터를 다시 jsp에 넘겨줄 request.getRequestDispatcher(page); 를 설정해주었다.

이때, page는 String page = ""; 에서 받아올 값을 대체한다.

 

first.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ 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>
<a href="firstToSecond.do">첫번째 페이지</a>
</body>
</html>
cs

첫번째 페이지이다. body 태그 밑에 a태그 href이 "firstToSecond.do" 로 감싸져있다. 

즉, Servlet 파일의 doProcess 메소드 안에 있는 53번째 줄,  if(command.equals("/firstToSecond.do")) 가 실행된다.

이후 page 값을 "second.jsp" 로 바꿔주면서 아래 있는 RequestDispatcher 에 있는 page로 인해 페이지 이동한다.

 

second.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ 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>
두번째 페이지 입니다.
<a href="secondToThird.do"> 세번째 페이지로 이동</a>
</body>
</html>
cs

첫번째 페이지에서와 같은 형태로, if(command.equals("/secondToThird.do")) 로 이동해 다시 세번째 페이지로 이동시킨다.

 

third.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ 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>
세번째 페이지 입니다.
</body>
</html>
cs

 

결과화면

MVC 패턴을 이용해 본격적으로 화면 구상을 하기전 Servlet의 doProcess에 대해서 알아보았다.

굉장히 간단하고, 쉬워서 웹 개발하며 관리하기에도 유용할것 같다.

반응형

댓글