포스트

Day70 Java프로그래밍 기초(HTTP)

HttpServlet

1. HttpServlet 정의

  • Http 방식으로 통신하는 서블릿 컨테이너는 service 메서드를 호출 할 때, 파라미터 값으로 HttpServlet을 전달한다. image

  • HttpServletRequest, HttpServletResponse을 사용하기 위해서는 GenericServlet을 상속 받아 원래 형변환을 해야한다.
  • 형변환을 줄이기 위해(원래 HttpServlet으로 전달) HttpServlet클래스를 만들어 사용한다.

    image

2. Http의 메서드

  • HttpServlet은 요청 메서드에 따라 달리 처리 할 수 있다.
  • service를 호출하면 요청 메서드에 따라 메서드를 수행한다.
  • service메서드 호출 대신 사용할 메서드를 (doGet,doPost 등)을 바로 호출 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    String httpMethod = request.getMethod();ߜ

    switch (httpMethod) {
      case "GET":
        doGet(request, response);
        return;
      case "POST":
        doPost(request, response);
        return;
      case "PUT":
        doPut(request, response);
        return;
      case "HEAD":
        doHead(request, response);
        return;
      default:
        error(request, response);

3. HttpServlet의 구동 방식

  • ServletContainer은 Servlet을 구동한다.
  • Servlet에 servie(req,res)를 호출하지만, Servlet에는 없으므로 수퍼클래스에서 찾는다.
  • Servlet의 수퍼클래스인 HttpServlet에 service(req,res)를 호출한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Class HttpServlet extends GenericServlet{
      HttpServletRequest httpReq = (HttpServletRequest) req;
      HttpServletResponse httpRes = (HttpServletResponse) res;
        
      @Override
      service(req,res){
        this.service(httpReq,httpRes);  
      }
    }
    
  • this에 담긴 주소는 Servlet 클래스이다.
  • this.service(httpReq, httpRes)는 Servlet의 service를 가르킨다.

image

Load On Startup

1. 서블릿의 생성시기

  • 서블릿의 생성시기는 서블릿 컨테이너가 최초 요청 했을때 생성 된다.
  • 서블릿이 최초 요청되기 전까지는 서블릿의 오류성 검증이 어렵다.
  • 서블릿이 사용하는 자원이 많은 경우 호출 까지 오랜 시간이 걸린다.
  • load on startup을 통해 객체 실행 우선순위를 지정할 수 있다 . image

2. load on startup

  • 어노테이션을 사용하여 설정 할 수 있다.
1
@WebServlet(value = "/ex06/s1", loadOnStartup = 1)
  • xml 파일에서 설정 할 수 있다.
1
2
3
4
<servlet>
   ...
   <load-on-startup>1</load-on-startup>
</servlet>

include와 forward

1. getRequestDistpatcher

  • 서블릿 컨테이너에서 전달받은 request에 대해 Dispatcher(위임)하여 response를 추가하는 역할을 한다.
  • include와 forward의 옵션이 있다.

    1
    2
    
    //DispatchToUrl : req,res를 전달 할 url
    RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl");
    

    image

2. forward

  • forward위임 방식은 기존의 res에 담긴 값들과 앞으로 담기는 값들을 무시한다.
  • 오직 최종적으로 forward 된 Servlet의 결과만 담긴다.
  • setContentType()도 최종 forward된 객체에 담겨야 한다.

    1
    2
    
      RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl");
      deliver.forward(req,res);
    

    image

3. include

  • include는 버퍼의 기존의 res결과값을 담아서 요청을 전달한다.
  • include된 모든 Servlet의 결과를 담는다.

    1
    2
    
      RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl");
      deliver.include(req,res);
    

    image

4. include VS forward

  • forward는 req,res를 전달하여 최종적으로 위윔된 Servlet의 res만 출력한다.
  • include는 req,res값을 포함하여 전달하여 최종적으로 모든 Servlet res가 출력된다. image

refresh와 redirect

  • refresh와 redirect 모두 클라이언트에게 재요청할 url을 http에 담아서 전송한다.
  • 응답을 받은 클라이언트는 재요청한 url로 이동한다. image

1. refresh

  • res에 담은 정보와 함께 클라이언트에 응답한다.
  • 서버로 부터 받은 컨텐트를 출력한 후 지정시간이 경과되면 url을 자동으로 요청한다.
  • refresh 정보는 헤더 정보에 포함되어야 한다.

    1
    2
    3
    4
    5
    6
    7
    
      //res에 header을 설정
      res.setHeader("Refresh","3;url=s100");
    
      //직접헤더를 설정
      out.println("<html><head>");
      out.println("<meta http-equiv='Refresh' content='3;url=s100'>");
      out.println("</head></html>");
    

    image

2. redirect

  • res에 담긴 정보를 삭제하고 바로 재요청한 url로 이동한다.
  • 서버로 부터 받은 url로 즉시 이동한다. 버퍼에 담긴 내용이 없기 때문에 컨텐트는 출력되지 않는다.
  • 클라이언트가 응담결과를 받지않고 즉시 다른 페이지로 이동 할 때 사용한다.

    1
    
      res.sendRedirect("/s100");
    

    image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.