서블릿과 컨트롤러의 비교
-
서블릿은
-@WebServlet("/reserv")(클래스 단위로 url매핑)
-HttpServlet을 상속받는다(자바는 단일상속이므로 다른 클래스 상속이 불가)
-service(),init(),destroy()등의 메서드를 오버라이딩해야한다
-lazy-init : 첫 번째 호출에서 객체를 생성
-
스프링은
-메서드 단위로 url매핑
-상속받는 것이 없다
-early-init : 미리 객체를 생성해 놓는다
서블릿의 생명주기
서블릿의 메서드는 ServletContainer가 자동호출해서, 오버라이딩만 하면 된다.
1. init()
- 서블릿의 초기화작업을 하며 초기화 때 한 번 호출된다.
- service()
- 입출력, 처리가 이루어짐
- 서블릿이 요청될 때마다 반복 호출됨(싱글톤, 인스턴스 재사용)
- destroy()
- 서블릿이 메모리에서 내려가거나 갱신될 때 자동으로 호출된다.
시간순으로 서블릿의 생명주기를 간단히 보면
요청이 들어왔을 때 ServletContext는 children(Map)에서 서블릿의 인스턴스가 존재하는지 확인하고, 있으면 인스턴스의 service()를 호출, 없으면 서블릿 클래스를 로딩한 뒤 인스턴스를 생성하고 init()로 초기화한 뒤 service()를 호출하여 요청을 처리한 뒤 응답을 보낸다. 프로그램을 종료하거나, 서블릿의 내용이 갱신되면 destroy()를 호출하여 뒷정리를 한다.
JSP란?(Java Server Page)
- html 안에 java 코드가 있는 문서.
- jsp를 요청하면 서블릿으로 변환된다.
<% %> -> servlet의 service()안으로 들어간다
<%! %> -> servlet의 클래스 영역(클래스 안, 메서드 밖) 안으로 들어간다
<%@ %> -> servlet의 설정 부분
JSP의 호출 과정
- servlet의 생명주기와 비슷하다.
- jsp페이지의 요청이 들어오면
-> JspServlet이 서블릿의 인스턴스가 존재하는지 확인하고
-> 있으면 _jspService()를 호출
-> 없으면 jsp페이지를 java(서블릿)파일로 변환한다
-> 다시 class파일로 컴파일한 다음 인스턴스를 생성하고 _jspinit()을 호출하여 초기화한다
-> 초기화 후 _jspService()를 호출하여 요청을 처리한 뒤 응답을 보낸다
-> jsp페이지의 내용이 갱신되면 다시 init()를 호출하여 변환, 컴파일과정을 거친다.
Jsp의 기본객체
- service()의 지역변수로 선언되어있는 객체라서 생성없이 사용할 수 있다.
- request, response, pageContext, session, application, config, out, page 등이 있다.
- jsp의 기본객체 중에는 웹프로그램에서 제공하는 저장소들이 있다. 이 저장소는 각각 접근 범위와 생존기간이 다르다.
- 그 기본객체들을 활용하여 로그인과 로그아웃, 요청의 forward, el 사용 등이 가능하다.
4개 저장소
- request
- 각 요청의 시작부터 끝까지 사용가능
- 요청을 처리하는 페이지에서 접근 가능(forward)
- pageContext
- jsp페이지 처음부터 끝까지 사용가능
- 한 jsp페이지 내에서만 사용가능
- session
- session객체의 생성에서 소멸전까지 사용가능
- 개별 클라이언트마다 사용가능
- 모든 페이지에서 session에 접근할 수 있어서 편리하다
- 클라이언트 수마다 session객체가 생성되어 서버 메모리에 부담이간다
- session보다는 request를 사용할 수 있는지 먼저 고려해야
- application
- 프로그램의 실행기간 중 사용가능
- context 전체에서 접근가능하다
- context마다 1개만 있다