@ServletComponentScan
-> 내 패키지를 포함해서 하위 패키지의 서블릿을 다 찾아서 자동으로 서블릿 등록 후 실행할 수 있게 해줌
@WebServlet
: 서블릿 어노테이션
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
- 스프링 부트를 키면 내장 톰캣 서버를 띄어줌
- 톰캣 서버는 내부에 서블릿 컨테이너 기능을 통해서 서블릿을 생성함
- http 요청 메세지를 날림
- http 요청 메시지를 기반으로 request, response 객체를 생성해서 싱글톤 서블릿을 호출
- 싱글톤 서블릿의 서비스 메소드를 호출하면서 request, response 를 넘겨줌
- Request 객체에서 Http 요청 정보 꺼내고
- Response 객체에서 Http 응답 정보를 저장해서 클라이언트에 반환을 해줌
HttpServletRequest
HttpServletRequest 의 임시 저장소 기능
request.setAttribute(name, value)
// 키, 값으로 저장request.getAttribute(name)
// 키로 갖고오기request.getSession(create: true)
✅ HTTP 요청 데이터
쿼리 파라미터
@WebServlet(name="requestParamServlet",urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> parameterNames = request.getParameterNames(); // 모든 요청 파라미터들을 꺼낼 수 있음
request.getParameterNames().asIterator() // 모든 요청 파라미터들을 꺼낼 수 있음
.forEachRemaining(paraName -> System.out.println(paraName + "=" + request.getParameter(paraName)));
String username = request.getParameter("username"); // 단일 파라미터 조회
String age = request.getParameter("age"); // 단일 파라미터 조회
String[] usernames = request.getParameterValues(("username")); // 동일한 이름의 여러개 파라미터 조회
for(String name : usernames){
System.out.println(name);
}
response.setContentType("text/plain"); // 컨텐츠 타입 지정(브라우저가 문서의 형식을 자의적으로 해석)
response.setCharacterEncoding("utf-8"); // 문자세트의 인코딩 정보 (한글이 깨지기 때문에)
// 위 두개는 컨텐트 타입 헤더 정보에 들어감
response.getWriter().write("ok");
// getWriter은 컨텐트 타입 메시지 정보에 데이터가 들어감
}
}
<form action="/request-param" method="post">
username: <input type="text" name="username"/>
age: <input type="text" name="age"/>
<button type="submit">전송</button>
</form>
💡 클라이언트(웹 브라우저) 입장에서는 GET
, POST
방식이 각각 차이가 있지만
서버 입장에서는 둘의 형식이 동일함
-> request.getParameter()
로 GET의 URL 쿼리 파라미터
, POST의 HTML Form 방식
둘 다 조회 가능
HttpServletResponse
@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);
// response-headers
response.setHeader("Content-Type","text/plain;charset-utf-8");
// = response.setContentType("text/plain");
// = response.setCharacterEncoding("utf-8");
response.setHeader("Cache-Control","no-cache, no-store, must-revalidate"); // 캐시없애는 명령어
response.setHeader("Pragma","no-cache"); // 캐시없애는 명령어
response.setHeader("my-header","hello");
PrintWriter writer = response.getWriter();
writer.print("안녕");
}
}
✅ HTTP 응답 데이터
@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
// 서블릿에서 html을 렌더링하는 방법 (직접 작성), content-type을 'text/html'로 지정해야함
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<div>hi</div>"); // 태그 붙은것들은 HTML 응답
writer.print("안녕"); // 단순 텍스트 응답
writer.println("</body>");
writer.println("</html>");
}
}
@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.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
String result = objectMapper.writeValueAsString(helloData); // 자바객체를 JSON 형식으로 변환
response.getWriter().write(result);
}
}