자바로 만든 CGI 프로그램을 '서블릿(Servlet)'이라고 부른다. 자바 서블릿이 CGI 프로그램과 다른 점은, 웹 서버와 직접 데이터를 주고받지 않으며, 전문 프로그램에 의해 관리된다는 것이다.
서블릿의 생성과 실행, 소멸 등 생명주기를 관리하는 프로그램을 '서블릿 컨테이너(Servlet Container)'라 한다. 서블릿 컨테이너가 서블릿을 대신하여 CGI 규칙에 따라 웹 서버와 데이터를 주고받는다.
src/servlets/HelloWorld.java
package servlets;
import javax.servlet.*;
import java.io.IOException;
public class HelloWorld implements Servlet {
ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init() 호출됨");
this.config = config;
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig() 호출됨");
return this.config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("service() 호출됨");
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo() 호출됨");
return "version=1.0;author=eunji;copyright=eunji 2019";
}
@Override
public void destroy() {
System.out.println("destory() 호출됨");
}
}
서블릿 클래스는 반드시 javax.servlet.Servlet 인터페이스를 구현해야 한다. 서블릿 컨테이너가 서블릿에 대해 호출할 메서드를 정의한 것이 Servlet 인터페이스이다.
서블릿의 생명주기와 관련된 메서드: init(), service(), destroy()
Servlet 인터페이스 기타 메서드: getServletConfig(), getServletInfo()
서블릿 정보를 추출할 필요가 있을 때 호출하는 메서드이다.
getServletConfig(): 서블릿 설정 정보를 다루는 ServletConfig 객체를 반환한다. 이 객체를 통해 서블릿 이름과 서블릿 초기 매개변수 값, 서블릿 환경정보를 얻을 수 있다.
getServletInfo(): 서블릿을 작성한 사람에 대한 정보라든가 서블릿 버전, 권리 등을 담은 문자열을 반환
배치 설명서 파일(web.xml)을 열고 다음과 같이 HelloWorld 서블릿 배치 정보를 추가한다.
web.xml 파일을 배치 기술서(Deployment Descriptor) 또는 약어로 'DD파일' 이라고 부른다. 웹 애플리케이션의 배치 정보를 담고 있는 파일이다. 따라서 서블릿을 만들었으면 DD 파일에 배치 정보를 등록해야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 서블릿 선언-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>servlets.HelloWorld</servlet-class>
</servlet>
<!-- 서블릿을 URL과 연결 -->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
다음 그림과 같이 콘솔창 결과를 보면 init()가 먼저 호출된 후 service()가 호출된 것을 알 수 있다.
웹 브라우저에서 '새로 고침' 버튼을 여러 번 클릭하면 출력 결과는 다음과 같다.
destroy()가 호출되는 경우를 확인하는 방법은 톰캣 서버를 종료하는 것이다.
해당 서블릿을 (외부 톰캣을 이용해) 배포하는 부분이 생략되어 있는데 이 부분이 조금 아쉽습니다.
그 외엔 군더더기 없는 완벽한 강의 시리즈인것 같아요. 방금 전편을 읽고 왔는데, 처음보는 부분이 있어서 이게 뭐지? 라는 생각이 들면 어김없이 그 바로 아래에서 설명을 해주시더군요.
독자의 정신을 혼란시키는 잡다한 정보없이, 알아야 하는 것을 소화할 수 있는 만큼 나눠서 연재한 테크닉에 정말 놀랐습니다. 좋은 정보 감사해요.