서블릿

byeol·2022년 12월 12일
0

스프링 웹 MVC 1

목록 보기
2/6

보통 서블릿 컨테이너에 서블릿을 올려놓기 위해서는
서블릿코드(.java)를 빌드하여 .class파일로 만든다음 톰갯서버의 폴더 어딘가에 넣어 놓아야 한다. 즉 톰캣을 설치해야 한다.
톰캣이 서블릿컨테이너를 제공해주기 때문이다.
하지만 스프링 부트는 톰캣 서버를 내장하고 있기 때문에 따로 톰캣을 설치하지 않기로 한다.

서블릿 등록

JSP 이전에 동적인 웹 페이지 콘텐츠를 생성하는 기술
자바의 많은 장점 사용

  • @ServletComponentScan
    스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 ServletComponentScan을 지원->main함수에

    @ServletComponentScan
    @SpringBootAplication
    public class ServletApplication {
    
      public static void main(String[] args){
       ...
      }
    }
  • @Werservlet(name="서블릿 이름", urlPatterns="이 서블릿의 url")

  • HttpServlet : 서블릿을 만들기 위해 반드시 상속해야 하는 클래스

    • void service(reuqst, response);를 오버라이딩
  • HttpServletReqeust : 클라이언트가 데이터 입력 혹은 클라이언트의 정보에 대한 요청값을 가진 클래스

  • HttpServletResponse : 클라이트가 요청한 정보를 처리 -> 다시 응답하기 위한 정보

    import java.servlet.http.HttpServlet;
    ...
    
    @WebServlet(name="helloServlet",urlPatterns="/hello")
    public class HelloServlet extends HttpServlet {
    
     @Override
     public void service(HttpServletRequest request, HttpServletResponse response){
     ...
     }
    }

HttpServletRequest -> get어쩌구

Http 요청 메시지를 개발자가 직접 파싱-> 불편
서블릿이 개발자가 Http 요청 메시지를 편리하게 사용할 수 있도록 파싱
그 결과를 HttpServletRequest 객체(보통 request라고 선언)에 담아서 제공


위와 같은 Http 요청 메시지를 파싱해서 개발자가 편리하게 꺼내서 쓸 수 있도록 도와준다.

기본 사용법

(개발자가 서블릿이 HTTP요청 메시지를 파싱한 것을 가져다가 사용할 수 있는 방법)

  • start-line
    request.getMethod();
    request.getProtocol();
    request.getScheme();
    request.getRequestURL();
    request.getQueryString();
    request.isSecure();
  • 헤더 정보
    request.getHeaderNames();
    request.getHeader();
  • Header 편리한 조회
    request.getServerName();
    request.getServerPort();
    request.Locales();
    request.getLocale();
    request.getCookies();
    request.getContentType();
    request.getContentLength();
    request.getCharacterEncoding();

HTTP 요청 데이터

즉 클라이언트가 서버에 데이터를 전달할 때 HTTP 요청 메시지에 데이터를 넣어서 전달한다. 그 때 어떤 방식으로 HTTP에 넣을 것인가?
그 방법은 총 3가지 GET, POST, HTTP message body

GET

URL의 쿼리 파라미터를 사용해서 데이터 전달
? 뒤에 있는 것들이 쿼리 파라미터
http://localhose:8080/request-param?username=kim&age=26
또한 content-type은 없다
왜냐하면 content-type이라는 것은 HTTP 메시지 바디의 데이터 형식을 지정하는 것인데 GET 요청의 경우 메시지 바디가 존재하지 않으므로 없다!

이렇게 얻어온 데이터를 조회할 때

  • request.getParameter
    여러 개인데 단일 값 반환을 사용할 경우 첫번째 값을 반환
  • request.getParameterNames
  • request.getParameterMap
  • request.getParameterValues
    여러개의 값을 가질 경우

POST HTML Form

URL이 아닌 HTTP body에 데이터를 넣어 전달
따라서 보안상 중요한 것들은 body에 담아 전달한다.
URL을 통해서 노출되지 않는다.

content-type은 application/x-www-form-urlencoded이다.
content-type이 HTTP body의 형식을 지정하는 값인데
application/x-www-form-urlencoded은 body의 값을 html의 form을 통해서 얻겠다는 의미이다.

API 메시지 바디- 단순 텍스트

HTTP message body에 데이터를 직접 담아 요청

HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
InputStream은 바이트기반 스트림이기 때문에 2byte인 문자배열인 String으로 바꿔줘야 한다.

API 메시지 바디 - JSON

ObjectMapper 클래스

  • Java개체 -> JSON 직렬화 writeValue

    ObjectMapper objectMapper = new ObjectMapper();
    Car car = new Car("yellow", "renault");
    objectMapper.writeValue(new File("target/car.json"), car);
  • JSON -> Java 역직렬화 readValue

    String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\"  }";
    Car car = objectMapper.readValue(json, Car.class);	
    
    Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);
    
    Car car = 
     objectMapper.readValue(new URL("file:src/test/resources/json_car.json"), Car.class);

HttpServletResponse -> set어쩌구

기본 사용법

  • status line
    response.setStatus(HttpServletResponse.SC_OK);
  • headers
    response.setHeader("Content-Type","text/plain;charset=utf-8");
  • content편의
    response.setContentType("text/plain");
    response.setCharacterEncoding("utf-8");
  • 쿠키 편의
    Cookie cookie = new Cookie("mycookie","good");
    cookie.setMaxAge(600);
    response.addCookie(cookie);
  • redirect 편의
    response.sendRedirect("/basic/hello-form.html");

응답 데이터

단순 텍스트, HTML

  • 단순 텍스트
    writer.println("ok");

  • HTML

    import javax.servlet.http.HttpServlet@WebServlet(name=“responseHtmlServlet”, urlPatterns=/response-html”) 
    Public class ResponseHtmlServlet extends HttpServlet {
    
      @Override
       protected void service(HttpServletRequest request, HttpServletResponse response)    
                     throws ServletException, IOException { 
      
       response.setContentType("text/html");
       response.setCharacterEncoding("utf-8");
    
       PrintWriter writer = response.getWriter();
       writer.println("<html>");
       writer.println("<body>");
        

API JSON

profile
꾸준하게 Ready, Set, Go!

0개의 댓글