서블릿

강한친구·2022년 4월 19일
0

스프링 부트에서 서블릿 사용

서블릿은 직접 WAS를 설치하고 그 위에 올려도 되지만 이는 불편하다. 따라서 SpringBoot를 통해 편하게 서블릿을 실행할 수 있다.

@ServletComponentScan은 서블릿 자동 등록 기능이다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);
    }
}

서블릿은 @WebServlet 어노테이션을 달고 나온다. 그 안에 서블릿 이름을 지정해 줄 수 있고, 어떤 url에서 작동하는지 지정해줄 수 있다.

Request는 상대의 요청이고, reponse는 내가 보낼 응답이다.
서블릿을 사용하면 query문 요청을 받아보거나, 응답을 보낼 수 있다.

index.html

main루트 안에 webapp디렉토리를 만들고 그 안에 index.html을 생성하면 localhost:8080이 자동으로 Index으로 연결된다.

경고

이렇게 하나만 있으면 되는데,

Servlet/servlet 이렇게 이중으로 들어가니깐 안된다...

HttpServletRequest

HTTP 요청 메시지를 편리하게 조회하게 해주는 기능이다.

  • START LINE
    • HTTP 메소드
    • URL
    • 쿼리 스트링
    • 스키마, 프로토콜
  • 헤더
    • 헤더 조회
  • 바디
    • form 파라미터 형식 조회
    • message body 데이터(json형식) 직접 조회

그 밖에도 임시저장소 기능이 있다.
저장: request.setAttribute(name, value)
조회: request.getAttribute(name)

이 밖에도 세션관리 기능이 있다.
request.getSession(create: true)

HTTP 요청 데이터 - 개요

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 주로 다음 3가지 방법을 사용한다.

GET - 쿼리 파라미터

/url?username=hello&age=20
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 검색, 필터, 페이징등에서 많이 사용하는 방식이다.

쿼리 파라미터는 URL에 다음과 같이 ? 를 시작으로 보낼 수 있다. 추가 파라미터는 & 로 구분하면 된다.

http://localhost:8080/request-param?username=hello&age=20

파라미터 조회에는 크게 3개가 있다.
1. 전체 파라미터 조회
2. 단일 파라미터 조회
3. 복수 파라미터 조회

POST - HTML Form

content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파리미터 형식으로 전달한다 username=hello&age=20
주로 회원 가입, 상품 주문, HTML Form 사용

사용할 Form의 액션과 메소드는 다음과 같다.

<form action="/request-param" method="post">

즉 우리가 위에서 만든 servlet으로 post방식을 통해 넘겨주는것이다.

이렇게 보내면 request-param으로 post 방식으로 넘어가는것을 알 수 있다.

POSTMAN 활용
Form을 테스트마다 만들기는 귀찮으니, 포스트을 쓰면 편하게 사용할 수 있다.

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

HTTP API에서 주로 사용, JSON, XML, TEXT
데이터 형식은 주로 JSON 사용
POST, PUT, PATCH사용 가능

이렇게 넣은 message body가 그대로 출력된다.
하지만 최근에는 json으로 통신한다.


    private final ObjectMapper objectMapper = new ObjectMapper();

jackson 라이브러리를 사용하면 json 내부 내용들을 객체로 변환할 수 있다.

HttpServletResponse

HTTP 응답 메시지 생성

  • HTTP 응답코드 지정
  • 헤더 생성
  • 바디 생성

기본사용법

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setStatus(HttpServletResponse.SC_OK); 
        response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header","hello");

이렇게 넣으면 html 헤더를 잘 생성해서 보내주는것을 알 수 있다.

이 밖에도

Content, Cookie, Redirect관련 편의 메서드들이 있다.

< redirect > 예시

HTMLResponse

HTTP응답으로 HTML반환할 때는 content-type를 text/html로 지정해야한다

@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Content-Type: text/html;charset=utf-8
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        PrintWriter writer = response.getWriter();

JsonResponse

HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정해야 한다.

Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString() 를 사용하면 객체를 JSON 문자로 변경 가능하다.

JSON의 경우 기본적으로 charset utf8이라 따로 써줄 필요가 없다.

0개의 댓글

관련 채용 정보