스프링 부트 스타터 사이트에서 다음과 같은 옵션으로 스프링 프로젝트를 생성합니다.
https://start.spring.io
스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @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 {
함수내용
}
@WebServlet 서블릿 애노테이션
- name: 서블릿 이름
- urlPatterns: URL 매핑
HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service 메서드를 실행한다.
HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편할 것이다. 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.
request.getMethod()
request.getProtocol()
request.getScheme()
request.getRequestURL()
request.getRequestURI()
request.getQueryString()
request.isSecure()
request.getMethod() = GET
request.getProtocal() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = username=hello
request.isSecure() = false
request.getHeaderNames().asIterator()
.forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
host: localhost:8080
connection: keep-alive
cache-control: max-age=0
sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X
이하 생략
전달 데이터
URL
http://localhost:8080/request-param?username=hello&username=kim&age=20
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("request.getParameter(username) = " + username);
System.out.println("request.getParameter(age) = " + age);
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username=" + name);
}
request.getParameter(username) = hello
request.getParameter(age) = 20
username=hello
username=kim
POST도 GET과 같이 getParameter함수를 통해 조회 가능
ServletInputStream inputStream = request.getInputStream();
String messageBody =
StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8)
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
private ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
System.out.println("messageBody = " + messageBody);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
messageBody={"username": "hello", "age": 20}
data.username=hello
data.age=20
response.setStatus(HttpServletResponse.SC_OK); //200
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");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600);
response.addCookie(cookie);
response.sendRedirect("/basic/hello-form.html");
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>");
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);