[부스트코스 웹 프로그래밍 기초(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 작성
- 
    
Servlet 3.0 스펙 이상
- 
        
web.xml 파일을 사용하지 않음
 - 
        
자바 어노테이션 사용
 
 - 
        
 
- 자바 어노테이션 (annotation)
 
@를 이용한 주석, 자바코드에 주석을 달아 의미를 부여 한다.
컴파일러가 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보 추가하는 정형화된 방법
import javax.servlet.annotation.WebServlet;      
//javax.servlet.annotation 패키지 import
@WebServlet("/net") //WebServlet어노테이션 속성 사용
- 
    
Servlet 3.0 미만에서 사용
- 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, 응답코드, 응답 메시지 등을 전송
 
- 요청헤더 정보
 
- 응답헤더 정보
 





















