프로그램 : 명령어들의 모음집 Main 메소드
물리적인 프로그램을 제공하는 것이 아닌, 서버를 통해서 프로그램을 전송하는 방식
클라이언트(브라우저)가 서버에 요청(request)를 하게 되면, 서버는 응답(response)하게 된다.
서버가 데이터를 제공하게 되는 경우, 클라이언트가 직접 화면을 만들게 된다. (Ajax 통신)

Servlet 등록 방법
1. web.xml 에 등록
<servlet>
<servlet-name>MyServlet4</servlet-name>
<servlet-class>com.ssafy.myservlet.MyServlet4</servlet-class>
</servlet>
<!-- servlet을 찾아가는 방법 설정하는 방식 -->
<servlet-mapping>
<servlet-name>MyServlet4</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
@WebServlet("/servlet5")
public class MyServlet5 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;characterset=UTF-8");
PrintWriter writer = response.getWriter();
//Java 15 버전에 나온 Block String
writer.write("""
<html>
<head><title>Hello! SSAFY!</title></head>
<body>
<h1>Hello! Servlet5!</h1>
</body>
</html>
""");
// 하나의 서블릿은 여러 경로를 가질 수 있지만, 하나의 경로는 하나의 서블릿만 가져야 한다.
}
}

@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
private static final long serialVersionUID = 1L;
int initCount = 1;
int doGetCount = 1;
int destroyCount = 1;
public LifeCycle() {
System.out.println("생성자 호출!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메서드 호출" + (initCount++));
}
public void destroy() {
System.out.println("destroy 메서드 호출 " + (destroyCount++));
System.out.println("끝");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doGet 메서드 호출" + (doGetCount++));
// 객체를 새로 생성하는 것이 아니라,
// 계속해서 메서드를 호출하는 것이다.
}
}

