[Web] Servlet이란?

kiwonkim·2021년 5월 11일
0

Web

목록 보기
4/4
post-thumbnail

Servlet(서블릿)

  • 클라이언트의 요청에 따라 동적 서비스 수행 후 결과를 반환하는 자바 클래스

  • WAS(컨테이너)는 서블릿을 호출하여 실행. 서블릿은 실행결과를 WAS에 반환. WAS는 최종결과를 클라이언트에 전송.

  • Servlet API로 서버측에 패키지 형태로 HttpServlet까지 구현되어 있음. 따라서 프로젝트에서 이를 include 해주어야함.

  • 사용자 서블릿은 보통 HttpServlet을 상속받아 오버라이딩 하여 기능 구현.


서블릿 생명주기

  • Servlet도 자바 클래스이므로 생명주기를 갖는다.

  • init() -> doGet()/doPost() -> destroy()

  • init() : 서블릿을 메모리에 생성할 시 한번 호출됨. 주로 초기화 담당

  • doGet() / doPost() : 서블릿 요청시 마다 호출. 실제 작업 수행.

  • destroy() : 메모리에서 소멸시 한번 호출. 마무리 작업 담당

  • 사용자 서블릿은 이 생명주기를 오버라이딩 하여 구현한다.

  • 서블릿은 스레드 방식. 여러 클라이언트가 요청 시 처음 한번만 메모리에 생성된다. 따라서 init과 destroy는 한번만 호출. doGet은 요청시마다 계속 호출됨.


브라우저에서 서블릿 호출

  1. 패키지 포함 클래스 이름으로 호출

    http://127.0.0.1:8080/web01/ex01.FirstServlet
    너무 복잡하다.

  2. web.xml 수정하여 서블릿 매핑
    웹 프로젝트의 Context 느낌. 실제 서블릿이름과 브라우저이름 매핑시키기.
    매핑쌍이 여러개일 시 서블릿 태그와 서블릿매핑 태그 덩어리 구분시킬 것.

    Servlet 태그에는 Servlet-name 에 매핑이름. Servlet-class에 클래스이름.
    Servlet-mapping태그에는 매핑이름과 url-pattern에 브라우저이름.

  3. 애너테이션 이용 서블릿 매핑
    간편하여 주로 이 방식 사용

    클래스 선언부 위에
    @webServlet("/서블릿 매핑 이름")
    또는
    @webServlet(name = "서블릿 이름", value = "/서블릿 매핑 이름")

실제 호출모습


브라우저에서 호출 시 IDE에서 서블릿이 실행된다.
스레드 방식이라 여러 클라이언트가 실행해도
init은 한번만 호출, doGet은 클라이언트 마다 호출되는 모습이다.


서블릿의 Request 수신

서블릿과 JSP는 정적 콘텐츠인 HTML,CSS,JS와 연동하여 동작한다.

로그인 서블릿 구현

   login.html
  HTMl의 form 태그를 통해 Servet/JSP에 사용자의 요청 전달


   loginServlet.java
  form태그의 정보를 getParameter 함수를 통해 저장.

클라이언트가 요청을 전송하면,
톰캣 컨테이너는 HttpServletRequest 객체. HttpServletResponse 객체를 생성한다.
서블릿은 doGet / doPost를 통해 두 객체를 받고.
해당 클래스의 메서드인 getParamter 등을 이용하여 데이터 수신 or 응답에 사용한다.

로그인을 진행하면 IDE 콘솔에 결과가 출력되는 것을 확인할 수 있다.


서블릿의 Response 송신

LoginServlet2.java
response 객체의 getWriter 메서드는 PrintWriter 객체를 생성한 뒤 반환한다.
Html 태그를 문자열에 입력한 후 print 를 이용해 브라우저에 송신.

getWriter 객체로 진행한 print는 브라우저 화면으로 전송된다.

실행결과


doGet()과 doPost()

Html의 form 태그 method 값과. 서블릿 doGet() / doPost() 중 무엇을 구현할지 일치시켜야함.

doget()은 속도가 빠르지만 송신정보가 남는 보안 문제 발생.

doPost()로 구현시 다음과 같이 송신정보가 남지 않음.

한 서블릿에서 form 태그의 method 값에 따라 doGet() doPost 처리하기.
-> 별도의 메서드를 구현해서 해당 메서드를 호출하면 된다.

method가 get이면 doHandle 호출. get방식으로 처리.
method가 post이면 마찬가지로 doHandl 호출하지만. post 방식으로 처리.

method를 get으로 하고 입력시 doGet과 doHandle 이 호출된다.
post로 하면 doPost와 doHandle이 호출됨.

0개의 댓글