서블릿과 JSP

뫄뫄(ahk)·2022년 8월 20일
0

Spring

목록 보기
17/18

서블릿과 컨트롤러의 비교

  • 서블릿은
    -@WebServlet("/reserv")(클래스 단위로 url매핑)
    -HttpServlet을 상속받는다(자바는 단일상속이므로 다른 클래스 상속이 불가)
    -service(),init(),destroy()등의 메서드를 오버라이딩해야한다
    -lazy-init : 첫 번째 호출에서 객체를 생성

  • 스프링은
    -메서드 단위로 url매핑
    -상속받는 것이 없다
    -early-init : 미리 객체를 생성해 놓는다

서블릿의 생명주기

서블릿의 메서드는 ServletContainer가 자동호출해서, 오버라이딩만 하면 된다.
1. init()

  • 서블릿의 초기화작업을 하며 초기화 때 한 번 호출된다.
  1. service()
  • 입출력, 처리가 이루어짐
  • 서블릿이 요청될 때마다 반복 호출됨(싱글톤, 인스턴스 재사용)
  1. 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개 저장소

  1. request
    • 각 요청의 시작부터 끝까지 사용가능
    • 요청을 처리하는 페이지에서 접근 가능(forward)
  2. pageContext
    • jsp페이지 처음부터 끝까지 사용가능
    • 한 jsp페이지 내에서만 사용가능
  3. session
    • session객체의 생성에서 소멸전까지 사용가능
    • 개별 클라이언트마다 사용가능
    • 모든 페이지에서 session에 접근할 수 있어서 편리하다
    • 클라이언트 수마다 session객체가 생성되어 서버 메모리에 부담이간다
    • session보다는 request를 사용할 수 있는지 먼저 고려해야
  4. application
    • 프로그램의 실행기간 중 사용가능
    • context 전체에서 접근가능하다
    • context마다 1개만 있다
profile
NONONONONONOYes!

0개의 댓글