package com.fastcampus.ch2;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//서블릿은 클래스에 맵핑하고, HttpServlet을 상속받아야 함.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
//서블릿이 초기화될 때 자동 호출되는 메서드
//1. 서블릿의 초기화 작업 담당
System.out.println("[HelloServlet] init() is called.");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 입력
//2. 처리
//3. 출력
System.out.println("[HelloServlet] service() is called");
}
@Override
public void destroy() {
//3. 뒷정리 - 서블릿이 메모리에서 제거될 때 서블릿 컨테니어에 의해 자동 호출
System.out.println("[HelloServlet] service() is called");
}
}
요청이 들어오면 서블릿 인스턴스가 존재하는지 확인.
서블릿 인스턴스가 없으면, 서블릿 클래스를 로딩하고, 인스턴스를 생성 후
init()메서드로 초기화하고 service()메서드를 실행해서 응답함.
따라서 첫 실행시에는 속도가 느림.
그다음부터는 서블릿 인스턴스가 존재하므로,
앞의 과정 없이 [요청 -> service() -> 응답] 과정을 반복.
이 때는 속도가 빠름.
만약 변경이 발생하거나 중지되고 다시 실행된다면,
다시 로딩, 인스턴스생성, 초기화 과정을 거쳐야 하고,
마지막에는 destroy()메서드를 실행 후 종료됨.
서블릿은 Singleton으로 1개의 인스턴스를 재활용.
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.Random" %>
<%-- <%! 클래스 영역 %> --%>
<%!
int getRandomInt(int range){
return new Random().nextInt(range)+1;
}
%>
<%-- <% 메서드 영역 - service()의 내부 %> --%>
<%
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
%>
<html>
<head>
<title>twoDice.jsp</title>
</head>
<body>
<img src='resources/img/dice<%=idx1%>.jpg'>
<img src='resources/img/dice<%=idx2%>.jpg'>
</body>
</html>
HTTP안에 Java 코드가 있는 것.
위치 : [src/main/webapp/twoDice.jsp]
JSP ≒ 서블릿 => Spring
JSP는 서블릿으로 변환됨.
<%@ 임포트 %>
<%! 메서드선언, iv, cv선언 %> -> 클래스 영역으로 들어감
<% 자바코드 %> -> service메서드 안으로(메서드 영역)
<%= 값출력 %> -> service메서드 안으로
HTML -> out.println으로 service메서드 안으로 들어감.
생성없이 사용할 수 있는 객체
service메서드의 지역변수(lv)로 선언되어있음.
따라서 JSP에서 선언 없이 사용 가능.
request, response, session, application, out, exception ...
*.jsp에서 요청이 들어오면 JspServlet이 서블릿 인스턴스가 존재하는지 확인.
존재하지 않으면 .jsp를 서블릿 소스파일(.java)로 변환하고,
.java를 서블릿 클래스파일(.class)로 컴파일 함.
이렇게 첫번째 호출에서는 시간지연이 발생.
그 다음 서블릿 인스턴스를 생성하고 응답함.
두번째부터는 서블릿 인스턴스가 존재하므로
[요청 -> _jspService()실행 -> 응답] 순서로 진행.
서블릿과 Spring은 둘 다 싱글톤.
서블릿 - lazy init(지연된 초기화)
Spring - early init