서블릿은 직접 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문 요청을 받아보거나, 응답을 보낼 수 있다.
main루트 안에 webapp디렉토리를 만들고 그 안에 index.html을 생성하면 localhost:8080이 자동으로 Index으로 연결된다.
경고
이렇게 하나만 있으면 되는데,
Servlet/servlet 이렇게 이중으로 들어가니깐 안된다...
HTTP 요청 메시지를 편리하게 조회하게 해주는 기능이다.
그 밖에도 임시저장소 기능이 있다.
저장: request.setAttribute(name, value)
조회: request.getAttribute(name)
이 밖에도 세션관리 기능이 있다.
request.getSession(create: true)
HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 주로 다음 3가지 방법을 사용한다.
/url?username=hello&age=20
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 검색, 필터, 페이징등에서 많이 사용하는 방식이다.
쿼리 파라미터는 URL에 다음과 같이 ? 를 시작으로 보낼 수 있다. 추가 파라미터는 & 로 구분하면 된다.
http://localhost:8080/request-param?username=hello&age=20
파라미터 조회에는 크게 3개가 있다.
1. 전체 파라미터 조회
2. 단일 파라미터 조회
3. 복수 파라미터 조회
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 API에서 주로 사용, JSON, XML, TEXT
데이터 형식은 주로 JSON 사용
POST, PUT, PATCH사용 가능
이렇게 넣은 message body가 그대로 출력된다.
하지만 최근에는 json으로 통신한다.
private final ObjectMapper objectMapper = new ObjectMapper();
jackson 라이브러리를 사용하면 json 내부 내용들을 객체로 변환할 수 있다.
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 > 예시
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();
HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정해야 한다.
Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString() 를 사용하면 객체를 JSON 문자로 변경 가능하다.
JSON의 경우 기본적으로 charset utf8이라 따로 써줄 필요가 없다.