필기
cookie
이것도 프로토콜이므로 앱에서는 X 내가 설정해줘야됨
서버가 클라이언트 측에 데이터 저장하도록 할 수 있게 함
get : 뭔가를 찾아줘
주소에 붙이는 데이터 = db sql문의 where에 걸린다.
queryString = 구체적 질의를 하기 위해서 필요
client가 준 정보 req로 접근하면 알 수 있음
x-www ~ : 파싱 내가 먼저 key=value형태로 해줄게
key=value형태는 req.getParameter()로 전부 pasing 가능
jsp = 템플릿 엔진 자바코드를 섞어서 쓸 수있다 <% %> 안에 자바코드
아파치가 이해못하는 파일 톰캣에게
home.jsp를 서블릿 파일(homeservlet.java)로 변경
home.jsp로 요청이 오면 톰캣이 내부적으로 HomeServlet.java를 만듦(눈에는 안보이지만)
<%=name%>에서 =는 출력하라는 의미
302(redirection)는 req,resp 두 개 만듦
dispatcherS가 공통로직 처리하고 jsp 처리
mvc 패턴
req,resp 새로 만드는게 아니라 forward로 전달
단점)hello.do?path=a 말고도 /a.jsp가 됨-> 공통 로직 실행X -> 강제성이 없음 ->webapp이 바깥에 공개되어있어서
=> 회사마다 비공개 처리 방식이 다름 =>Spring이 해결
@restController printWriter로 응답 @controller -> requestDispatcher => spring
0. 프로젝트 생성

1. Servlet?
- 클라이언트가 URL, Body, Header와 함께 요청하면 웹 서버에서 처리 불가능할 경우 Tomcat과 같은 WAS에게 위임하게 된다.
- WAS는 request와 response 객체를 만든다.
- request 객체와 response 객체는 각각 입출력 버퍼에 접근 가능하다 (request - BR / response - BW)
- Servlet에서는 WAS로부터 전달받은 request 객체와 response 객체로 요청받은 request를 분석해서(parsing) 그에 대한 로직을 처리하여 응답을 돌려주게 된다.

2. response로 http 프로토콜 맛보기?@@@제목머라고해ㅐㅐㅐㅐ
1. Servlet 생성
- servlet class를 만든 후 그 클래스가 HttpServlet 클래스를 상속하도록 한다.
- @WebServlet을 지정해준다.
- @WebServlet → 패키지를 스캔해서 @WebServlet을 가지고 있는 클래스를 찾아서 괄호 안의 주소를 스캔한다.
- HttpServlet의 메서드를 override한다 ⇒ doGet, doPost, doPut, doDelete 메서드 생성

2. GET
- @WebServlet 괄호 안의 주소로 GET 요청 시 deGet 메서드가 실행된다.
- HttpServletResponse 객체인 resp는 getWriter()를 통해 응답 버퍼에 접근한다. 이때 getWriter()의 return 타입이 PrintWriter이므로 auto flush가 적용되어 있다.
- response의 body에 <html><body><h1>doGet</h1></body></html> 담는다.
- 이 데이터는 직렬화되어 브라우저로 전달되기 때문에 브라우저에서 html 형태로 역직렬화 할 수 있도록 Content-Type을 header에 담아서 알려줘야 한다.
- 이때 Content-Type과 text/html은 대소문자와 형태를 정확하게 작성해야 한다. (MIME Type)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
// header
resp.setHeader("Content-Type", "text/html");
// 응답 버퍼에 접근하는 함수 getWriter()
PrintWriter out = resp.getWriter(); // auto flush 적용되어 있음.
// body
out.print("<html>");
out.print("<body>");
out.print("<h1>doGet</h1>");
out.print("</body>");
out.println("</html>"); // 마지막에 한번만 \n 담아서 보내줘야 된다. 다 읽으니까
}
- Content-Type가 text/plain일 경우

- Content-Type가 text/html일 경우
3. POST
- @WebServlet 괄호 안의 주소로 POST 요청 시 dePost 메서드가 실행된다.
- 응답의 http 상태 코드를 201로 지정한다.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
resp.setStatus(201); // http 상태코드
}
4. PUT
- @WebServlet 괄호 안의 주소로 PUT 요청 시 doPut 메서드가 실행된다.
- Cookie
- 서버에서 생성해서 클라이언트 측으로 전달되어 저장되는 데이터 (다시 서버 측으로 요청 시 쿠키를 포함하게 된다.)
- resp.setHeader(”Set-Cookie”,”c03=apple;c04=banana”) 방식도 가능하다.
- 웹 http 프로토콜이므로 앱에서는 쿠키를 직접 설정해줘야 한다.
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPut");
Cookie cookie = new Cookie("c03", "apple");
Cookie cookie2 = new Cookie("c04", "banana");
resp.addCookie(cookie);
resp.addCookie(cookie2);
// Set-Cookie : c03=apple;c04=banana
}
5. DELETE
- @WebServlet 괄호 안의 주소로 DELETE 요청 시 doDelete 메서드가 실행된다.
- 클라이언트는 302 http 상태 코드를 서버로부터 응답 받을 경우 Location 헤더에 포함된 URL 주소로 다시 http 요청을 보내고 응답을 받게 된다. (요청-응답-다시 요청-응답으로 WAS에서 resp와 req 객체를 두 개씩 만들게 된다.)
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doDelete");
resp.setStatus(302); // 해당 Location으로 이동해
// 1. header에 redirection될 주소를 써줘야됨(key = Location)
resp.setHeader("Location", "http://www.naver.com");
}
전체 코드
package org.example.demo1;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 어떤 서블릿 선택할지 깃발
// 이 패키지 스캔해서 깃발 찾고 주소를 scan
@WebServlet("*.do")
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
// header
resp.setHeader("Content-Type", "text/html");
// 응답 버퍼에 접근하는 함수 getWriter()
PrintWriter out = resp.getWriter(); // auto flush 적용되어 있음.
// body
out.print("<html>");
out.print("<body>");
out.print("<h1>doGet</h1>");
out.print("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
resp.setStatus(201); // http 상태코드
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPut");
Cookie cookie = new Cookie("c03", "apple");
Cookie cookie2 = new Cookie("c04", "banana");
resp.addCookie(cookie);
resp.addCookie(cookie2);
// Set-Cookie : c03=apple;c04=banana
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doDelete");
resp.setStatus(302); // 해당 Location으로 이동해
// 1. header에 redirection될 주소를 써줘야됨(key = Location)
resp.setHeader("Location", "http://www.naver.com");
}
}
Share article