컨테이너는 web.xml에 정의된 'URL패턴'을 확인하여 어느 서블릿을 통해서 처리해야 할지를 검색한다. (이 때 로딩이 안된 경우에는 로딩한다. 처음 로딩시 init()메서드가 호출된다) (서블릿 3.0이상에서는 애노테이션(@WebServlet)으로 설정이 가능하다)
서블릿 컨테이너는 개별 요청을 처리할 스레드를 생성하여 해당 서블릿 객체의 service()메서드를 호출한다. (이 때 HttpServletRequest객체와 HttpServletResponse객체를 매개변수로 넘겨준다)
service()메서드는 전송방식(GET, POST등)을 체크하여 적절한 메서드를 호출한다 (doGet(), doPost(), doPut(), doDelete() 등)
요청 및 응답 처리가 완료되면 HttpServletRequest객체와 HttpServletResponse객체는 자동으로 소멸된다
Servlet Container에서 서블릿이 제거되는 경우에는 destroy()메서드가 호출
※ web.xml : 서블릿을 작성했다면 해당 서블릿을 사용자가 요청한 경로와 맵핑시켜야 WAS에서 맵핑된 정보를 읽어서 브라우저에서 해당 URL로 HTTP요청 시 해당 서블릿으로 요청을 전달해 줄 수 있다. 소스를 분석할 때도 가장 먼저 확인해봐야 할 부분이다. 톰캣을 예로 들면 웹 어플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server디렉터리의 web.xml에 있다.
MVC패턴
모델 : 자바 클래스 (Service, DAO, VO)
뷰 : JSP, JSTL
컨트롤러 : 서블릿
메서드 ( HttpServlet 상속)
init() 서블릿 로딩 서블릿이 컨테이너에의해 관리되는데 컨테이너에서 읽어다가 메모리에 있는지 확인하고 없다면 객체화를 시켜야하는데 이때 init()메서드가 각종 초기화 작업을 수행
service() 요청 처리 모두 HttpServletRequest와 HttpServletResponse를 매개변수로 전달한다
package kr.or.ddit.basic;
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;
/*
서블릿이란 ==> 컨테이너(서블릿 엔진)에 의해 관리되는 자바 기반 웹 컴포넌트로서
동적인 웹 컨텐츠 생성을 가능하게 해준다.
*/
// 이 예제는 배포 서술자 (web.xml)를 이용해서 실행할 Servlet을 설정하여 처리하는 예제이다
// Servlet클래스는 HttpServlet클래스를 상속해서 작성한다
public class ServletTest01 extends HttpServlet {
/*
이 영역에서는 service()메서드 또는 doGet()메서드나 doPost()메서드를
재정의해서 작성한다.
doGet()메서드나 doPost()메서드는 service()메서드를 통해서 호출된다.
이 메서드들의 매개변수로 다음과 같이 2개의 객체를 지정해준다.
- HttpServletRequest객체 => 서비스 요청에 관련된 정보 및 메서드를 관리하는 객체
- HttpServletResponse객체 => 서비스 응답에 관련된 정보 및 메서드를 관리하는 객체
*/
// doGet() 메서드 ==> GET방식의 요청을 처리하는 메서드
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8"); // 응답 문서의 인코딩 방식 지정
// 응답 문서의 ContentType 지정
resp.setContentType("text/html; charset=utf-8");
// 처리한 결과를 응답으로 보내려면 PrintWriter객체를 생성한다
// ==> HttpServletResponse객체의 getWriter()메서드를 이용하여 생성한다
PrintWriter out = resp.getWriter();
// 처리한 내용을 출력(전송)한다.
// 방법1) PrintWriter객체의 append()메서드 이용하기
out.append("<html>")
.append("<head> <meta charset='utf-8'> "
+ "<title>첫번째 서블릿</title></head>")
.append("<body>")
.append("<h2 style='text-align:center;'>")
.append("안녕하세요 첫번째 Servlet 프로그램입니다<br>"
+ "만나서 반갑습니다</h2>")
.append("</body>")
.append("</html>");
}
// doPost() 메서드 ==> POST방식의 요청을 처리하는 메서드
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
web.xml
서블릿이 실행가능 하게 등록+ 매핑
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>webTest</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>
<servlet-name>내마음대로이름</servlet-name>
<servlet-class>kr.or.ddit.basic.ServletTest01</servlet-class>
</servlet>
<!-- 요청 URL과 서블릿 매핑(연결)하기 -->
<!-- 이때 이름은 위의 등록한 값과 동일 -->
<servlet-mapping>
<servlet-name>내마음대로이름</servlet-name>
<url-pattern>/servletTest01.do</url-pattern>
</servlet-mapping>
</web-app>