[웹 프로그래밍] 12. Servlet


  1. Servlet
      Java Web Application
  : WAS에 설치 (deploy)되어 동작하는 어플리케이션
  ( WAS(Web Application Server)  )
   
  - 자바 웹 어플리케이션에는 html, css, 이미지, 자바로 작성된 클래스 (Servlet 포함, package, interface 등 )
  - 자바 Web Application은 단독으로 운영되는 것이 아니라 WAS 같은 미들웨어를 통하여 실행되기 때문에 정해진 규약을 지켜야 한다.
EX) WEB-INF 폴더가 존재 해야 함
           - web.xml 파일 *매우 중요* (이 웹 어플리케이션에 대한 정보를 모두 가지고 있음)
           - lib 폴더 - jar 파일들 (자료 파일들)
           - classes 폴더 - java패키지, class들
      - 리소스들.. . 각종 폴더, 이미지, 다양한 리소스 들

   - Servlet ? : 자바 웹 어플리케이션 구성요소 중 동적인 처리를 하는 프로그램의 역할
      WAS에서 동작하는 JAVA 클래스
      HttpServlet 클래스를 상속받아야한다
      서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두가지 (JSP, Servlet)을 조화롭게 사용해야 함

     웹 페이지 구성하는 화면(html)은 jsp / 복잡한 프로그래밍은 서블릿



2. Servlet 작성 방법

  • Servlet 3.0 spec 이상에서 사용하는 방법
    • web.xml 파일을 사용하지 않음
    • 자바 annontation 사용
      • @webServlet("/ten")
      • public class TenServlet extends HttpServlet {} ...
      • 3점대 버전에서 web.xml 이 필수는 아니지만 이후 spring등을 사용하는 경우 다른 설정 부분을 web.xml에 추가해야 할 필요가 있기 때문에 그때는 web.xml 생성을 설정해야 한다
    • firstweb에서 사용
  • Servlet 3.0 spec 미만에서 사용하는 방법
    • Servlet을 등록할 때 web.xml파일에 등록
   서블릿 -> 동적으로 응답 결과를 만들어낸다 = 이미 응답할 페이지를 만들어서 가지고 있는 것이 아니라 요청이 들어왔을 때 이 서블릿이 실행되면서 응답할 코드를 만들어내고 그때 그 코드로 응답을 하는 것! 
  
<실습>
1. Eclipse에서 exam31 project 생성 후 1-10 출력하는 페이지 보여주는 'TenServlet.java'서블릿 작성. (Servlet 3.1사용)

이것이 annontation 방법이다. 'ttt'을 변경하면 페이지 url 주소가 바뀐다. 


2. 서블릿 2.5 spec으로 exam25 프로젝트 생성. 1-10 출력하는 TenServlet 작성

web.xml이 기본적으로 생성된다. 
  url - /ten 요청이 들어오면 url mapping에서 찾아내고 여기서 찾지 못하면 404라는 not found 페이지가 출력된다. 여기서 확인하는 것이 <servlet-name>태그 안의 contents와 실제 <servlet>태그 안에서 똑같은 이름의 servlet 이름을 비교하여 내가 실행할 서블릿 이름을 찾아내는 것. (3.x 버전 이상에서는 이것을 annotation 이 알아서 해주는 것)

* servlet의 버전에 따라 서블릿 작성 방법은 같지만 등록 방법은 달라짐을 유념 할 것 *

Servlet클래스 작성 시 HttpServlet 클래스를 상속하지 않았다면 어떻게 동작 할까?
: HttpServlet이 제공하는 메소드의 사용이 불가능. 즉 doGet 메소드의 상속과 재정의가 불가능 하기 때문에 개발자가 직접 http protocol에 맞게 메소드를 생성해야 하는 불편함이있다. 


3. 서블릿의 생성주기 (Life Cycle)

<실습>
서블릿 생명주기를 확인할 수 있는 LifecycleServlet을 작성
HttpServlet의 3가지 메소드를 오버라이딩(재정의) 
- init() / service(request, response) / destroy()

해당 url로 client-server 요청. 서버는 url을 받아서 Lifecycle이라는 url 은 mapping을 통해 LifecycleServlet이라는 것을 알아냄. 메모리에 존재하는지 확인 후 ( 처음 호출했기 때문에 올라와있지 않음) 존재하지 않는 경우 LifecycleServlet을 생성한다. 따라서 
생성자에 넣어는 메세지가 출력되는것
이어서 init , service 메소드가 실행됨을 확인할 수 있다. 
브라우저에서 새로고침을 실행하는 경우 service 메서드만 호출됨을 알 수 있다. 
서블릿은 객체를 여러번 만드는 것이 아니라 메모리에 객체가 있다면 service 객체만 호출하기 때문이다
servlet java 파일을 수정하고 저장하면 destroy 메소드가 호출 되고, 창을 새로고침하면 새로운 서블릿파일에 대한 객체가 없기때문에 생성자, init, service가 차례로 호출됨을 볼 수 있다. 


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

if(메모리에 없음) {
    해당 서블릿 클래스를 메모리에 올림 (=객체의 생성)
    init()메소드 실행
}
service () 메소드 실행 
-> 요청이 들어왔을 때 응답해야 하는 모든 내용은 service()에 구현되어야 되는 것 기억

WAS가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy()메소드 호출됨

- service 메서드 
service 메서드는 Servlet의 template methode pattern으로 구현
클라이언트의 호출이 GET일 경우 자신이 가지고 있는 doGet(request, response)메서드 호출
클라이언트 호출이 POST일 경우 자신이 가지고 있는 doPost(request, response)메서드 호출

<실습>
service(request, response)메서드 주석 처리 
HttpServlet doGet(request, response) / HttpServlet doPost(request, response) 오버라이드



페이지 소스 보기 시


4. HttpServletRequest / HttpServletResponse
  • WAS가 웹 브라우저로부터 Servlet요청을 받으면
    • 요청할 때 가지고 있는 정보를 HttpServletRequest 객체 생성하여 저장
    • 웹 브라우저에게 응답 보낼 때 사용하기 위한 HttpServletResponse 객체 생성
    • 생성된 두 객체를 mapping된 서블릿에 전달
  • HttpServletRequest
    • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용
    • 헤더정보 파라미터, 쿠키, uri, url등 정보를 읽어 들이는 메소드를 가지고 있다
    • body의 stream을 읽어들이는 메소드도 포함
  • HttpServletResponse
    • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에 전달
    • 서블릿은 해당 객체 이용하여 content type, 응답코드, 응답메세지 등을 전송
<실습>
헤더 정보 읽어 들이기 
  웹 브라우저가 요청정보에 담아서 보내는 header값을 읽어 들이는 HeaderServlet 생성




<실습>
url주소의 파라미터 정보 읽어 들여 브라우저화면에 출력하는 Servlet 생성
? 뒷부분이 parameter, &가 기준점 
파라미터 이름 = 파라미터 값



<실습>
URI, URL, PATH, Remote host등에 대한 정보 출력


No comments:

Powered by Blogger.