보통 서블릿 컨테이너에 서블릿을 올려놓기 위해서는
서블릿코드(.java)를 빌드하여 .class파일로 만든다음 톰갯서버의 폴더 어딘가에 넣어 놓아야 한다. 즉 톰캣을 설치해야 한다.
톰캣이 서블릿컨테이너를 제공해주기 때문이다.
하지만 스프링 부트는 톰캣 서버를 내장하고 있기 때문에 따로 톰캣을 설치하지 않기로 한다.
JSP 이전에 동적인 웹 페이지 콘텐츠를 생성하는 기술
자바의 많은 장점 사용
@ServletComponentScan
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 ServletComponentScan을 지원->main함수에
@ServletComponentScan
@SpringBootAplication
public class ServletApplication {
public static void main(String[] args){
...
}
}
@Werservlet(name="서블릿 이름", urlPatterns="이 서블릿의 url")
HttpServlet : 서블릿을 만들기 위해 반드시 상속해야 하는 클래스
HttpServletReqeust : 클라이언트가 데이터 입력 혹은 클라이언트의 정보에 대한 요청값을 가진 클래스
HttpServletResponse : 클라이트가 요청한 정보를 처리 -> 다시 응답하기 위한 정보
import java.servlet.http.HttpServlet;
...
@WebServlet(name="helloServlet",urlPatterns="/hello")
public class HelloServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response){
...
}
}
Http 요청 메시지를 개발자가 직접 파싱-> 불편
서블릿이 개발자가 Http 요청 메시지를 편리하게 사용할 수 있도록 파싱
그 결과를 HttpServletRequest 객체(보통 request라고 선언)에 담아서 제공
위와 같은 Http 요청 메시지를 파싱해서 개발자가 편리하게 꺼내서 쓸 수 있도록 도와준다.
(개발자가 서블릿이 HTTP요청 메시지를 파싱한 것을 가져다가 사용할 수 있는 방법)
즉 클라이언트가 서버에 데이터를 전달할 때 HTTP 요청 메시지에 데이터를 넣어서 전달한다. 그 때 어떤 방식으로 HTTP에 넣을 것인가?
그 방법은 총 3가지 GET, POST, HTTP message body
URL의 쿼리 파라미터를 사용해서 데이터 전달
? 뒤에 있는 것들이 쿼리 파라미터
http://localhose:8080/request-param?username=kim&age=26
또한 content-type은 없다
왜냐하면 content-type이라는 것은 HTTP 메시지 바디의 데이터 형식을 지정하는 것인데 GET 요청의 경우 메시지 바디가 존재하지 않으므로 없다!
이렇게 얻어온 데이터를 조회할 때
URL이 아닌 HTTP body에 데이터를 넣어 전달
따라서 보안상 중요한 것들은 body에 담아 전달한다.
URL을 통해서 노출되지 않는다.
content-type은 application/x-www-form-urlencoded이다.
content-type이 HTTP body의 형식을 지정하는 값인데
application/x-www-form-urlencoded은 body의 값을 html의 form을 통해서 얻겠다는 의미이다.
HTTP message body에 데이터를 직접 담아 요청
HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
InputStream은 바이트기반 스트림이기 때문에 2byte인 문자배열인 String으로 바꿔줘야 한다.
ObjectMapper 클래스
Java개체 -> JSON 직렬화 writeValue
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("yellow", "renault");
objectMapper.writeValue(new File("target/car.json"), car);
JSON -> Java 역직렬화 readValue
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Car car = objectMapper.readValue(json, Car.class);
Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);
Car car =
objectMapper.readValue(new URL("file:src/test/resources/json_car.json"), Car.class);
Cookie cookie = new Cookie("mycookie","good");
cookie.setMaxAge(600);
response.addCookie(cookie);
단순 텍스트
writer.println("ok");
HTML
import javax.servlet.http.HttpServlet
…
@WebServlet(name=“responseHtmlServlet”, urlPatterns=“/response-html”)
Public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");