bdfgdfg
서블릿(Servlet) 기초 본문
동적인 웹페이지를 구현하는 방법은 앞서 JSP라고 헀지만 앞서 나온 방식이 서블릿이다.
-> 계속해서 쓰이고 있는 방식임. JSP는 서브릸의 문제를 보완하여 나온것.
서블릿이란?
서블릿은 서버쪽에서 실행되어 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스.
-> 서블릿은 독자적인 실행은 불가능하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.
서블릿은 다음과 같은 특징이 있다.
- 서버쪽에서 실행되며 기능을 수행
- 스레드 방식으로 실행된다.
- 컨테이너에서 실행됨.
서블릿의 계층구조는 다음과 같다.
HttpServlet클래스는 요청이 들어올 시 service 메소드가 호출되면서 요청 방식에 따라 doGet이나 doPost등이 차례대로 호출된다.
protected doDelete(HttpServletRequest req, HttpServletResponse resp) | ->서블릿이 DELETE request를 수행하기 위해 service()를 통해서 호출됨 |
protected doGet(HttpServletRequest req, HttpServletResponse resp | 서블릿이 GET request를 수행하기 위해 service()를 통해서 호출됨 |
protected doHead(HttpSErvletRequest req, HttpSErvletResponse resp | 서블릿이 HEAD request를 수행하기 위해 service()를 통해서 호출됨 |
protected doPost(HttpServletRequest req, HttpSErvletResponse resq) | 서블릿이 POST request를 수행하기 위해 service()를 통해서 호출됨 |
protected service(HttpServletRequest req, HttpServletResponse resq) | 표준 HTTP request를 public service()에서 전달받아 doXXX() 메서드를 호출함 |
public service(HttpServletRequest req, HttpServletResponse resp) | 클라이언트 request를 protected service()에게 전달한다 |
서블릿의 생명주기 메소드는 다음과 같다.
생명주기 단계 | 호출 메소드 | 특징 |
초기화 | init() | 서블릿 요청시 딱한번 호출 서블릿 생성시 초기화 작업을 주로 수행 |
작업 수행 | doGet() doPost() |
서블릿 요청시 매번 호출 클라이언트의 요청을 처리하는 메소드 |
종료 | destroy() | 서블릿이 기능을 수행하고 메모리에서 소멸할 때 호출 서블릿의 마무리 작업을 주로 수행 |
이제 실제로 이클립스에서 서블릿을 만들어 실습해보자.
-> 그전에 서블릿을 사용하기 위해 해당 라이브러리를 포함해주어야한다.(톰캣의 lib에 servlet-api.jar)
package sec01.ex01;
import javax.servlet.ServletException;
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)
{
System.out.println("doGet");
}
@Override
public void destroy()
{
System.out.println("destroy");
}
}
HttpServlet 클래스를 상속받고 각 메소드들을 오버라이딩 해준다.
해당 서블릿을 브라우저에서 요청하는 방법은 다음과 같다.
- localhost:8090/pro05/sec01.ex01.FirstServlet
이 방법은 패키지명.클래스명으로 서블릿에 접근하는 방식. 위 방식은 불편함 및 보안성문제로 안쓰이고
서블릿 매핑으로 실제 서블릿을 요청하는 방식을 많이쓴다.
서블릿 매핑방법은 다음과 같다.
1. 각 프로젝트에 있는 web.xml에 설정한다
2. <servlet>태그와 <servlet-mapping> 태그를 이용한다.
3. 여러개의 서블릿 매핑시 servlet태그를 정의하고 <servlet-mapping> 태그를 정의한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
<servlet-name>Anything Name</servlet-name>
<servlet-class>sec01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Anything Name</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
위에서 우리가 작성한 FirstServlet클래스를 위와 같이 매핑 시킨 것. 서블릿의 이름은 Anything Name이며, url로 접근할 땐 /first로 접근하면 된다.
실제로 호출해보면 다음과 같이 콘솔로그가 남는다.
여러개의 서블릿이 매핑될때는 <servlet>태그와 <servlet-mapping> 태그를 각각 분리해서 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
<servlet-name>Anything Name</servlet-name>
<servlet-class>sec01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
<servlet-name>Anything Name2</servlet-name>
<servlet-class>sec01.ex01.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Anything Name</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Anything Name2</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
</web-app>
서블릿의 상세한 동작과정은 다음과 같다.
서블릿 동작 과정
- 클라이언트 1: Request -> 서버
- 톰캣 컨테이너(WAS): 서블릿(예, FirstServlet)이 메모리에 로드되어 있는지 확인
- 톰캣 컨테이너(WAS): 최초의 요청인 경우 init() 메서드를 호출하여 FirstServlet 인스턴스를 메모리에 로드
- 톰캣 컨테이너(WAS): doGet() 이나 doPost() 메서드를 호출하여 서비스
- 클라이언트 2: 동일한 Request
- 톰캣 컨테이너(WAS): 서블릿(예, FirstServlet)이 메모리에 로드되어 있는지 확인
- 톰캣 컨테이너(WAS): 메모리에 있으므로 따로 메모리에 로드하지 않고 doGet()이나 doPost
여기서 서블릿이 스레드 방식으로 동작한다는것을 알 수 있음.
-> 매번 프로세스를 생성했다면, 매번 init이 호출되어야함.
그 다음은 web.xml에 서블릿 태그를 작성하는 방식이 아닌 애너테이션을 이용한 서블릿 매핑도 있다.
-> 훨씬편함
애너테이션을 이용해 서블릿 매핑을 하려면 @WebServlet을 이용해야 한다.
-> 또한 해당 애너테이션을 받는 클래스는 반드시 HttpServlet 클래스를 상속받아야함.
package sec01.ex01;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@WebServlet("/thrid")
public class ThirdServlet extends HttpServlet{
}
기본적인 WebServlet 애너테이션이 적용된 클래스 작성법.
다만 매번 작성하는게 귀찮으니 클래스로 생성하지말고 Servlet으로 생성하면 편하다.
테스트 하는 방법은 동일하다.
'웹프로그래밍 > JSP_Servlet' 카테고리의 다른 글
JSP - 2 (0) | 2023.08.11 |
---|---|
JSP (0) | 2023.08.11 |
서블릿에서의 쿠키와 세션 (0) | 2023.08.10 |
서블릿(Servlet) - 2 (0) | 2023.08.07 |
웹 어플리케이션의 기본구조 및 학습 (0) | 2023.08.07 |