Chrome에서 servlet을 1회 최초 호출하고, Safari에서 servlet을 1회 호출한 결과는 위 사진과 같이 나왔다.
2번 호출 했으니, init 매서드가 2번 호출 될 것이라고 생각했었는데 아니었다.
그 이유는 다음과 같다.
서블릿의 동작과정을 한눈에 보기 쉽게 다이어그램으로 정리해보았다.
Servlet는 최초 호출이 되면 해당 selvlet은 메모리에 적재됩니다. 그 이후로 다른곳에서도 중복 호출 하게 되면, 똑같이 Servlet를 불러오는 것이 아니라, 메모리에 적재된 Servlet을 재사용해서 사용자와의 인터페이스를 제공한다고 한다. Servlet는 메모리에 이미 init()이 실행된 채로 메모리에 적재되어 있기 때문에 또 다시 같은 Servlet을 쓰지 않고도 일반 호출보다 더 빠르게 인터페이스를 제공 할 수 있게 된다.
다시 한번 정리하면, Servlet는 메모리에 적재된 Servlet을 재사용하기 때문제 일반 웹보다 훨씬 빠르고 효율적으로 인터페이스를 제공 할 수 있도록 도움을 준다.
이 태그는 프로젝트 내부의 servlet를 외부에 드러낼 수 있도록 servlet에 이름을 지어주는 역할을 한다.
<servlet-name>태그를 이용하여 서블릿의 이름을 지어주고,
<servlet-class>태그를 이용하여 이름을 지어 줄 서블릿을 선언한다.
2. <servlet-mapping> 태그
이 태그는 내부의 servlet와 외부 요청에 대한 논리적인 경로를 설정해준다.
<servlet-name>태그를 이용하여 외부에 드러낼 서블릿의 이름을 설정한 다음,
<url-pattern>태그를 이용하여 외부에서 접근할 url 경로를 설정해준다.
위를 테스트 하기 위해 나는 test패키지를 생성하여 testServlet 클래스를 생성하였다.
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class testServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet method is called");
super.doGet(req, resp);
} // get 요청에 대한 override class이며, get방식에 대해 요청을 처리하는 클래스이다.
@Override
public void destroy() {
System.out.println("destroy method is called");
super.destroy();
} // servlet이 종료될 때 호출되는 class
@Override
public void init() throws ServletException {
System.out.println("init method is called");
super.init();
} //최초 servlet call을 다루는 override class
}
이 Servlet 클래스를 논리적인 주소로 매핑시키기 위해 다음과 같이 web.xml을 수정하였다.