-
서블릿(Servlet)의 라이프싸이클(LifeCycle)Let's Code/Server 2019. 8. 30. 00:39
버전에 따른 Servlet 작성 방법
1. Servlet 3.0 spec 이상에서 사용하는 방법
- web.xml 파일을 사용하지 않습니다.
- 자바 어노테이션(annotation)을 사용합니다.
- 실제 servlet tag 안에서 Servlet-name을 매치시키는 작업
- 서블릿을 생성할 때 URL mapping을 통해 조절 가능
2. Servlet 3.0 spec미만에서 사용하는 방법
- servlet을 등록할 때 web.xml 파일에 등록합니다. Java annotation이 하는 일을 얘가 대신 함 (실행시킬 서블릿을 확인)
서블릿의 Life Cycle
@WebServlet("/LifecycleServlet") public class LifecycleServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LifecycleServlet() { System.out.println("LifecycleServlet 생성!!"); } public void init(ServletConfig config) throws ServletException { System.out.println("init test 호출!!"); } public void destroy() { System.out.println("destroy 호출!!"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("service호출!!"); } }
콘솔에 출력된 것을 토대로 확인해보면:
1. WAS가 서블릿의 요청을 받으면 해당 서블릿이 메모리에 있는지 확인
2. 최초로 서버에서 돌렸을 때 LifecycleServlet 메모리에 올리기 (객체 생성)
3. 콘솔에 init 메소드와 service 메소드 출력
4. 두번째부터는 service 메소드만 출력됨
5. 서블릿에 수정이 가해진 후에는 (메소드 중 하나의 출력문이라던가) destroy 메소드 호출 (기존 서블릿 삭제)
6. 다시 새로고침하면 LifecycleServlet 생성, init과 service 출력
service 메소드는 이미 HTTPServlet에 내장되어 있는 상태. 클라이언트의 요청이 Get일 경우 doGet 호출, Post일 경우 doPost 호출.
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>form</title></head>"); out.println("<body>"); out.println("<form method='post' action='/firstweb/LifecycleServlet'>"); out.println("name : <input type='text' name='name'><br>"); out.println("<input type='submit' value='ok'><br>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String name = request.getParameter("name"); out.println("<h1> hello " + name + "</h1>"); out.close(); }
- 해당 서블릿의 url을 입력하거나 링크를 클릭하면 자동으로 GET 요청, 저 doGet 메소드가 호출됨.
- 'name'이라는 이름의 파라미터가 생성, 타입은 텍스트.
- 타입 'submit'이면 네모난 버튼이 만들어지나보다. 그 안에 있는 텍스트는 value로 지정 가능.
- 액션을 취하면 (submit을 누르면) POST 요청이 된다. 그러면 doPost 메소드 호출.
- Hello 다음에 입력된 해당 name을 출력한다. 이 때 사용자의 입력에 따라 변화하기 때문에 동적인 페이지.
- @Override는 처음에 보고 직관적으로 이 다음에 오는 코드를 무시하라는 뜻인 줄 알았는데 그 반대의 뜻인 모양. 앞의 코드를 무시하고 뒤에 오는 얘를 출력하라는 뜻.
'Let's Code > Server' 카테고리의 다른 글
서블릿의 응답과 요청: 헤더값 알아내기 (0) 2019.08.30 Eclipse에서 Tomcat 연동하기 / 서블릿 예제 2 (0) 2019.08.27 웹이 구현되는 과정 (0) 2019.08.25 댓글