2-13 서블릿과 JSP (1)

서현우·2022년 5월 12일
0

스프링의정석

목록 보기
13/85

HelloServlet.java

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개의 인스턴스를 재활용.

twoDice.jsp

<%@ 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>

JSP와 서블릿의 비교

JSP(Java Server Pages)란?

HTTP안에 Java 코드가 있는 것.
위치 : [src/main/webapp/twoDice.jsp]
JSP ≒ 서블릿 => Spring
JSP는 서블릿으로 변환됨.

<%@ 임포트 %>

<%! 메서드선언, iv, cv선언 %> -> 클래스 영역으로 들어감

<% 자바코드 %> -> service메서드 안으로(메서드 영역)
<%= 값출력 %> -> service메서드 안으로
HTML -> out.println으로 service메서드 안으로 들어감.

JSP의 기본 객체

생성없이 사용할 수 있는 객체
service메서드의 지역변수(lv)로 선언되어있음.
따라서 JSP에서 선언 없이 사용 가능.

request, response, session, application, out, exception ...

*.jsp에서 요청이 들어오면 JspServlet이 서블릿 인스턴스가 존재하는지 확인.
존재하지 않으면 .jsp를 서블릿 소스파일(.java)로 변환하고,
.java를 서블릿 클래스파일(.class)로 컴파일 함.
이렇게 첫번째 호출에서는 시간지연이 발생.
그 다음 서블릿 인스턴스를 생성하고 응답함.

두번째부터는 서블릿 인스턴스가 존재하므로
[요청 -> _jspService()실행 -> 응답] 순서로 진행.

서블릿과 Spring은 둘 다 싱글톤.
서블릿 - lazy init(지연된 초기화)
Spring - early init

profile
안녕하세요!!

0개의 댓글