본문 바로가기

학원/복기

[Servlet] Servlet 프로그램 작성 방법

Servlet 프로그램 작성 방법

 

 
1. HttpServlet 클래스를 상속받은 자식클래스를 작성한다. - 서블릿 클래스

 
(HttpServlet 클래스는 J2EE 라이브러리가 제공해주는 클래스 중 하나이다. ApacheTomcat 라이브러리에서 기본으로 제공해준다.)
→  HttpServlet 클래스를 상속받은 자식클래스는 객체 직렬화 클래스로 serialVersionUID 필드를 선언하는 것을 권장한다.

 

* 객체 직렬화 클래스는 객체를 파일로 저장하거나 네트워크를 통해 전송할 때 사용된다. 객체 직렬화는 객체의 상태를 보존하고 나중에 복원할 수 있게 해주므로, 분산 환경이나 데이터의 영속성을 유지해야 하는 경우 유용하게 사용될 수 있다.
 

public class HelloServlet extends HttpServlet{
	//serialVersionUID 필드 선언 
	private static final long serialVersionUID = 1L;
}

 
 

2. doGet() 메소드 또는 doPost() 메소드를 오버라이드 선언

 
→ 클라이언트에 요청에 대한 처리 명령과 실행결과를 웹문서로 생성하는 명령을 작성하는 메소드 - 요청 처리 메소드 : WAS에 의해 자동 호출되는 메소드 
 doGet() 메소드는 클라이언트가 서블릿 프로그램을 GET 방식으로 요청한 경우 호출되는 메소드이다. 
→ doPost() 메소드는 클라이언트가 서블릿 프로그램을 POST 방식으로 요청한 경우 호출되는 메소드이다.
 
doGet() 메소드 또는 doPost() 메소드 대신 service() 메소드를 오버라이드 선언 가능하다.
 service() 메소드 : 클라이언트가 서블릿 프로그램을 모든 방식으로 요청한 경우 호출되는 메소드 
→ doGet() 메소드 또는 doPost() 메소드보다 service() 메소드의 호출 우선순위가 높게 설정
 
WAS 프로그램에 의해 요청 처리 메소드가 호출될 때 메소드 매개변수에는 HttpServletRequest 객체와(request 객체) HttpServletResponse 객체(response 객체)가 전달되어 저장된다.
 
HttpServletRequest 객체 : 리퀘스트 메시지(요청 관련 정보)를 표현한 객체
HttpServletResponse 객체 : 리스폰즈 메시지(응답 관련 정보)를 표현한 객체 
→ 이 두개의 객체가 가지고 있는 메소드를 가지고 웹프로그램을 만든다.
 

@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

 
3. 클라이언트 요청에 대한 실행결과를 저장하여 응답하기 위한 파일형태(MimeType)를 변경한다. (생략가능)

리스폰즈 메세지의 몸체부에 저장될 파일형태를 설정한다. (파일을 만들어다가 클라이언트에게 보낼 수 있다.)
 
HttpServletResponse.setContentType(String mimeType[;charset=encoding]) 메소드 호출 
 리스폰즈 메세지의 몸체부에 저장될 파일형태를 변경하는 메소드이다.
→ 응답 파일이 문서파일인 경우 문자형태(CharacterSet - Encoding)를 설정해 주어야 한다. 문서파일이 아닌 경우 CharacterSet을 설정해줄 필요는 없다.
 
기본적으로 응답되는 파일의 형식은 text/html(html 문서)이고 문자형태는 charset=iso-8859-1 이다.
: text/html;charset=iso-8859-1 >> 서유럽어로된 HTML 문서로 응답
 
한글로된 HTML 문서로 응답하기 위해서는 utf-8 문자형태로 변경해주어야 한다.

response.setContentType("text/html;charset=utf-8");//한글로 만들어진 HTML 문서로 응답

 

4. 응답파일을 생성하기 위한 출력스트림을 반환받아 저장한다. (생략가능)

 
HttpServletResponse.getOutputStream() : 응답파일을 생성하기 위한 출력스트림(ServletOutputStream 객체)을 반환하는 메소드
→ 원시데이터(1Byte)를 전달해 그림, 소리, 동영상 파일등과 같은 이진파일을 생성하기 위한 출력스트림
 
HttpServletResponse.getWriter() : 응답파일을 생성하기 위한 출력스트림(PrintWriter 객체)을 반환하는 메소드
→ 문자데이터(2Byte)를 전달해 HTML 파일, XML 파일 등과 같은 문서파일을 생성하기 위한 출력스트림
 

PrintWriter out=response.getWriter();

 
 

5. 클라이언트 요청에 대한 처리 명령 작성 및 출력스트림을 이용한 응답파일 생성 

→ 클라이언트 요청에 대한 처리 명령에 필요한 값은 HttpServletRequest 객체로부터 제공받아 사용한다.
 
