웹 프로그래밍 언어는 클라이언트 측 실행 언어와 서버 측 실행 언어로 구분된다. 자바 기반의 JSP는 서버 측 언어이다. 원래는 서블릿이 먼저 개발되었으나 방식이 어려워 HTML코드에 직접 삽입할 수 있는 JSP가 개발되었다. JSP와 서블릿은 별개의 기술이 아니며 WAS에서 클라이언트에게 서비스될 떄 서블릿으로 변경된다.
자바 코드안에 HTML 코드를 추가 - 서블릿
HTML 코드안에 자바 코드를 추가 - JSP
특징:
JSP를 컴파일한 .class 파일에는 jspInit(),_jspService(),jspDestroy() 메소드가 존재한다.
번역(translation)
JSP 컨테이너가 JSP파일을 읽고 구문 분석. 페이지와 페이지에 사용된 태그 라이브러리를 참조하는 사용자 정의 태그와 표중 디렉티브, 액션태그의 구문 정확성을 검증. 소스파일을 자바코드(서블릿)으로 변환.
예) Hello.jsp -> Hello_jsp.java
컴파일(Compilation)
자바코드의 모든 구문을 검사. JSP 페이지 내의 선언문, 처리문, 표현문 등의 스크립트 태그를 사용하여 삽입된 구문의 오류를 검사. 변환된 서블릿을 컴파일하여 클래스 파일 생성.
예) Hello_jsp.java -> Hello_jsp.class
로딩(Loading) 및 초기화(Initialization)
JSP 컨테이너가 .class를 로딩하고 클래스의 인스턴스를 작성함. 이때 인수가 없는 생성자를 사용. 컨테이너는 서블릿의 init() 메소드, 즉 jspInit() 메소드를 호출하여 인스턴스가 된 객체를 초기화함. DB연결, 파일 열기, 룩업 테이블 생성 등을 초기화함. 일반적으로 초기화는 한 번만 수행.
실행(Execution)
각 클라이언트의 요청에 대해 컨테이너가 요청 및 응답 객체를 전달하는 _jspService() 메소드를 실행. 웹 브라우저가 JSP페이지를 요청하여 페이지가 로딩 및 초기화 될 때마다 컨테이너는 _jspService() 호출하여 응답객체 전달. JSP 생명 주기가 끝날 때까지 모든 요청에 대해 상호작용함.
소멸(Destruction)
생명주기완료. 컨테이너는 실행중인 JSP를 jspDestroy() 메소르를 사용하여 제거. 서블릿의 destroy() 메소드에 해당. DB연결 해제 또는 열려있는 파일 닫기 등을 수행해야 할 때 메소드를 오버라이딩. 컨테이너가 해당 서블릿 인스턴스를 제거할 떄 어떤 활동을 정리하기 위해 메소드 호출.
※ jspInit()과 jspDestroy() 메소드는 컨테이너가 기본 기능을 제공하기 때문에 오버라이딩이 선택 사항. _jspService() 메소드는 컨테이너가 추가하기 때문에 오버라이딩 불가능
※ 요청시 JSP 컨테이너는 페이지를 변환(번역)할 필요가 있는지 확인함. 서블릿 클래스가 JSP 페이지보다 오래되었다면 (파일이 수정된 경우, 수정 후 컴파일이 안된 경우) 컨테이너는 서블릿으로 변환. 아니라면 성능 향상을 위해 건너뜀.