2024. 3. 31. 21:26ㆍBE/Servlet_JSP
1. Servlet이란?
- 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양
- 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종.
가. Servlet interface
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
은 Servlet
인터페이스를 구현하고 있다.
웹 서버에서 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 |