본문 바로가기
교재 실습/자바 웹 개발 워크북

15. 서블릿 만들기 (1)

by Jint 2022. 1. 9.

web03 프로젝트에서 자바 패키지 'lesson03.servlets'에 javax.servlet.Servlet 인터페이스를 구현한 'HelloWorld'클래스를 만든다.

package lesson03.servlets;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloWorld implements Servlet {
	
	//Servlet 구현 : 서블릿 클래스는 반드시 javax.servlet.Servlet 인터페이스를 구현해야 한다.
	//서블릿 컨테이너가 서블릿에 대해 호출할 메서드를 정의한 것이 Servlet 인터페이스다.
	
	/*
	1. 서블릿 생명주기(생성과 실행, 소멸 - Lifecycle)와 관련된 메소드 : init(), service(), destroy()
	2. 서블릿 정보를 추출할 필요가 있을 때 호출하는 메소드(보조 메소드) : getServletConfig(), getServletInfo()
	(서블릿 컨테이너 관리자 페이지에서 서블릿 정보를 출력할 때도 사용)
	*/ 
	
	ServletConfig config;
	
	/**
	 * init() : 서블릿 컨테이너가 서블릿 생성 후 초기화 작업을 수행하기 위해 호출하는 메소드
	 * EX) DB 연결, 외부 스토리지 서버 연결, 프로퍼티 로딩 등 클라이언트 요청 처리의 필요한 자원 미리 준비
	 * @param config
	 * @return 
	 * @throws ServletException
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 호출됨");
		this.config = config;
	}
	
	/**
	 * destroy() : 서블릿 컨테이너가 종료되거나 웹 애플리케이션이 멈출 때, 해당 서블릿을 비활성화 시킬 때 호출되는 메소드
	 * EX) 서비스 수행을 위해 확보했던 자원 해제, 데이터 저장 등 마무리 작업
	 * @param 
	 * @return 
	 * @throws 
	 */
	@Override
	public void destroy() {
		System.out.println("destroy() 호출됨");
	}
	
	/**
	 * service() : 클라이언트가 요청할 때마다 호출되는 메소드, 실질적으로 서비스 작업을 수행
	 * EX) 서블릿이 해야 할 일
	 * @param request, response
	 * @return 
	 * @throws ServletException, IOException
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		System.out.println("service() 호출됨");
	}
	
	/**
	 * getServletConfig() : 서블릿 설정 정보를 다루는 ServletConfig 객체 반환.
	 * EX) 서블릿 이름, 서블릿 초기 매개변수 값, 서블릿 환경정보를 얻을 수 있다.
	 * @param 
	 * @return this.config
	 * @throws 
	 */
	@Override
	public ServletConfig getServletConfig() {
		System.out.println("getServletConfig() 호출됨");
		return this.config;
	}
	
	/**
	 * getServletInfo() : 서블릿을 작성한 사람에 대한 정보, 서블릿 버전, 권리 등을 담은 문자열 반환
	 * EX) 서블릿 작성자 정보, 서블릿 버전, 권리 등을 담은 문자열
	 * @param 
	 * @return "version=1.0;author=eomjinyoung;copyright=eomjinyoung 2013"
	 * @throws 
	 */
	@Override
	public String getServletInfo() {
		System.out.println("getServletInfo() 호출됨");
		return "version=1.0;author=eomjinyoung;copyright=eomjinyoung 2013";
	}
	
}

javax.servlet.Servlet 인터페이스를 구현하여 5개의 메소드를 오버라이드한 구조이다.

 

서블릿 배치 정보를 담은 배치 설명서 파일(web.xml)을 작성했다.

<?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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>web03</display-name>
  
  <!-- 서블릿 배치 정보 -->
  
  <!-- 서블릿 선언 -->
  <!-- 
  servlet : 서블릿 별명과 서블릿 클래스명 설정
  servlet-name : 서블릿 별명, 클래스 이름일 필요가 없고 공백을 포함해도 된다.
  servlet-class : 패키지 이름을 포함한 서블릿 클래스명 (QName = Fully qualified name = 패키지명 + 클래스명)
   -->
  <servlet>
  	<servlet-name>Hello</servlet-name>
  	<servlet-class>lesson03.servlets.HelloWorld</servlet-class>
  </servlet>
  
  <!-- 서블릿을 URL과 연결 -->
  <!-- 
  servlet-mapping : 서블릿과 URL을 매핑
  servlet-name : servlet태그에서 정의한 서블릿 별명
  url-pattern : 서블릿을 요청할 때 클라이언트가 사용할 URL 설정('/'는 컨텍스트 루트, 즉 웹 애플리케이션 루트를 의미)
   -->
  <servlet-mapping>
  	<servlet-name>Hello</servlet-name>
  	<url-pattern>/Hello</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
</web-app>

웹 애플리케이션의 배치 정보를 담은 web.xml 파일을 배치 기술서(Deployment Descriptor) 또는 약서 'DD파일'이라고 부른다. 따라서 서블릿을 만들었으면 DD파일에 배치 정보를 등록해야 클라이언트에서 해당 서블릿의 실행을 요청할 수 있다. DD파일에 등록되지 않은 서블릿은 서블릿 컨테이너가 찾을 수 없다.

 

web03 프로젝트를 톰캣 실행환경에 추가하여 서버를 실행한 후 웹 브라우저 주소창에 http://localhost:9999/web03/Hello 를 입력한다.

Hello 서블릿 실행 결과

이렇게 서블릿을 실행하고 싶으면 웹 브라우저에 URL을 입력하고 서버에 요청하면 된다.

URL과 서블릿 매핑

주소창에 입력했던 URL의 '/Hello'가 web.xml의 url-pattern태그에 설정했던 HelloWorld 서블릿의 URL 이름이다.

 

서블릿을 실행했더니 웹 브라우저는 빈 화면을 출력하고 있다. HelloWorld 서블릿이 실행될 때 어떤 내용도 클라이언트로 출력하지 않았기 때문이다. HelloWorld 서블릿의 메소드 안에 입력했던 System.out.println() 메소드는 클라이언트로 출력하는 것이 아닌 서버 콘솔창으로 출력하는 것이다.

서버 콘솔창

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글