PrintWriter.println(String str) : 출력스트림으로 문자열을 전달하는 메소드 - 응답파일을 만들어줄 수 있다.
 

out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>서블릿(Servlet)</h1>");
out.println("<hr>");
out.println("<p>Hello, Servlet!!</p");
out.println("</body>");
out.println("</html>");

 
하지만 이렇게 해서는 실행이 되지 않는다.
servlet이라는 웹프로그램이 만들어진 것이 아니라 클래스를 만든 것이기 때문이다.
웹브라우저는 서버에 웹자원을 요청하는 것이지, 클래스를 요청하는 것이 아니다.
 
 

6. 서블릿 클래스를 서블릿 프로그램(웹프로그램)으로 실행되도록 설정해야 한다.

[web.xml] 파일에서 서블릿 클래스를 서블릿으로 등록하고 서블릿을 요청할 수 있는 URL 주소를 매핑 설정해야 한다.
 
클라이언트가 매핑된 URL 주소의 서블릿을 요청하면 WAS 프로그램은 서블릿 클래스를 객체로 생성하여 요청 처리 메소드를 호출하고 처리 결과를 클라이언트에게 전달하여 응답한다.
→ 만약 클라이언트가 요청한 서블릿에 대한 클래스가 이미 객체로 생성된 경우에는 요청 처리 메소드만 호출하여 실행한다.
 
web.xml 파일은 웹 애플리케이션의 WEB-INF 디렉토리에 위치한다.

 

web.xml 

: 웹프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)으로 변환될 때 필요한 정보를 제공하기 위한 환경설정파일
→ XSD (XML Schema Description) 파일에 선언된 태그(엘리먼트) 사용이 가능하다.
 
[소스코드]

<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml : 웹프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)으로 변환될 때 필요한 정보를 
제공하기 위한 환경설정파일 - XSD(XML Schema Description) 파일에 선언된 태그(엘리먼트)만 사용 가능 -->
<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">
	<!-- display-name : 프로젝트 이름을 설정하기 위한 엘리먼트 -->
	<display-name>servlet</display-name>
	
	<!-- servlet : 서블릿 클래스를 서블릿으로 등록하기 위한 엘리먼트 -->
	<servlet>
		<!-- servlet-name : 서블릿을 구분하기 위한 이름(고유값)를 설정하기 위한 엘리먼트 -->
		<servlet-name>hello</servlet-name>
		<!-- servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하기 위한 엘리먼트 -->
		<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
	</servlet>
	
	<!-- servlet-mapping : 클라이언트가 요청하여 실행하기 위한 서블릿의 요청 URL 패턴을 
	매핑하기 위한 엘리먼트 -->
	<servlet-mapping>
		<!-- servlet-name : 요청 URL 패턴에 의해 실행될 서블릿의 이름을 설정하기 위한 엘리먼트 -->
		<servlet-name>hello</servlet-name>
		<!-- url-pattern : 서블릿을 요청하기 위한 요청 URL 패턴을 등록하기 위한 엘리먼트 -->
		<url-pattern>/hello.itwill</url-pattern>
	</servlet-mapping>
	
	<!-- welcome-file-list : welcome-file 엘리먼트 목록을 설정하기 위한 엘리먼트 -->
	<welcome-file-list>
		<!-- welcome-file : 클라이언트가 서버에 접속하여 웹프로그램을 요청하지 않은 경우 기본적으로  
		실행되어 응답될 웹문서의 이름을 설정하기 위한 엘리먼트 - 순차적으로 적용 -->
		<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>

 
 
 
[HelloServlet 클래스 전체 소스코드]

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//서블릿 프로그램 작성 방법
//1. HttpServlet 클래스를 상속받은 자식클래스를 작성
public class HelloServlet extends HttpServlet{
	//serialVersionUID 필드 선언 
	private static final long serialVersionUID = 1L;
	
	//2. doGet() 메소드 또는 doPost() 메소드를 오버라이드 선언
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//3. 클라이언트 요청에 대한 실행결과를 응답하기 위한 파일형태(MimeType)를 변경 
		response.setContentType("text/html;charset=utf-8");//한글로 만들어진 HTML 문서로 응답
		
		//4. 응답파일을 생성하기 위한 출력스트림을 반환받아 저장 
		PrintWriter out=response.getWriter();
		
		//5. 클라이언트 요청에 대한 처리 명령 작성 및 출력스트림을 이용한 응답파일 생성 
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿(Servlet)</h1>");
		out.println("<hr>");
		out.println("<p>Hello, Servlet!!!</p>");
		out.println("</body>");
		out.println("</html>");
		
		//6. 서블릿 클래스를 서블릿 프로그램(웹프로그램)으로 실행되도록 설정
		// => [web.xml] 파일에서 서블릿 클래스를 서블릿으로 등록하고 서블릿을 요청할 수 있는
		//URL 주소를 매핑 설정
		
	}	
}

 

출력 결과