스프링 MVC(2)
서블릿
- 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getMethod();
request.getProtocol();
request.getRequestURL();
request.isSecure();
request.getHeaderNames();
request.getCookies();
request.getContentType();
}
}
- @WebServlet : 서블릿 애노테이션 (name : 서블릿 이름, urlPatterns : URL 매핑)
- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행
- HTTPServletRequest는 HTTP 요청 메시지를 개발자 대신 파싱 후 그 결과를 HttpServletRequest 객체에 담아 제공
서블릿을 이용한 - HTTP 요청 데이터
- GET 쿼리 파리미터
- ?/url?username=hello&age=20
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- ex) 검색, 필터, 페이징등에서 많이 사용하는 방식
//단일 request.getParameter(name); //복수 ex) username=hello&username=chang request.getParameterValues(); reqeust.getParameterNames();
- POST : HTML FORM
- content-type: application/x-www.form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
- ex) 회원 가입, 상품 주문, HTML Form 사용
- GET방식과 같이 request객체를 이용하여 데이터를 가져옴
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
private ObjectMapper objectMapper = new ObjectMapper(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletInputStream inputStream = request.getInputStream(); String messagebody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); System.out.println("messagebody = " + messagebody); HelloData helloData = objectMapper.readValue(messagebody, HelloData.class); System.out.println("helloData.getUsername() = " + helloData.getUsername()); System.out.println("helloData.getUsername() = " + helloData.getAge()); }
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용(POST, PUT, PATCH)
서블릿을 이용한 - HTTP 응답
- HTTP 응답 메시지 생성
- HTTP 응답 코드 지정
- 헤더 생성
- 바디 생성
- 편의 기능 제공
- Content-Type
- 쿠키
- Redirect
@WebServlet(name="responseHeaderServlet",urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//[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");
cookie(response);
redirect(response);
//[message-body]
PrintWriter writer = response.getWriter();
writer.println("ok ");
}
private void cookie(HttpServletResponse response){
Cookie cookie = new Cookie("myCookie","good");
cookie.setMaxAge(600); // 600초
response.addCookie(cookie);
}
private void redirect(HttpServletResponse response) throws IOException {
response.setStatus(HttpServletResponse.SC_FOUND);
response.sendRedirect("/basic/hello-form.html");
}
}
- HTTP 응답 데이터 - 단순 텍스트
PrintWriter writer = response.getWriter(); writer.println("ok ");
- HTTP 응답 데이터 - HTML
@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(); writer.println("<html>"); writer.println("<body>"); writer.println("<div>안녕</div>"); writer.println("</body>"); writer.println("</html>"); }
- HTTP 응답 데이터 - JSON
private ObjectMapper objectMapper = new ObjectMapper(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Content-Type: application/json response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); HelloData helloData = new HelloData(); helloData.setUsername("changmin"); helloData.setAge(25); //{"usernmae":"changmin","age":20} 으로 변환 String result = objectMapper.writeValueAsString(helloData); response.getWriter().write(result); }
출처 - 김영한의 스프링 MVC 1편
Leave a comment