00. 서론
서블릿을 공부하던 도중, 한가지 의문이 들었다.
많은 블로그 예제에서는 서블릿 esponse에 html 데이터를 직접 입력하는 예제가 대다수였다.
근데 문제는 이렇게 코드를 작성하면, Controller와 View가 구분이 되지 않아 유지보수가 힘들다는 점이다.
그래서 서블릿안에서 뷰를 직접 작성하지 않고, 외부에 작성된 html 파일을 리턴하는 방법을 정리하고자 한다.
01. html 파일을 리턴하는 방법들
찾아보니 html 파일을 외부에 분리하는 방법은 아래와 같았다.
- 정적 파일 직접 응답 (가장 간단한 방법)
- 파일을 직접 읽어서, response에 직접 복사하는 방법
- 뭔가,,,
구시대적인 느낌이다...
- RequestDispatcher 사용 방법
- 내가 선택한 방법이다.
- 뒤에서 후술하겠다.
- 템플릿 엔진 사용(타임리프, JSP 등)
- 오늘 의문과는 살짝 거리가 있는 듯하여 패스,,
02. RequestDispatcher
RequestDispatcher
: 서블릿에서 다른 웹 리소스(서블릿, JSP, HTML 페이지)로 요청을 전달하거나 포함시키는 인터페이스.
즉 서블릿에서는, 이미 이러한 문제를 위한 해결법을 준비해두었다.
간단한 사용 방법은 아래와 같다.
///
/// 01. 객체 생성
///
// 방법 1: ServletContext를 통해 생성
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/path/to/resource");
// 방법 2: 현재 요청에서 생성
RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");
///
/// 02. 응답
///
// 요청을 다른 리소스로 전달 (클라이언트에게 새 URL 보여줌)
void forward(ServletRequest request, ServletResponse response)
// 다른 리소스의 출력을 현재 응답에 포함 (클라이언트에게 원래 URL 유지)
void include(ServletRequest request, ServletResponse response)
03. foward() VS include()
뷰 파일을 파싱하는 Dispatcher 객체를 만든 후 응답하는 방식에는 1.foward()
방식이 있고, 2.include()
방식이 있다.
foward()
: 요청 자체를 리소스에게 넘김include()
: 기존 응답에, view의 자원을 포함시킨다.- 예시를 들어보자.hello.html
<html> <body>this is my custom page</body> </html>
Dispatcher에서 참조할 html 파일이다.
서블릿 코드(forward)
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// HTML 파일 경로 설정
String htmlPath = "/WEB-INF/hello.html";
// RequestDispatcher 생성
RequestDispatcher dispatcher = request.getRequestDispatcher(htmlPath);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
response.getWriter().println("</body></html>");
// HTML 파일로 포워딩
dispatcher.forward(request, response);
}
}
기존에 응답으로 Hello, Servlet!
이라는 h1태그가 이미 존재하는 상황이다.
여기서 forward()를 통해 응답하면 결과는 아래와 같다.

결과를 보면 기존에 작성된 서블릿 Hello, Servlet!
태그가 무시된 것을 확인할 수 있다.
서블릿 코드(include)
이번엔 include() 부분을 살펴보자
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// HTML 파일 경로 설정
String htmlPath = "/WEB-INF/hello.html";
// RequestDispatcher 생성
RequestDispatcher dispatcher = request.getRequestDispatcher(htmlPath);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
response.getWriter().println("</body></html>");
// HTML 파일로 포워딩
dispatcher.include(request, response);
}
}
실행결과를 보면

기존 응답에, hello.html 파일의 내용이 추가된 것을 볼 수 있다.
'Back End > Jsp && Servlet' 카테고리의 다른 글
[Tomcat 11] 인텔리제이 Webapp 아키텍처에서 서블릿 사용하기 (0) | 2024.10.25 |
---|
00. 서론
서블릿을 공부하던 도중, 한가지 의문이 들었다.
많은 블로그 예제에서는 서블릿 esponse에 html 데이터를 직접 입력하는 예제가 대다수였다.
근데 문제는 이렇게 코드를 작성하면, Controller와 View가 구분이 되지 않아 유지보수가 힘들다는 점이다.
그래서 서블릿안에서 뷰를 직접 작성하지 않고, 외부에 작성된 html 파일을 리턴하는 방법을 정리하고자 한다.
01. html 파일을 리턴하는 방법들
찾아보니 html 파일을 외부에 분리하는 방법은 아래와 같았다.
- 정적 파일 직접 응답 (가장 간단한 방법)
- 파일을 직접 읽어서, response에 직접 복사하는 방법
- 뭔가,,,
구시대적인 느낌이다...
- RequestDispatcher 사용 방법
- 내가 선택한 방법이다.
- 뒤에서 후술하겠다.
- 템플릿 엔진 사용(타임리프, JSP 등)
- 오늘 의문과는 살짝 거리가 있는 듯하여 패스,,
02. RequestDispatcher
RequestDispatcher
: 서블릿에서 다른 웹 리소스(서블릿, JSP, HTML 페이지)로 요청을 전달하거나 포함시키는 인터페이스.
즉 서블릿에서는, 이미 이러한 문제를 위한 해결법을 준비해두었다.
간단한 사용 방법은 아래와 같다.
///
/// 01. 객체 생성
///
// 방법 1: ServletContext를 통해 생성
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/path/to/resource");
// 방법 2: 현재 요청에서 생성
RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");
///
/// 02. 응답
///
// 요청을 다른 리소스로 전달 (클라이언트에게 새 URL 보여줌)
void forward(ServletRequest request, ServletResponse response)
// 다른 리소스의 출력을 현재 응답에 포함 (클라이언트에게 원래 URL 유지)
void include(ServletRequest request, ServletResponse response)
03. foward() VS include()
뷰 파일을 파싱하는 Dispatcher 객체를 만든 후 응답하는 방식에는 1.foward()
방식이 있고, 2.include()
방식이 있다.
foward()
: 요청 자체를 리소스에게 넘김include()
: 기존 응답에, view의 자원을 포함시킨다.- 예시를 들어보자.hello.html
<html> <body>this is my custom page</body> </html>
Dispatcher에서 참조할 html 파일이다.
서블릿 코드(forward)
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// HTML 파일 경로 설정
String htmlPath = "/WEB-INF/hello.html";
// RequestDispatcher 생성
RequestDispatcher dispatcher = request.getRequestDispatcher(htmlPath);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
response.getWriter().println("</body></html>");
// HTML 파일로 포워딩
dispatcher.forward(request, response);
}
}
기존에 응답으로 Hello, Servlet!
이라는 h1태그가 이미 존재하는 상황이다.
여기서 forward()를 통해 응답하면 결과는 아래와 같다.

결과를 보면 기존에 작성된 서블릿 Hello, Servlet!
태그가 무시된 것을 확인할 수 있다.
서블릿 코드(include)
이번엔 include() 부분을 살펴보자
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// HTML 파일 경로 설정
String htmlPath = "/WEB-INF/hello.html";
// RequestDispatcher 생성
RequestDispatcher dispatcher = request.getRequestDispatcher(htmlPath);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
response.getWriter().println("</body></html>");
// HTML 파일로 포워딩
dispatcher.include(request, response);
}
}
실행결과를 보면

기존 응답에, hello.html 파일의 내용이 추가된 것을 볼 수 있다.
'Back End > Jsp && Servlet' 카테고리의 다른 글
[Tomcat 11] 인텔리제이 Webapp 아키텍처에서 서블릿 사용하기 (0) | 2024.10.25 |
---|