@ServletComponentScan
@SpringBootApplication
public class ServletApplication{
public static void main(String[] args){
SpringApplication.run(ServletApplication.class, args);
}
}
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다.
package hello.servlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@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);
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
}
}
@WebServlet(name = " ", urlPatterns = " ") 서블릿 애노테이션
- name: 서블릿 이름
- urlPattern: URL 매핑
HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행한다.
protected void service(HttpServletRequest request, HttpServletResponse response)
HttpServletRequest
역할
서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신 HTTP 요청 메시지를 파싱한다. 그 결과를 HttpServletRequest 객체에 담아서 제공한다. 이를 통해 HTTP 요청 메시지를 편리하게 조회할 수 있다.
임시 저장소 기능
해당 HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
- 저장: request.setAttribute(name, value)
- 조회: request.getAttribute(name)
세션 관리 기능
request.getSession(create: true)
HTTP 요청 데이터 (클라이언트 -> 서버로 데이터 전달 방법)
1. GET - 쿼리 파라미터
2. POST - HTML Form
3. HTTP message body에 데이터를 직접 담아서 요청
GET - 쿼리 파라미터
- 메시지 바디 없이, URL의 쿼리 파라미터를 사용하여 데이터를 전달한다. ex) 검색, 필터, 페이징에서 많이 사용하는 방식
- 전달 데이터: username = hello / age = 20일 경우
☞ http://localhost:8080/request-param?username=hello&age=20
쿼리 파라미터는 URL에 다음과 같이 ?를 시작으로 보낼 수 있다.추가 파라미터는 &로 구분하면 된다.
POST - HTML Form
- 메시지 바디에 쿼리 파라미터 형식을 데이터를 전달한다. ex) 회원 가입, 상품 주문 등에서 사용하는 방식
- 전달 데이터: username = hello / age = 20일 경우
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" /> <button type="submit">전송</button>
</form>
</body>
</html>
이후 Postman을 사용하여 테스트 진행
HTTP message body에 데이터를 직접 담아서 요청
단순 텍스트
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
<Postman 결과>
content-type: text/plain
message body: hello
결과: messageBody = hello
JSON
<Postman 결과>
content-type: application/json
message body: {"username": "hello", "age": 20}
결과: messageBody = {"username": "hello", "age": 20}
HttpServletResponse
역할
- HTTP 응답 메시지 생성
- HTTP 응답코드 지정
- 헤더 생성
- 바디 생성
- 편의 기능 제공
- Content-Type, 쿠키, Redirect
편의 메서드
//[status-line]
response.setStatus(HttpServletResponse.SC_OK); //200
//[response-headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello");
//[Header 편의 메서드]
content(response);
cookie(response);
redirect(response);
//[message body]
PrintWriter writer = response.getWriter();
writer.println("ok");
//[Content 편의 메서드]
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
//[Cookie 편의 메서드]
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
//[redirect 편의 메서드]
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
HTTP 응답 데이터
1. 단순 텍스트 응답
2. HTML 응답
3. HTTP API - MessageBody JSON 응답
단순 텍스트 응답
write.println("ok");
HTML 응답
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//Content-Type: text/html;charset=utf-8
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
}
}
HTTP 응답을 HTML을 반환할 때는 content-type을 text/html로 지정해야 한다.
API - JSON
package hello.servlet.basic.response;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* http://localhost:8080/response-json
*
*/
@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type: application/json
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);
//{"username":"kim","age":20}
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
}
}
HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json으로 지정해야 한다.
'Spring Study > MVC 패턴' 카테고리의 다른 글
[MVC 패턴] 타임리프 (Thymeleaf) (0) | 2023.08.16 |
---|---|
[MVC 패턴] MVC 기본 기능 (0) | 2023.08.15 |
[MVC 패턴] MVC 구조 (0) | 2023.08.14 |
[MVC 패턴] MVC 프레임워크 만들기 (0) | 2023.08.12 |
[MVC 패턴] JSP / MVC 패턴 (0) | 2023.08.09 |
댓글