객체 생성 및 삭제
클라이언트의 요청으로부터 시작되는 웹서버의 처리 순서를 알아보면 다음과 같다.
-
클라이언트가 웹 브라우저에서 서비스를요청한다. 이때 HTTP 프로토콜 기반으로 요청정보가 만들어져 웹서버에 전달된다.
-
웹서버는 클라이언트로부터 전달받은 요청정보의 URI를 살펴보고, 서블릿이라면 서블릿 컨테이너에 처리를 넘긴다.
-
서블릿 컨테이너는 요청받은 서블릿 클래스 파일을 찾아서 실행한다.
-
실행할 때 첫 순서는 최초의 요청인지를 파악한다. 최초의 요청이라면 메모리에 로딩 후 객체를 생성하고 init()메소드를 호출한다.
-
init()메소드 실행이 끝난 후에는 '서블릿 실행 요청이 들어올때 마다' 실행되는작업으로 서블릿 컨테이너는 HttpServletRequest 와 HttpServletResponse 객체를 생성한다.
- HttpServletRequest객체 : 클라이언트로부터 요청받은 정보를 처리할 목적으로 생성
- HttpServletResponse 객체 : 클라이언트에게 보내는 응답 정보 -
service() 메소드를 호출한다. 이때, 앞에서 생성한 HttpServletRequest 와 HttpServletResponse 객체의 주소를 인자로 넘긴다. service() 메소드에서는 인자로 받은 두 객체를 사용하여 프로그램을 구현한다.
-
service() 메소드가 완료되면 클라이언트에게 응답을 보내고 서버에서 실행되는 프로그램은 완료된다.이때 HttpServletRequest 와 HttpServletResponse 객체는 소멸된다.
HttpServletRequest 와 HttpServletResponse 객체는 service() 메소드가 실행되기 전에 생성되었다가 끝나면 소멸한다.
따라서 service() 메소드가 실행되는 동안에만 메모리에 상주하고 있어서 그동안에만 사용할 수 있다.
응답정보 처리 HttpServletResponse
서비스를 요청한 클라이언트에게 응답하기 위한 기능을 처리할 때 javax.servlet 패키지의
- ServletResponse : 일반적인 네트워크 통신에서의 응답 관련 메소드 제공
- HttpServletResponse : HTTP 통신 기반의 응답 관련 메소드 확장 제공
인터페이스를 이용한다.
ServletResponse 와 HttpServletResponse의 메소드는 아래의 API문서를 참고 하자.
https://docs.oracle.com/javaee/7/api/javax/servlet/ServletResponse.html
출력응답 / 한글응답
HttpServletResponse 객체를 활용하여 클라이언트 쪽으로 문자열을 전송한 다음, 웹 브라우저에 문자열을 출력하는 예제를 보자
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* /showtime 요청에 대해서 응답할 서블릿 정의 하기
*
* 1. HttpServlet 클래스를 상속받는다.
* 2. service() 메소드를 오버라이딩 한다.
* 3. @WebSerlvet("/showtime") 요청 경로를 어노테이션으로 등록한다.
*
*/
@WebServlet("/showtime")
public class ShowTimeServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//응답 한글 인코딩 설정
resp.setCharacterEncoding("utf-8");
//응답 content type 설정(html 페이지를 응답하겠다고 알리기)
resp.setContentType("text/html; charset=utf-8");
//요청한 클라이언트에게 문자열을 출력할 수 있는 객체(클라이언트의 웹브라우저에 출력된다.)
PrintWriter pw=resp.getWriter();
pw.println("<!DOCTYPE html>");
pw.println("<html>");
pw.println("<head>");
pw.println("<meta charset=\"UTF-8\">");
pw.println("<title>Insert title here</title>");
pw.println("</head>");
pw.println("<body>");
//날짜 객체를 생성
Date d=new Date();
//현재 날짜 시간 정보를 문자열로 간단히 얻어내기
String info=d.toString();
pw.println("<p>현재 시간 : <strong>"+info+"</strong></p>");
pw.println("</body>");
pw.println("</html>");
//출력 스트림 끊어주기
pw.close();
}
}
RUN을 해서 서버를 실행해보면
브라우저에 다음과 문자열이 잘 출력된 것을 확인할 수 있다.
[페이지 소스보기]를 하면 HTML 문서 형식의 문자열이 전달된 것을 확인할 수 있다.
요청 정보 처리HttpServletRequest
브라우저에 적절한 URL 문자열을 이용하여 웹서버에 서블릿 수행을 요청할 때 일정한 형식의 다양한 정보를 서버로 전달한다. 이때 클라이언트가 서버로 전달하는 요청정보들은 다음과 같다.
- 클라이언트의 IP 주소, 포트 번호
- 클라이언트가 전송한 요청 헤더 정보
(클라이언트에서 처리 가능한 문서 타입의 종류, 클라이언트 프로그램 정보, 처리 가능한 문자셋 정보, 쿠키 정보) - 요청방식, 요청 프로토콜의 종류와 버전, 요청하는 파일의 URI, 요청받은 서버의 정보
- 서버의 호스트 이름, 포트 번호
- 사용자가 서블릿 요청시 추가로 전달한 정보
- 질의(Query)문자열(웹서버에 서비스를 요청하면서 추가로 전달한 name=value 형태의 데이터)
위의 요청 정보들은 HttpServletRequest 인터페이스의 getXXX() 메소드를 통해 추출할 수 있고,
HttpServletRequest는 service()나 doGet() 또는 doPost() 메소드의 첫 번째 인자로 전달된다.
HttpServletRequest는 ServletRequest를 상속받는다.
- ServletRequest : 일반적인 네트워크 통신에서의 요청 관련 메소드 제공
- HttpServletRequest : HTTP 통신 기반의 요청 관련 메소드를 확장하여 제공
내가 개발한 서블릿이 service() 메소드를 재정의하지 않았다면 다음과 같은 순서로 처리된다.
요청정보 추출과 관련된 ServletRequest와 HttpServletRequest 인터페이스의 메소드는 아래의 API 문서에서 찾아볼 수 있다
https://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html
'Servlet&JSP' 카테고리의 다른 글
Emmet 단축키 설정하기(emmet snippet 등록) (0) | 2020.01.06 |
---|---|
[Tomcat / Oracle]DB 연동하기 (0) | 2020.01.06 |
서블릿(Servlet) 구현 / 실행 (0) | 2020.01.06 |
웹 애플리케이션 접근 / 위치 / 구조 / web.xml / 서블릿 디렉터리 (0) | 2020.01.05 |
JAVA와 Web (0) | 2020.01.02 |