[Servlet] 서블릿의 이해

sang·2024년 1월 23일

서블릿의 개념

  • 클라이언드의 요청에 따라 동적으로 서비스 제공
    서버 쪽에서 실행되는 자바 클래스

  • JSP/Servlet 컨테이너에서 실행
    독자적으로 실행 불가

  • 보안 기능을 안전하게 수행 가능

  • 빠르고 효율적인 동작
    서로 다른 클라이언트가 동일한 서블릿을 요청했을 때,
    메모리에 로드된 서블릿 재사용

JSP/Servlet 컨테이너
톰캣, JEUS, Web Logic, 웹 스피어, JBOSS

서블릿 동작 과정

  1. 클라이언드 -> 웹 서버: 요청
  2. 웹 서버 -> 웹 애플리케이션 서버: 요청 위임
  3. 웹 애플리케이션 -> 서블릿: 호출
  4. 서블릿: 실행
  5. 서블릿 -> 웹 애플리케이션: 결과 전송
  6. 웹 애플리케이션 -> 웹 서버: 결과 전송

서블릿 클래스 계층 구조

Interface: Servlet, ServletConfig
Abstract: GenericServlet
Class: HttpServlet

HttpServlet 메소드

  • protected doDelete(HttpServletRequest req, HttpServletResponse resp)
  • protected doGet(HttpServletRequest req, HttpServletResponse resp)
  • protected doHead(HttpServletRequest req, HttpServletResponse resp)
  • protected doPost(HttpServletRequest req, HttpServletResponse resp)
  • protected service(SerlvetRequest req, ServletResponse resp)
    public service()로부터 요청을 받아서 다른 메소드 호출
  • public service(SerlvetRequest req, ServletResponse resp)
    클라이언트로부터 요청을 받아서 protected service() 호출

서블릿 생명주기 메소드

  • 초기화
    • init()
  • 작업 수행
    • doGet()
    • doPost()
  • 종료
    • destroy()

사용자 정의 서블릿

1. 서블릿 생성

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet{
  @Override
    public void init() throws ServletException {
      System.out.println("init 메서드 호출");
    }

  @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("doGet 메서드 호출");
    }

  @Override
    public void destroy() {
      System.out.println("destroy 메서드 호출");
    }
}

2. 서블릿 매핑

보안을 위해 서블릿 클래스 이름 대신 서블릿 매핑 이름을 사용해 요청 전송

<servlet>
  <servlet-name>연결명</servlet-name>
  <servlet-class>패키지명.서블릿클래스명</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>연결명</servlet-name>
  <url-pattern>/서블릿매핑명</url-pattern>
</servlet-mapping>

예시

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<servlet>
  <servlet-name>aaa</servlet-name>
  <servlet-class>sec01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet>
  <servlet-name>bbb</servlet-name>
  <servlet-class>sec01.ex01.SecondServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>aaa</servlet-name>
  <url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-name>bbb</servlet-name>
  <url-pattern>/second</url-pattern>
</servlet-mapping>

3. 서블릿 요청

http://IP주소:포트번호/프로젝트이름(컨텍스트이름)/서블릿매핑이름
http://127.0.0.1:8090/pro05/first
http://localhost:8090/pro05/first

애너테이션 이용

여러 서블릿을 설정하면 복잡해지는 web.xml 대신
소스 코드에 직접 애너테이션 사용

해당 클래스는 HttpServlet 상속 필수

@WebServlet("/서블릿매핑이름");
public class 클래스이름 extends HttpServlet {
	...
}

예시

package sec04.ex01;
...

/* Servlet implementation class ThirdServlet */
@WebServlet("/third")
public class ThirdServlet extends HttpServlet {
  private static final long serialVersionUID = 1L; //서블릿 클래스 직렬화, 필요에 따라 삭제 가능

  /* @see Servlet#init(ServletConfig) */
  public void init(ServletConfig config) throws ServletException {
    System.out.println("ThirdServlet init 메서드 호출");
  }

  /* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("ThirdServlet doGet 메서드 호출");
  }

  /* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("ThirdServlet destroy 메서드 호출");
 }
}


*자바 웹을 다루는 기술

profile
CS 메모장

0개의 댓글