[Servlet_JSP] Servlet

2024. 3. 31. 21:26BE/Servlet_JSP

1. Servlet이란?

 

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양
  • 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종.

 


가. Servlet interface

 

 

Servlet (Java(TM) EE 7 Specification APIs)

Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. This method is only called once all threads within the servlet's service method have exited or after a timeout period has passed. After the servlet con

docs.oracle.com

jakarta.servlet.Servlet이라는 인터페이스를 implements해서 서블릿을 생성할 수 있다.

 

public abstract interface jakarta.servlet.Servlet {

  public abstract void init(jakarta.servlet.ServletConfig arg0) throws jakarta.servlet.ServletException;

  public abstract jakarta.servlet.ServletConfig getServletConfig();

  public abstract void service(jakarta.servlet.ServletRequest arg0, jakarta.servlet.ServletResponse arg1) throws jakarta.servlet.ServletException, java.io.IOException;

  public abstract java.lang.String getServletInfo();

  public abstract void destroy();
}

하지만 실제로 Servlet interface를 직접 구현하지 않는다.

 

 

웹개발에 필요한 기능을 미리 구현해 놓은 HttpServlet을 상속받아서 사용한다.

 


나. HttpServlet class

 

 

HttpServlet (Java(TM) EE 7 Specification APIs)

Called by the server (via the service method) to allow a servlet to handle a PUT request. The PUT operation allows a client to place a file on the server and is similar to sending a file by FTP. When overriding this method, leave intact any content headers

docs.oracle.com

HttpServletServlet 인터페이스를 구현하고 있다.

 

웹 서버에서 HTTP 프로토콜을 지원하여 웹 브라우저의 요청을 처리하는데 특화된 서블릿 클래스다.

 

HttpServlet 클래스에는 HTTP 요청을 처리하는데 필요한 다양한 메서드가 포함하고 있다.

 

추상메서드가 없는 추상클래스로 상속받아서 필요한 기능만 구현하면 된다.

 

메서드 설명
init() 서블릿이 최초로 생성될 때 한번만 호출되며, 초기화 작업을 수행합니다.
service(ServletRequest req, ServletResponse res) 서블릿이 요청을 받을 때 호출되는 메서드로, 요청의 HTTP 메소드에 따라 doGet(), doPost(), doPut(), doDelete() 등을 호출합니다.
destroy() 서블릿이 메모리에서 제거될 때 한번만 호출되며, 자원 해제 등의 마무리 작업을 수행합니다.
doGet(HttpServletRequest req, HttpServletResponse res) HTTP GET 요청을 처리합니다.
doPost(HttpServletRequest req, HttpServletResponse res) HTTP POST 요청을 처리합니다.
doPut(HttpServletRequest req, HttpServletResponse res) HTTP PUT 요청을 처리합니다.
doDelete(HttpServletRequest req, HttpServletResponse res) HTTP DELETE 요청을 처리합니다.
doHead(HttpServletRequest req, HttpServletResponse res) 웹 브라우저에서 헤더 정보만 요청할 때 사용되는 HEAD 요청을 처리합니다.
doOptions(HttpServletRequest req, HttpServletResponse res) 웹 브라우저에서 서버가 지원하는 HTTP 메소드를 요청할 때 사용되는 OPTIONS 요청을 처리합니다.
doTrace(HttpServletRequest req, HttpServletResponse res) 웹 브라우저에서 요청을 추적할 때 사용되는 TRACE 요청을 처리합니다.
getLastModified(HttpServletRequest req) 서블릿의 마지막 수정 시간을 반환합니다.

 

import java.io.*;
import jakarta.servlet.*;
import jakarta.servlet.http.*;

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}
  • response.setContentType("text/html;charset=utf-8"); : 한글 인코딩 설정.

 


2. Servlet 등록

 

서블릿 클래스를 만들어도 바로 사용할 수 없다.

 

클라이언트의 요청에 알맞은 서블릿 클래스를 매핑(등록)을 해야 사용할 수 있다.

 

서블릿을 등록하는 방법은 2가지가 존재한다.

 


