자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
@ServletComponentScan
: 서블릿을 직접 등록해서 사용가능하도록 지원한다.
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
	public static void main(String[] args) {
		SpringApplication.run(ServletApplication.class, args);
	}
}
서블릿 등록
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 올시 실행된다.
public class HelloServlet extends HttpServlet {
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*@WebServlet 서블릿 애노테이션
		name: 서블릿 이름
		urlPatterns: URL 매핑*/
        String username = request.getParameter("username");
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello " + username);
    }
}
@WebServlet 서블릿 애노테이션HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행
protected void service(...)
서블릿 컨테이너에 내장 톰캣 서버가 등록한 서블릿ex) helloServlet을 생성
Http 요청이 오면 WAS(톰캣)는 Http 요청 메시지를 기반으로 request,response를 생성하고 helloServlet을 실행(service 메소드)
여기서 request의 내용을 확인하거나 response를 작성가능
톰캣 서버가 response 객체 정보로 http 응답을 생성하여 보낸다.
application.properties logging.level.org.apache.coyote.http11=debug // debug 레벨의 로그 확인
Http 요청 메시지를 편리하게 사용 가능하게끔 Http 요청 메시지를 파싱 후, HttpServletRequest 객체에 담아서 제공
해당 Http 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
request.setAttribute(name, value)request.getAttribute(name)세션 관리 기능
request.getSession(create: ture)
request.getMethod() = 메소드
request.getProtocol() = HTTP/1.1, 2.0 3.0
request.getScheme() = http
request.getRequestURL() = url 정보
request.getRequestURI() = uri 정보
request.getQueryString() = 쿼리 파라미터
request.isSecure() = 시큐리티 true/false
// 전체 조회
request.getHeaderNames().asIterator()
 .forEachRemaining(headerName ->
 System.out.println(headerName + ": " + request.getHeader(headerName)));
// Accept-Language 조회
request.getLocales().asIterator()
 .forEachRemaining(locale -> System.out.println("locale = " +
locale));
// 선호도 젤 높은 것 
 request.getLocale(); 
// Host 조회
request.getServerName();
request.getServerOirt();
//Cookie 조회
if (request.getCookies() != null) {
 for (Cookie cookie : request.getCookies()) {
 		System.out.println(cookie.getName() + ": " + cookie.getValue());
 	}
 }
// Content 조회
request.getContentType();
request.getContentLength();
request.getCharacterEncoding();
기타 정보
[Remote 정보]
request.getRemoteHost() 
request.getRemoteAddr() 
request.getRemotePort()
[Local 정보]
request.getLocalName()
request.getLocalAddr()
request.getLocalPort() 
http://localhost:8080/request-param?username=hello&age=20
쿼리 파라미터 ?로 시작
& 추가 파라미터 구분
String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들
모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map
으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회
ServletInputStream inputStream = request.getInputStream();
 String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
// Json 결과를 파싱 및 자바 객체로 변환하는 스프링 MVC 라이브러리 (ObjectMapper) 제공
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);
	HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
}
편의 기능 제공
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, mustrevalidate");
 response.setHeader("Pragma", "no-cache");
 response.setHeader("my-header","hello");
 
 
 // Header 편의 메서드
 
   // Content 편의 메서드
 private void content(HttpServletResponse response) {
 response.setContentType("text/plain");
 response.setCharacterEncoding("utf-8");
}
  // 쿠키 편의 메서드
  private void cookie(HttpServletResponse response) {
 Cookie cookie = new Cookie("myCookie", "good");
 cookie.setMaxAge(600); //600초
 response.addCookie(cookie);
}
  // redirect 편의 메서드
  private void redirect(HttpServletResponse response) throws IOException {
 //Status Code 302  자동 적용
 //Location: /basic/hello-form.html 자동 적용
 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>");
 }
private ObjectMapper objectMapper = new ObjectMapper();
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 
	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);
}
🔖 학습내용 출처