서블릿 인스턴스는 서블릿이 포함된 웹컨테이너에 의해 제어된다.
서블릿 인스턴스가 존재하지 않으면 다음과 같은 작업을 수행한다.
1. 서블릿 클래스 로드
2. 서블릿 클래스 인스턴스 생성
3. 서블릿 인스턴스 초기화
4. 웹 컨테이너에 의한 서비스 메서드 호출
5. destroy 메서드를 호출하여 서블릿 종료
서비스 메서드는 요청이 들어올 때마다 호출된다.
즉, Servlet은 최초 요청 시 객체가 만들어져 메모리에 로딩되는데, 그 이후 요청부터는 기존의 객체를 재활용하게 된다. 이것이 Servlet이 응답, 동작 속도가 빠른 이유다.
Servlet 객체 생성 (1회) -> init() 호출 (1회) -> service(), doGet(), doPost() 호출 (요청시 매번) -> destory() 호출 (1회)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int global = 1;
int num1 = 10, num2 = 20;
public int add(int a, int b){
return a+b;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ADD</title>
</head>
<body>
<h1>더하기를 해보자.</h1>
<%
int local = 1;
out.print(add(num1, num2));
out.print("글로발");
out.print(global++);
out.print("로칼");
out.print(local++);
%>
</body>
</html>
[실행 결과]
새로고침을 하면 (JSP내 선언부에 선언한) global 변수만 값이 증가한다. 이는 변환된 서블릿에서 global 변수가 멤버변수로 선언이 되었기 때문이다. 즉 서블릿 클래스 인스턴스가 한 번 생성되고 계속 재활용하기 때문에 값이 초기화되지 않는다.
반면 (JSP내 스크립트릿으로 선언된) local 변수는 서블릿에서 Service() 메서드 안에 선언이 된다. 즉 지역변수인 local 변수는 요청을 보낼 때마다 호출되어 계속 1로 초기화가 되는 것이다.
(feat. JSP 동작원리)