Servlet API Documentation
Package javax.servlet.http
Class HttpServlet
Servlet
컨테이너(서블릿 엔진)에 의해서 관리되는 자바기반 웹 컴포넌트로서, 동적인 웹컨텐츠 생성을 가능하게 해준다.
클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
사용자가 로그인 하려고 할 때 사용자는 아이디와 비밀번호를 입력하고, 로그인 버튼을 누른다.
서버는 클라이언트의 아이디와 비밀번호를 확인하고 다음 페이지를 띄워주어야 하는데 이러한 역할 수행하는 것이 바로 서블릿
- 서블릿을 실행시켜 주는 서블릿엔진, 서블릿컨테이너,WAS : 톰캣
- 서블릿 스펙에 맞춰 개발한 프로그램을 톰캣을 이용해서 실행
- JSP표준에 앞서 자바에서 웹 어플리케이션 개발을 위해 만들어진 표준
- 어떻게 만드세요하는 스펙, 인터페이스..
- HttpServlet을 extends하면 서블릿 프로그램이 된다
Servlet 특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- html을 사용 => 요청에 응답
- Java Thread를 이용하여 동작
- MVC패턴에서 Controller로 이용
- UDP보다 처리속도가 느리다.
- HTML변경시 Servlet을 재컴파일해야 하는 단점
- HTTP 프로토콜을 서비스를 지원하는 java.servlet.http.HttpServlet 클래스를 상속받는다 (아래 사진)
- javax.servlet.GenericServlet 을 extends한 Class HttpServlet
- HttpServlet을 상속해서 기능을 다 갖다씀
Servlet 개발 과정
- 서블릿 규약에 따라 자바 코드를 작성 (HttpServlet 상속 후 필요 메소드 재정의)
- 자바 코드를 컴파일하여 클래스 파일 생성
- 클래스 파일을 /WEB-INF/classes 디렉토리에 패키지 구조에 따라 저장
- web.xml 파일에 서블릿 클래스 등록 및 리퀘스트와의 매핑
- 서블릿 3.0규약부터 @WebServlet 어노테이션으로 대체
- 톰캣등의 컨테이너 재실행(서블릿 리로딩 기능이 있는 경우 생략)
- 웹 브라우저에서 요청 처리 결과 확인
HTTP방식 (method)별 구현 메소드
- 요청의 의미와 요청데이터 패키징 방식을 구분하기 위한 방법으로 정의된 Http method는 GET,POST,PUT,DELETE,HEAD,OPTION,TRACE등이 있음
- 대부분의 웹서버와 브라우저에서 지원하며 일반적인 웹에서 사용되는 method는 GET과 POST
GET
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet() 호출됨..");
}
POST
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost() 호출됨...");
}
서블릿의 callback 메소드 종류
- lifeCycle 관련 메소드 :생명주기내에서 단 한번씩 호출되는 메소드 init, destroy
- request 처리 관련 메소드 : 요청 발생시마다 각 쓰레드 내에서 반복 호출되는 메소드
service 및 do~ 계열의 메소드
서블릿 동작 방식
- callback메소드 호출 순서
init호출 -> 리퀘스트 발생시 service호출 -> service메소드내에서 현재 리퀘스트의 httpmethod 구분 후 해당 do~메소드 호출 -> 객체 소멸 직전 destroy호출
- 사용자(클라이언트)가 URL을 클릭하면 HTTP Request를 Servlet Continer로 전송(요청)한다.
- 요청을 전송받은 Servlet Container는 HttpServletRequset, HttpServletResponse객체를 생성
- 컨테이너는 web.xml에 정의된 urlpattern을 확인하여 어느 서블릿을 통해 처리해야 할지를 검색한다. (로딩이 안된 경우에는 로딩함. 로딩시, init() 호출됨)
- Servlet Container는 요청을 처리할 개별 쓰레드 객체를 생성하여 해당 서블릿 객체의 service()메서드를 호출
(이 때 HttpServletRequest 및 HttpServletResponse 객체를 생성하여 파라미터로 넘겨준다.)
- 해당 서블릿에서 service메소드를 호출한 후 클라이언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출
- 요청처리가 완료되면, HttpServletRequest 및 HttpServletResponse객체는 소멸된다.
- 컨테이너로부터 서블릿이 제거되는 경우에 destroy()메서드가 호출
서블릿 등록 및 매핑(web.xml, @WebServlet)
- web.xml 에 직접 등록 및 매핑
서블릿 등록(servlet엘리먼트 사용)
- 서블릿을 등록하는 과정에 설정된 모든 정보는 서블릿의 콜백 메소드내에서 ServletConfig객체를 통해 접근 가능
- servlet-name : 컨테이너 내에서 관리되는 서블릿 인스턴스의 이름을 지정
- servlet-class: 컨테이너 내에서 관리될 서블릿 클래스를 지정
- init-param : 서블릿의 초기화 파라미터 설정(param-name, param-value로 구성)
- load-on-startup : 서블릿의 인스턴스 생성 순위 지정
- web.xml 아래부분
<servlet>
<servlet-name>T02_ServletTest</servlet-name>
<servlet-class>kr.or.ddit.basic.T02_ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T02_ServletTest</servlet-name>
<url-pattern>/T02_ServletTest</url-pattern>
</servlet-mapping>
CGI (Common Gateway Interface) 그냥 참고
- 별도로 제작된 웹서버와 프로그램간의 교환방식
CGI방식은 어떠한 프로그래밍언어로도 구현이 가능
- 별도로 만들어놓은 프로그램에 HTML의 Get or Post방법으로 클라이언트의 데이터를 환경변수로 전달, 프로그램의 표준 출력 결과를 클라이언트에게 전송
- 자바 어플리케이션 코딩하듯 웹 브라우저용 출력화면 만드는 방법
Servlet Container
서블릿을 관리해주는 컨테이너
- 서블릿 작동을 위해 서블릿을 관리해주는 역할
- 서블릿 컨테이너는 클라이언트의 요청을 받아주고 응답을 할 수 있게 웹서버와 소켓으로 통신하며 대표적으로 톰캣(Tomcat)이 있음
- 톰캣은 실제로 웹서버와 통신하여 JSP(Java Server Page)와 Servlet이 작동하는 환경을 제공
Servlet Container 역할
1.웹서버와 통신 지원
- 서블릿과 웹서버가 손쉽게 통신할 수 있게 해줌
2. 서블릿 생명주기(Life Cycle)관리
- 서블릿컨테이너는 서블릿 탄생과 죽음을 관리
- 서블릿 클래스를 로딩하여 인스턴스화하고 초기화메소드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드 호출
3. 멀티쓰레드 지원 및 관리
- 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 쓰레드를 생성 => HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 죽게됨
4. 선언적인 보안 관리
- 보안관리는 XML 배포 서술자에 기록하므로
보안에 대해 수정할 일이 생겨도 자바소스코드를 수정하여 다시 컴파일하지 않아도 보안관리가 가능
Servlet 생명주기
- 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인 => 없을 경우 init()메소드 호출하여 적재, init()메소드는 처음 한번만 실행
- init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()과 doPost()로 분기
- 클라이언트의 요청이 오면 가장 먼저 처리하는 과정 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공
- 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현
JSP(Java Server Page)
Java코드가 들어가 있는 HTML코드
- 서블릿은 자바 소스코드속에 HTML코드가 들어가는 형태인데, JSP는 이와 반대로 HTML소스코드 속에 자바 소스코드가 들어가는 구조를 갖는 웹어플리케이션 프로그래밍 기술
<% 소스코드 %> , <%= 소스코드 %>
- 자바소스코드로 작성된 이 부분은 웹브라우저로 보내는것이 아니라 웹서버에서 실행되는 부분
- JSP는 WAS(Web Application Server)에 의하여 서블릿 클래스로 변환하여 사용되어짐
14_ServletTest 프로젝트 생성 후 Dynamic Web Project 생성 과정
- Dynamic Web Project 생성
- Context란? : 애플리케이션 객체(?)에 대한 정보를 관리 (root..)
-
WEB-INF (중요한 폴더)
jar나 설정파일 web.xml
-
위사진 실행하면 web.xml 자동생성
-
lib => 여기 들어가있는 jar 라이브러리들은 톰캣이 자동으로 빌드패스 잡음
-
bulid에 있는 classes가 webcontent-> web-inf->classes에 자동으로 복사됨
build는 자바가 쉽게 이용하려고 둔거고 톰캣으로 보내기 전에? 서버에 배포하기 전에? webcontent로 보냄
-
웹개발에 필요한건 webcontent에 다 들어있음?..
예제1 14_ServletTest / T01_ServletLifeCycle , web.xml
web.xml
- 위사진 >> url이 날라오면 톰캣이 구동시켜줌
- servlet + servlet-mapping을 통해 사용자가 url-pattern에 설정된 url을 요청하면 매핑된 서블릿이 구동되도록 설정
텍스트
- init(객체 생성) 한번만 호출됨
- ex. jdbc할때 제일 먼저 connection 맺어야되는데 이런걸 init()에 넣어주면 호출될때 바로 되서 편함