가. web.xml

<!-- web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.company.example.HelloWorld</servlet-class>
    <load-on-startup>1<load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  ...
</web-app>

위의 예시는 HelloWorld이라는 서블릿을 /hello이라는 URL 패턴에 매핑하는 방법을 보여준다.

 

웹 애플리케이션에서 /hello를 요청하면, HelloWorld이 처리하게 된다.

 

  • <servlet> : 서블릿을 등록한다. 클래스 경로를 등록한다.
  • <servlet-mapping> : 클라이언트의 요청에 대응하는 서블릿을 매핑한다.
  • <load-on-startup>1<load-on-startup> : 웹 애플리케이션이 시작될 때 서블릿 즉시 실행한다. 서블릿이 시작되는 순서도 지정할 수 있다. 초기화 작업이 오래 걸리는 경우 미리 시작할 수 있다.

 


나. WebServlet Annotation

 

web.xml<servlet><servlet-mapping>을 만들지 않는 방법이 있다.

(단, servlet 3.0부터 지원한다.)

 

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.*;

@WebServlet("/hello")
public class HelloWorld extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Hello World!</h1>");
    }
}
  • @WebServlet("/hello") : urlPattern을 매핑한다.

 

// 간단한 설정
@WebServlet("/hello")

// 다양한 설정
@WebServlet(
    name = "helloWorld",
    urlPatterns = {"/hello", "/helloWorld"},
    loadOnStartup = 1
    )
public class HelloWorld extends HttpServlet {

 


2. Servlet Life-Cycle

 

method 설명
init() 서블릿이 메모리에 로드 될 때 한번 호출.
service() 모든 요청에 대한 처리를 담당. HttpServlet의 경우 모든 요청은 doGet(), doPost()와 같은 doXXX() 메서드를 호출.
destroy() 서블릿이 메모리에서 언로드 될 때 한번 호출. 비정상적인 종료시 호출을 보장할 수 없다.

 

 

다수의 클라이언트가 요청을 보내도 서블릿은 하나만 만들어진다.

 

클라이언트마다 스레드를 할당해 service()를 호출할 뿐 매번 새로운 서블릿이 생성되는 것은 아니다.

 

destroy는 서블릿이 사라질 때 한번 호출된다.

 

하지만 destroy는 실행을 보장하지 않는다.

 

갑자기 정전으로 전원이 꺼지거나 고양이가 전원을 끄면 destroy가 실행되지 않을 수 있다.

 

package com.company.example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/life")
public class LifeCycle extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LifeCycle() {
        super();
        System.out.println("생성자 호출");
    }

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("init 호출");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("service 호출");
    }

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

}

생성자보다는 init()을 활용하자.

 


3. Servlet Parameter 처리

 

HttpServletRequest에서 요청 때 함께 전달된 정보를 확인하는 방법.

 

 

반환 타입 method 설명
String getParameter(String name) 파라미터가 존재한다면, 파라미터의 값을 문자열로 반환합니다.
String[] getParameterValues(String name) 모든 파라미터의 값을 문자열 배열로 반환한다. 없으면 null.
Map<String, String[]> getParameterMap() 요청의 파라미터들을 Map으로 반환.
Enumeration<String> getParameterNames() 요청에 포함된 파라미터들의 이름을 반환
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.*;

@WebServlet("/example")
public class ParameterExample extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String singleParam = request.getParameter("single");
        out.println("<h1>Single Parameter: " + singleParam + "</h1>");

        String[] multipleParam = request.getParameterValues("multiple");
        out.println("<h1>Multiple Parameters: </h1>");
        for(String value : multipleParam) {
            out.println("<p>" + value + "</p>");
        }
    }
}

 


'BE > Servlet_JSP' 카테고리의 다른 글

[Servlet_JSP] JSTL  (0) 2024.04.08
[Servlet_JSP] EL  (0) 2024.04.08
[Servlet_JSP] JSP  (0) 2024.04.01
[Servlet_JSP] Cookie&Session  (0) 2024.03.31