Servlet(서블릿)
자바 웹 애플리케이션
- 자바 웹 애플리케이션은 WAS에 설치(deploy)되어 동작한다.
- 자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함 된다.
Servlet이란?
- 자바 서블릿은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 러한 사양을 말한다. 흔히 “서블릿”이라고 불린다.
- 서블릿은 JSP와 비슷하다. JSP가 HTML 문서 안에 java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.
- 서블릿은 WAS에 의해 동작하는 JAVA 클래스다.
- 서블릿은 HttpServlet 클래스를 상속 받아야한다.
- 현재는 웹을 개발할때 서블릿을 직접 사용하지 않는다. 보통 다양한 프레임워크를 사용해서 개발한다.
- 프레임워크는 서블릿 없이는 동작할 수 없기 때문에 서블릿의 기본적인 작성법과 라이플 사이클을 이해하면 웹 동작을 이해하는데 도움이 된다.
Servlet 생명주기
- WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
- 메모리에 없으면, 해당 서블릿 객체를 만들어서 메모리에 올린후
init()
메소드를 실행한다. 그리고service()
메소드를 실행한다. - 메모리에 있으면, 메모리에 있는 서블릿 객체를 통해
service()
메소드를 실행한다.
if (메모리에 없음) {
- 해당 서블릿 클래스를 메모리에 올림
- init() 메소드를 실행
}
- service()메소드를 실행
- WAS가 종료되거나 웹 애플리케이션이 새롭게 갱신되면
destroy()
메소드가 실행된다.
서블릿 객체의 service() 메서드
- HttpServlet의 service 메서드는 템플릿 메서드 패턴으로 구현된다.
- 클라이언트의 요청이 GET 이라면, doGet(request, response)메소드를 호출한다.
- 클라이언트의 요청이 POST 라면, doPost(request, response)를 호출한다.
- PUT, DELETE 요청에 대해서도 대응하는 메서드를 호출한다.
톰캣(Tomcat)과 서블릿
- 톰캣은 WAS다. WAS의 서블릿 컨테이너는 프로그래머가 구현한 서블릿을 관리한다.
- 서블릿 컨테이너는 클라이언트가 어떤 요청을 했을 때, 어떤 서블릿을 실행할 것인지 제어한다.
- 서블릿 컨테이너는 어떤 정보를 바탕으로 어떤 서블릿을 적절히 실행시킬지 알고 있을까?
- 이에 2가지 방법이 있다.
- web.xml라는 파일에 서블릿을 등록해준다.
- Servlet 3.0 spec부터는 web.xml 파일을 사용하지 않고 자바 어노테이션(@WebServlet)을 사용하면 된다.
서블릿 예제
import java.io.PrintWriter;
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;
public TenServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1> 1에서 10까지 출력 </h1>");
for (int i = 0; i < 10; i++) {
out.println(i + "<br>");
}
out.close();
}
}
- 위 코드는 아래 웹 페이지를 동적으로 생성하는 서블릿 클래스다.
- /ten으로 요청을 하면, 서블릿 컨테이너는
TenServlet
객체를 메모리에 올리고 서비스 메서드를 호출한다.get
요청이므로 위에 작성된doGet
메서드가 호출되고 아래와 같은 결과를 확인할 수 있다.
Request, Response 객체이해하기
- 클라이언트로부터 요청이 들어오면 WAS는
HttpServletRequest
라는 객체와HttpServletResponse
라는 객체를 생성한다. - 이 두 객체는 요청 정보에 있는 path로 매핑된 서블릿에게 전달된다. (service 메서드 즉, doGet, doPost 등의 메서드의 인자로 전달된다.)
HttpServletRequest
-
HttpServletRequest 객체에는 클라이언트가 요청하면서 보낸 정보들을 담는다.
- http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
- 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다.
- Body의 Stream을 읽어 들이는 메소드를 가지고 있다.
HttpServletResponse
-
HttpServletResponse 객체에는 클라이언트에게 전송하기 위한 정보들을 담는다.
- WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse객체를 생성하여 서블릿에게 전달한다.
- 서블릿은 해당 객체를 이용하여 클라이언트에게 content type, 응답코드, 응답 메시지등을 전송한다.
HttpServletRequest 객체에서 헤더정보 가져와보기
@WebServlet(name = "HeaderServlet", value = "/HeaderServlet")
public class HeaderServlet extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
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>");
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
out.println(headerName + " : " + headerValue + " <br> ");
}
out.println("</body>");
out.println("</html>");
}
}
결과
참고
- https://www.boostcourse.org/web316/lecture/254273/?isDesc=false