반응형

 

 

버전에 따른 Servlet 작성 방법

 

1. Servlet 3.0 spec 이상에서 사용하는 방법

  • web.xml 파일을 사용하지 않습니다.
  • 자바 어노테이션(annotation)을 사용합니다.
  • 앞에서 실습했던 first web에서 사용합니다.

2. Servlet 3.0 spec미만에서 사용하는 방법

  • servlet을 등록할 때 web.xml 파일에 등록합니다.

 

 

 

 

 

1. Servlet 3.0 spec 이상에서 사용하는 방법

 

- @WebServlet("/ten") 이라는 어노테이션이 추가된다.

- URL mapping은 임의로 지정할 수 있다.

 

package exam;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/ten")
public class TenServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();  // 통로
		out.print("<h1>1-10까지 출력</h1>");
		for(int i=1; i<=10; i++) {
			out.print("<h2>"+i+"</h2>");
		}
		out.close();
		
	}
}

TenServlet.java

 

 

 

 

 

 

 

 

 

2. Servlet 3.0 spec미만에서 사용하는 방법

 

- 서블릿을 추가하면 xml에 서블릿 관련 내용이 삽입된다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>exam25</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>TenServlte</display-name>
    <servlet-name>TenServlte</servlet-name>
    <servlet-class>exam.TenServlte</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TenServlte</servlet-name>
    <url-pattern>/ten</url-pattern>
  </servlet-mapping>
</web-app>

web.xml

 

package exam;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 어노테이션 없음
public class TenServlte extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlte() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();  // 통로
		out.print("<h1>1-10까지 출력</h1>");
		for(int i=1; i<=10; i++) {
			out.print("<h2>"+i+"</h2>");
		}
		out.close();
		
	}

}

TenServlte.java

 

 

 

 

 

 

 

 

 

 

Servlet 생명 주기

 

1. 서블릿의 생명주기를 알기 위해 테스트 코드를 작성한다.

 

package examples;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@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 호출!!");
	}


	public void destroy() {
		System.out.println("destroy 호출!!");
	}

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service 호출!!");
	}

}

 

LifecycleServlet.java

 

 

 

 

2. 결과

 

1) 처음 실행 시,

생성자

init

service

 

2) 새로고침 시,

service

 

3) 기존 코드 변경 시,

destroy

 

4) destroy 후 코드 변경 시,

생성사

init

service

 

 

 

 

 

 

 

 

 

 

 

Servlet 생명주기

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인합니다.
  •  if (메모리에 없음) {
     - 해당 서블릿 클래스를 메모리에 올림
     - init() 메소드를 실행
    }
     - service()메소드를 실행
  • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됩니다.
  • 응답해야 하는 모든 내용은 service() 에 구현해야 한다 !!

 

 

 

 

 

그렇다면, doGet() 에서는 service() 가 없었는데 어떻게 실행이 된 것일까?

doGet()은 HttpServlet 이 가지고 있는 service 메소드를 상속받아서 실행된다.

 

 

 

service(request, response) 메소드

HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현합니다.

  • 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
  • 클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출

 

 

 

😆service() 대신에 doGet()과 doPost()를 넣어 보았다 !

package examples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@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 호출!!");
	}

	// url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 doGet()이 실행된다.
    @Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
    	resp.setContentType("text/html");
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");
		out.println("<form method='post' action='/firstweb/LifecycleServlet'>");	// submit 버튼이 눌렸을 때, action 주소로 요청해주세요 
		out.println("name : <input type='text' name='name'><br>");					// , 메서드는 post이므로 post 메서드를 실행한다.
		out.println("<input type='submit' value='ok'><br>");                                                 
		out.println("</form>");
		out.println("</body>");
		out.println("</html>");
		out.close();
		
	}


	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		resp.setContentType("text/html");
		PrintWriter out = resp.getWriter();
		String name = req.getParameter("name");			// doGet에서 설정한 name 을 받아
		out.println("<h1> hello " + name + "</h1>");    // 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식 
		out.close();
		
	}


}

 

 

 

1) url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 먼저 doGet()이 실행된다.

 

 

 

 

2) out.println("<form method='post' action='/firstweb/LifecycleServlet'>");

-> "submit 버튼이 눌렸을 때, action 주소로 요청해주고, post 메소드를 실행해주세요" 라고 말하고 있다.

 

 

3) String name = req.getParameter("name");

-> doGet에서 설정한 name 을 받아

 

4) out.println("<h1> hello " + name + "</h1>");  

-> 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식 

 

 

 

 

 

 

반응형

+ Recent posts