[부스트코스 웹 프로그래밍 기초(5)]

CHAPTER. 05 Servlet

Point. 01 Servlet 컴파일 및 실행

perspective 선택

  • java EE perspective 선택

프로젝트 생성

  • file > New > Dynamic Web Project 선택

  • 프로젝트 이름 지정 Target runtime > New Runtime 선택 (사용할 WAS 선택)


  • 사용할 WAS 종류 및 버전 선택 > Next > Browse 설치 된 WAS 경로 지정 > Finish

서블릿 파일 생성

  • 생성한 프로젝트에서 New > Servlet

  • 패키지이름 클래스이름 지정 > Next

  • URL mapping : 접근 할 URL Edit으로 지정 혹은 기본 값 이후 Next

  • doGet 이외에 나머지는 체크박스 해제 후 Finish

  • 생성 된 서블릿 파일
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>HELLO WORLD</h1>");
  • protected void doGet 부분 -> doGet 메서드

  • GET 메서드에 요청이 들어오면 동작해서 출력 할 코드 작성 후 저장 (ctrl + s)

  • PrintWriter 객체 out -> response 객체로부터 가져온 객체 응답결과를 보내줌


  • 상단 메뉴 바 Run > Run As > Run on Server > Finish: 작성 웹 앱 컴파일

  • 서블릿 파일 동작 확인

Point. 02 Servlet 작성

버전에 따른 Servlet 작성

  1. Servlet 3.0 스펙 이상

    1. web.xml 파일을 사용하지 않음

    2. 자바 어노테이션 사용

  • 자바 어노테이션 (annotation)

@를 이용한 주석, 자바코드에 주석을 달아 의미를 부여 한다.
컴파일러가 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보 추가하는 정형화된 방법

import javax.servlet.annotation.WebServlet;      
//javax.servlet.annotation 패키지 import

@WebServlet("/net") //WebServlet어노테이션 속성 사용
  1. Servlet 3.0 미만에서 사용

    1. servlet 등록 시 web.xml 파일에 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>exam25</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>TenServlet</display-name>
    <servlet-name>TenServlet</servlet-name>
    <servlet-class>exam.TenServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TenServlet</servlet-name>
    <url-pattern>/ten</url-pattern>
  </servlet-mapping>
</web-app>
  • 18~24라인 서블릿 클래스 작성 및 url 지정

Point. 03 Servlet 라이프사이클

LifecycleServlet 클래스 생성

서블릿 생명주기 확인을 위한 init, service, destroy 메서드 override

생성된 메서드 동작 확인을 위해 콘솔창에 출력

package testweb;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
public LifecycleServlet() {
        System.out.println("LifecycleServlet Create");
        // TODO Auto-generated constructor stub
    }
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init 호출!");				
	}
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy 호출");
	}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service 호출");
	}
}
  • System.out -> PrintWrite와 다르게 응답 결과가 아닌 콘솔에 결과 출력

  • 서블릿을 생성과 초기화 서비스 호출 동작 콘솔로 확인

  • WAS내 메모리에 서비스가 올라가 있지 않은 경우 생성과 초기화 후 서비스가 동작

System.out.println("destroy 호출");
System.out.println("destroy 호출!"); // 호출 -> 호출! 수정 후 저장

  • 서블릿이 수정되면 destroy 메소드를 호출한 후 다시 메모리에 로드 할 수 있게 한다.

  • 메모리내에 서블릿이 로드 되어있다면 서비스 메소드만 호출된다.

Servlet 생명주기

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 로드 되어있는지 확인

  • 메모리에 없을 경우

해당 서블릿 클래스를 메모리에 올린다

init() 메소드 실행

  • 메모리에 로드 되어있는 경우

service() 메소드 실행

  • WAS가 종료되거나, 웹 어플리케이션이 갱신될 경우 destroy() 메소드 실행

  • service() 메소드를 오버라이드 하지 않은 경우

부모인 HttpServlet의 service() 메소드가 실행된다.

)

service(request, response) 메소드

	@Override
	protected void doGet(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<haed><title>form</title></head>");
		out.println("<body>");
		out.println("<form method = 'post' action='/firstweb/LifecycleServlet'>");
		out.println("name : <input type='text' name='name'><br>");
		out.println("<input type='submit' value='ok'><br>");
		out.println("</form>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String name = request.getParameter("name");
		out.println("<h1> hello" + name + "</h1>");
	}


  • 클라이언트 요청이 GET일 경우 doGet 메소드 호출

  • 클라이언트 요청이 POST일 경우 doPost 메소드를 호출

Point. 04 Request, Response 객체

WAS가 브라우저로부터 Servlet 요청을 받는 경우

  • 요청할 때 가지고 있는 정보는 HttpServletRequest 객체를 생성하여 저장

  • 웹 브라우저에게 응답을 보내기 위한 HttpServletResponse 객체 생성

  • 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에 전달

HttpServletRequest

  • http 프로토콜의 요청 정보를 서블릿에 전달하기 위해 사용

  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가진다.

  • body의 Stream을 읽어 들이는 메소드를 가지고 있다.

HttpServletResponse

  • 요청을 보낸 클라이언트에게 응답을 보내기 위한 객체를 생성하여 서블릿에 전달

  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지 등을 전송

  • 요청헤더 정보

  • 응답헤더 정보

카테고리:

업데이트: