ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 요청정보와 응답정보
    Servlet 2019. 2. 20. 13:08

    객체 생성및 삭제 


    1.클라이언트가 웹브라우저에서 서비스를 요청한다. 

    http프로토콜 기반으로 요청정보가 만들어 져서 웹서버에 전달된다.


    2.웹서버는 클라이너트로 부터 전달받은 요청정보의 URI를 살펴보고 서블릿이라면 

    서블릿 컨테이너에 처리를 넘깁니다.


    3. 서블릿 컨테이너는 요청받은 서블릿 클래스 파일을 찾아서 실행합니다.


    4.실행할 때 첫 순서는 최초 요청인지 파악한다. 

    최초요청이라면 메모리에 로딩후 객체를 생성하고 init()메소드를 호출


    5.init() 메소드의 실행이 끝난 다음에는 서블릿 컨테이너는 

    HTTPServletRequest 객체와 HTTPServletResponse 객체는 클라이언트에게

    보내는 응답정보를 처리할 목적으로 생성한다.


    6. service() 메소드를 호출한다. 이때 앞에서 생성한 HttpServletRequest

    와 HttpServletResponse 객체의 주소를 인자로 넘긴다.

    service() 메소드에서 인자로 받은 두객체를 사용하여 프로그램을 구현한다.


    7.service() 메소드가 완료되면 클라이언트에게 응답을 보내고 서버에서 실행되는 프로그램은 완료됨.

     이때 HttpServletRequest, HttpServletResponse 객체는 소멸된다.

     

     이런한 처리과정에서 꼭 기억 해야 할 점은 HttpServletRequest와 HttpServletResponse 객체의

     생존 기간이다.

     HttpServletRequest와 HttpServletResponse 객체는 service() 메소드가 실행되기전에 생성되고

     끝나면 소멸한다. 

     service() 메소드가 실행되는 동안 만 메모리에 상주하고 있다.

     

     

    응답 정보처리 - HttpServletResponse


    서비스를 요청한 클라이언트 에게 응답하기 위한 기능을 처리 할 때

    ServletResponse 인터페이스를 사용한다.

    -이 인터페이스를 통해 출력스트림을 추출하거나 버퍼크기를 설정하고 , 응답할 내용의 문자셋을 설정가능하다.


    HttpServletResponse 인터페이스는 ServletResponse  인터페이스를 상속한다.


    ServletResponse : 일반적인 네트워크 통신에서 응답 관련 메소드 제공

    HttpServletResponse : HTTP 통신 기반의 응답 관련 메소드 확장 제공.


    SevletResponse 인터페이스의 주요 메소드

     함수

    기능 

     PintWriter getWriter()

     서비스를 요청한 클라이언트와 서버간에 연결된 PrintWriter 객체를 생성하여 반환한다.

     void serBufferSize(int size)

    출력스트림의 버퍼크기를 설정한다. 

     void setCharacterEncoding(String charset)

    응답정보 인코딩에 사용할 문자를 설정한다. 

     void setContentLength(int len)

    응답정보의 데이터 길이를 설정한다. 

     void setContenType(String type)

    응답정보의 데이터 형식(MIME 타입)을 설정한다.

     void setLocale(Loclae loc)

    클라이언트가 사용하는 언어, 국가코드등 클라이언트 환경을 설정한다. 


    HttpServletResponse  인터페이스의 주요 메소드


     함수

    기능 

    void addCookie(Cookie cookie) 

    인자값으로 주어진 쿠키를 응답정보의 헤더에 추가한다.

    쿠키는 응답정보의 set-Cookie 헤더의 값으로 추가 되어 클라이언트로 전송된다. 

     String encodeRedirctURL(String url)

    클라이언트와 서버 간 세션이 유지되는 상태에서 브라우저 쿠키를 지원 하지 않을때 주어진 URL 뒤에 세션 아이디를 추가하고 인코딩하여 요청을 재전송한다. 

     String encodeURL(String url)

    주어진  URL세션 아이디를 추가하여 인코딩해서 반환한다. 

    void sendRedirect(String location) 

    응답을 클라이언트가 요청한 URL이 아니라 sendRedirect()에 주어진 URL로 재전송한다. 매개변수 location은 절대 URL이나 상대 URL로 지정한다. 이 메소드는 서버의 특정 자원이 다른 URL로 이동할때 사용할 수 있는 메소드이다.  

     public void setDateHeader(String name,long date)

    날짜를 밀리 초로 변환하여 주어진 이름과 날짜를 응답정보 헤더에 설정한다. 

    public void setHeader(String name , String value) 

    응답정보의 헤더에 주어진 이름과 값을 설정한다. 

     public void setIntHeader(String name , int value)

    주어진 이름과 정숫값을 갖도록 응답정보 헤더에 추가한다. 

    public void setStatus(int sc)

    응답으로 전송될 HTTP 응답에 대한 상태코드를 설정한다.


    출력응답

    package com.edu.test;


    import java.io.IOException;

    import java.io.PrintWriter;


    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("/second")

    public class SecondServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

           

        public SecondServlet() {

            super();

        }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("SecondServlet!!!");

    PrintWriter out  = response.getWriter();

    out.print("<html><head><title>Test</title></head>");

    out.print("<body><h1>have a nice day</h1></body>");

    out.print("</html>");

    out.close();

    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    doGet(request, response);

    }


    }


    한글응답 

    한글을 웹브라우저로 출력 했을때 응답 정보 헤더에 한글을 처리하기 위해 설정하는 내용을 알아보자


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @WebServlet("/third")
    public class ThirdServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.print("<h1>좋은 하루 </h1>");
            out.close();
        }
     
        
     
    }

    cs


    클라이언트에게 보내는 데이터의 문서 타입과 문자셋을 응답정보 헤더에 설정하는 메소드는 setContentType()이다.

    응답정보 헤더에 문서의 타입과 문자셋을 지정하면 웹브라우저(클라이언트)는 한글을 제대로 볼수 있다.


    요청정보 처리 - HttpServletRequest


    브라우저에 적절한 URL 문자열을 이용하여 웹서버에 서블리 수행을
    요청 할 때 일 정한 형식의 다양한 정보를 서버로 전달하는데.
    이때 클라이어트가 서버로 전달하는 요청정보들은 다음과 같다.

    - 클라이언트 IP 주소 , 포트번호

    - 클라이언트가 전송한 요청 헤더 정보 (클라이언트에서 처리 가능한 문서 타입의 종류,클라이언트 프로그램정보 , 처리 가능한 문자셋 정보 , 쿠키정보 )

    - 요청방식 , 요청 프로토콜의 종류와 버전, 요청하는 파일의 URI , 요청받은 서버의 정보

    - 서버의 호스트 이름 포트번호

    - 사용자가 서블릿 요청시 추가로 전달한 정보

    - 질의(Query) 문자열(웹서버에서 서비스를 요청하면서 추가로 전달한 name = value 형태의 데이터)


    위와 같은 요청정보는 getXXX() 메소드로 추출할수잇다.

    service() 나 doGet() doPost()의 메소드의 인자로 전달된다.


    ServletRequest의 주요 메소드

     함수

    기능 

     Object getAttribute(String name)

    ServletRequest 객체 안에 등록된 데이터를 추출하여 반환한다. 

     Enumeration getAttributeNames()

    SerlvetRequest객체 안데 등록된 데이터들의 이름 전부를 하나의

    Enumeration  객체에 담아서 반환한다. 

     String getCharacterEncoding()

    클라이언트가 서버에 서비스를 요청할때 사용한 문자들의 인코딩 문자셋을 반환한다. 

     int getContentLength()

    서비스 요청시 보낸 요청정보 몸체에 포함된 데이터의 길이를 반환한다. 만약 길이를 알 수 없을 때는 -1을 반환한다. 

     ServletInputStream getInputStream()

    요청정보 몸체로부터 바이너리 데이터를 읽어들이기 위해 한번에 한줄씩 읽을수 있는 ServletInputStream 객체를 반환한다. 

     String getPrameter(String name)

    클라이언트가 보낸 질의 문자열 중에서 인자로 지정된 name과 일치하는 것을 찾아 name의 value를 반환한다. 

    Enumeration<String> getParameterNames()

    클라이언트가 보낸 질의 문자열들의 이름을 하나의 Emeration 객체에 담아서 반환한다. 

    String[] getParameterValues(String name)

    클라이언트가 서버로 보낸 질의 문자열 중에서 인자로 지정된 name과 일치하는 모든 값을 찾아 하나의 String 타입의 배열에 담아서 반환한다.

     String getProtocol()

    클라이언트가 서버에 서비스를 요청하면서 사용한 프로토콜 정보를 반환한다. 

     BufferdReader getReader()

     요청정보 몸체로부터 문자 인코딩에 따라 택스트를 읽어들이기 위한 

    BufferedReader 객체를 반환한다.

     String getRemoteAddr()

    서버에 서비스를 요청한 클라이언트의 IP주소를 반환한다. 

     String getScheme()

    서비스 요청시 사용한 프로토콜이름을 반환한다 (https,http,ftp)

     String getServerNames()

    서비스 요청받은 서버이름을 반환한다.

     int getServerPort()

    클라이언트의 서비스를 요청받은 서버포트를 반환한다. 

     ServletContext getServletContext()

    서버가 시작될때 웹 애플리케이션 단위로 생성된 ServletContext객체의 주소를 추출하여 반환한다. 

     void removeAttribute(String name)

    ServletRequest 객체에 setAttribute(name)메소드를 이용하여 등록되 데이터를 삭제한다. 

     void setAttribute(String name, Object o)

    클라이언트의 또 다른 서비스 요청에도 계속 사용하고 싶은 데이터는 서버에 저장해야 하는데 ServletRequest 객체안에 저장해준다. 

     void setCharacterEncoding(String env)

     클라이언트가 요청정보 몸체에 포함해서 보내는 문자열들을 지정된 문자셋을 이용해 인코딩 해준다.


    HttpServeltRequest의 메소드 

     함수

    기능 

    String getHeader(String headerName)

    HTTP 요청헤더에 지정된 headerName 값을 문자열로 반환한다. 만일 

    HTTP 요청 헤더에 headerName의 값이 없으면 null을 반환한다. 

     Enumeration getHeaderNames()

    HTTP 요청 헤더에 포함된 모든 헤더의 이름을 Enumeration으로 반환한다. 

     Enumeration getHeaders(String haderName)

    HTTP 요청 헤더에 포함된 headerName의 모든 값을 Enumeration으로 반환한다. 

     int getHeaders(String headerName)

    HTTP 요청 헤더에 포함된 headerName 값을 int로 반환한다.

    지정된 headerName을 int 값으로 변환 할 수없을때 NumberFormatExeption이 발생하고 , headerNmae 헤더가 HTTP 요ㅊ렁 헤더에 없을 때 -1을 반환한다. 

     long getDateHeader(String haderName)

    HTTP 요청 헤더에 포함된 headerName의 값을 밀리초 로 변환하여 long으로 반환한다. 

    int값으로 변환 못하면 ilegalArgumentExceotion이 발생하고, headerName 헤더가 HTTP 요청 헤더에 없을때 -1을 반환한다.  

     String getPathInfo()

    클라이언트 서비스 요청 시 보낸 요청 URL의 뒷부분에 있는 path 정보를 반환한다. 

     HttpSesstion getSession()

    서비스를 요청한 클라이언트가 사용하는 HttpSessionm객체를 반환한다.

    만일 객체가 없으면 새로 생성해서 반환한다. 

     String getRequstedSessionid()

    서비스를 요청한 클라이언트가 사용하는 HttpSession의ID를 반환한다. 

     boolean isRequestedSessionIdVaild()

    서비스를 요청한 클라이언트가 사용하는 HttpSession객체가 유효한지 판단한다. 

     boolean isRequestedSessionIdFromCookie()

    서비스를 요청한 클라이언트가 사용하는 HttpSession의 ID가 쿠키로 전달되면 true.

    아니면 false를 반환 

     boolean isRequestedSessionIdFromURL()

    서비스를 요청한 클라이언트의 HttpSession의 ID가 URL 에 포함되면 true 아니면 flase 

     Cookie[] getCookies()

    서비스를 요청받은 서버가 서비스를 요청한 클라이언트에게 이전에 보낸 모든 쿠키를 추출한다. 

     String getRequestURI()

    클라이언트가 서비스 요청시 보낸 URL 에서 URI부분만 반환한다. 

     String getQueryString()

    클라이언트가 GET 방식으로 서버에 보낸 질의 문자열들을 모두 추출하여 반환한다. 

     String getMethod()

    클라이언트가 서비스를  요청할때 요청한 방식의 이름을 반환한다.

     String getPathTranslated()

    클라이언트가 서비스 요청시 보낸 URL의 경로정보를 절대경로(path) 로 변경하여 반환한다.

     

     

    네트워크 정보

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @WebServlet("/netInfo")
    public class NetInfoServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            
            out.print("<html>");
            out.print("<head><title>Request정보 출력 Servlet</title></head>");
            out.print("<body>");
            out.print("<h3>네트워크 관련 요청 정보</h3>");
            out.print("Request Schema : "+request.getScheme()+"<br/>");
            out.print("Server Name : "+request.getServerName()+"<br/>");
            out.print("Server Address : "+request.getLocalAddr()+"<br/>");
            out.print("Server Port : "+request.getServerPort()+"<br/>");
            out.print("Client Address : "+request.getRemoteAddr()+"<br/>");
            out.print("Client Host : "+request.getRemoteHost()+"<br/>");
            out.print("Client Port : "+request.getRemotePort()+"<br/>");
            
            out.print("</body>");
        
            out.print("</html>");
        }
     
     
    }
    cs

    URL 정보

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @WebServlet("/urlInfo")
    public class URLInfo extends HttpServlet {
        private static final long serialVersionUID = 1L;
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            
            out.print("<html>");
            out.print("<head><title>Request정보 출력 Servlet</title></head>");
            out.print("<body>");
            out.print("<h3>요청방식과 프로토콜 정보</h3>");
            out.print("Request URI : "+request.getRequestURI()+"<br/>");
            out.print("Request URL : "+request.getRequestURL()+"<br/>");
            out.print("Context Path : "+request.getContextPath()+"<br/>");
            out.print("Request Protocol : "+request.getProtocol()+"<br/>");
            out.print("Servlet Path : "+request.getServletPath()+"<br/>");
            
            out.print("</body>");
        
            out.print("</html>");
        }
     
    }
    cs

    header정보

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @WebServlet("/headerInfo")
    public class HeaderInfoServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            
            out.print("<html>");
            out.print("<head><title>Request정보 출력 Servlet</title></head>");
            out.print("<body>");
            out.print("<h3>요청 헤더 정보</h3>");
            Enumeration<String> em = request.getHeaderNames();
            while(em.hasMoreElements()) {
                String s = em.nextElement();
                out.println(s +" : "+request.getHeader(s)+"<br/>");
            }
            out.print("</body>");
        
            out.print("</html>");
        }
     
     
    }
    cs


    추가정보 

    HttpServletRequest 인터페이스에서 제공하는 메소드 중에서 질의(Query) 문자열이나 추가 경로 정보를 추출하는 메소드들을 실행 한 후  결과값을 확인하는 예제를 작성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    //@WebServlet("/addInfo")
    public class AdditionalInfoServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            
            out.print("<html>");
            out.print("<head><title>Request정보 출력 Servlet</title></head>");
            out.print("<body>");
            out.print("<h3>추가적인 요청정보</h3>");
            out.print("Request Method : "+request.getMethod()+"<br/>");
            out.print("Path Info : "+request.getPathInfo()+"<br/>");
            out.print("Path Translated : "+request.getPathTranslated()+"<br/>");
            out.print("Query String : "+request.getQueryString()+"<br/>");
            out.print("Content Length : "+request.getContentLength()+"<br/>");
            out.print("Content Type : "+request.getContentType()+"<br/>");
            
            out.print("</body>");
        
            out.print("</html>");
        
        }
     
    }
    cs

    web.xml에 url패턴을 /addInfo/* 로지정하면


    추가적인 요청정보

    Request Method : GET
    Path Info : /a
    Path Translated : C:\Spring\workspace2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\edu\a
    Query String : null
    Content Length : -1
    Content Type : null


    PathInfo와 Path Translated가 나온다 .


    http://localhost:8080/edu/addInfo/a?name=army

    식으로 입력하면

    쿼리 스트링이 표시된다.


    content Length와 Content Type이 null인 이유는

    get방식에 헤더 에 정보가 들어가있기때문에

    몸통에서는 아무것도 없기 때문이다.

    'Servlet' 카테고리의 다른 글

    질의 문자열(Query String)  (0) 2019.02.21
    서블릿 디렉터리를 WEB-INF/classes 로지정하는 이유  (0) 2019.02.21
    서블릿 구현및 실행  (0) 2019.02.20
    개발환경 구축  (0) 2019.02.20
    HTTP 프로토콜의 이해  (0) 2019.02.20
Designed by Tistory.