
개요
Servlet : 웹 서버(컨테이너)에서 수행되는 자바 클래스
-
서버의 응용 프로그램을 구현하는 기술
-
서버 프로토콜 종류에 관계없이 여러 애플리케이션 기반의 응용프로그램 개발 가능
-
주요 서버 환경 : HTTP 프로토콜
-
클라이언트의 요청에 대해 서블릿 컨테이너에 의해 독립된 스레드 기반으로 서비스
⇒ 프로세스 기반 서비스인 CGI보다 속도 빠름
-
서블릿 컨테이너 : 클라이언트에서 전송되는 서블릿 요청/응답에 대한 처리 담당
-
비즈니스 로직과 프레젠테이션 로직이 혼합된 형태
-
단점 : html 코드가 변경되면 매번 서블릿을 재컴파일 해야 함
동작 과정
- 웹 클라이언트가 웹 서버에게 HTTP 요청 메시지 보냄 (GET/POST)
- 웹 서버가 HTTP 요청을 해석
- 서블릿에 대한 요청일 경우 서블릿 컨테이너에게 요청 전달
- 서블릿 컨테이너가 서블릿을 생성해 서비스를 수행
- init() : 서블릿 인스턴스 생성
- service() : 실제 서비스 수행
- 서블릿에서 서비스 수행 후 결과를 알려주기 위한 결과 페이지를 웹 서버 통해 전달
- 웹 서버가 서블릿 컨테이너로부터 받은 결과 페이지를 클라이언트에게 되돌려 줌
서블릿 API
javax.servlet 패키지
- 특정 프로토콜에 종속되지 않은 서블릿을 작성하기 위해 필요한 기본 클래스와 인터페이스 제공
- 인터페이스 : Servlet, ServletRequest, ServletResponse, ServletConfig, ServletContext, RequestDispatcher
- 클래스 : ServletInputStream, ServletOutputStream, CenericServlet
javax.servlet.http 패키지
- 특정 http 프로토콜을 따르는 서블릿 작성에 필요한 기본 클래스, 인터페이스
- HttpServlet 클래스
- HTTP 서블릿을 작성하려면 이 클래스를 상속받고 doGet(), doPost() 매소드를 재정의한다
- HttpServletRequest 인터페이스
- HTTP 서블릿에서 웹 클라이언트로부터 전달된 요청 관련 작업
- Servlet-Request 인터페이스를 상속받고 HttpServlet 클래스에 의해 상속됨
- CGI 환경변수 참조, 웹 클라로부터 전달된 매개변수 파싱, 웹 클라로부터 전달된 Cokkie 데이터 파싱
- HTTP 요청에 대한 헤더 정보 얻기
- HttpServletResponse 인터페이스
- 웹 클라에게 전달할 응답 관련 작업
- ServletRequest 인터페이스 상속 받고, HttpServlet 클래스에 의해 사용됨
- 결과 페이지 출력, HTTP 응답에 대한 헤더 정보 설정, 웹 클라에게 부여할 Cokkie 추가
@WebServlet("/hello.do")
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
public HelloServlet() { }
// Get 방식 요청을 처리하기 위한 서비스 메소드
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException) {
// 응답위한 인코딩 설정
response.setCharacterEncoding("UTF-8");
// 클라에게 응답하기 위한 출력객체
PrintWriter out = response.getWriter();
out.print("<!DOCTYPE html>");
// ... 생략
out.printt("</html>");
out.close();
}
}
서블릿 라이프 사이클
서블릿 컨테이너가 서블릿 인스턴스의 라이프사이클을 관리함
- 서블릿 클래스는 객체 생성 및 메소드를 호출하는 주체가 서블릿 컨테이너
- 서블릿은 서블릿 컨테이너 내에서 실행되며 세션 유지 가능
메소드
init()
- 서블릿 컨테이너가 서블릿 인스턴스를 생성하고 서블릿이 초기화 작업을 할 수 있게 함
- 라이프 사이클 중 단 한 번만 실행
service(...)
- 서블릿이 클라이언트로부터 온 요청을 받아 처리할 수 있게 함
- service() 호출 시 ServletRequest/ServletResponse 객체를 매개변수로 전달
- ServletRequest 객체를 이용해 요청 처리
- ServletResponse 객체 이용해 얻은 PrintWriter 객체를 통해 결과 페이지 출력
destroy()
-
서블릿이 요청 관련 작업을 모두 마치면 서블릿 컨테이너에 의해 스레드 풀에 들어가거나 메모리에서 내려감
-
메모리에서 내려갈 때에는 GC가 됨
⇒ 서블릿이 GC가 되기 전에 마무리 작업을 할 수 있도록 해줘야 함
서블릿의 사용자 요청 처리 과정
-
컨테이너가 Servlet클래스를 메모리에 적재
-
Servlet 클래스의 생성자 메소드를 호출해 인스턴스를 생성하여 메모리에 적재
-
init() : 생성된 인스턴스의 init() 메소드 호출
-
service() : 사용자 요청에 대해 web.xml 파일을 참조해 URL 매핑 확인
⇒ 해당 Servlet 인스턴스로부터 스레드를 생성해 service() 메소드 호출
(Get 방식이면 doGet(), Post방식이면 doPost())
-
destroy() : 서블릿 인스턴스의 존재이유가 없어서 메모리에서 소멸될 때
HTML 입력 태그 데이터 처리
FORM 태그
FORM
-
action : 처리될 서블릿 URL이나 jsp 파일명 기술
⇒ submit 버튼 누르면 사용자가 입력한 데이터를 전송 받을 서버쪽에서 실행가능한 프로그램의 URL
-
method : HTTP의 전송 방식 (GET/POST)
get | post : 둘 중 하나 선택
<form action="Target JSP page" method="get|post">
INPUT
-
Text, password, submit, reset 등등
-
hidden : 브라우저에는 나오지 않지만, 지정한 value를 서버에 전송
직접 입력 받지 않지만 서비스에 필요한 데이터
Form 태그와 GET 방식
GET 방식
- GET 방식 : 서버의 데이터를 읽기전용으로 조회
- HTTP의 기본 전송 방식 : GET방식 (디폴트)
- 데이터 양에 제한
- 클라이언트가 서버에 전달하는 내용은 URL의 끝 부분에 Query String 형태로 전달됨
QueryString
- ?로 시작, "이름=값"
- 여러 쌍이 나오면 & 문자로 구별
<!-- name 부분에 이름이라는 값이, addr 부분에 NewYork이라는 값이 전달됨 -->
http://<host>/servlet/webapp/name="이름"&addr=NewYork
Form 태그와 POST 방식
POST 방식
-
POST 방식 : HTTP 요청 body에 입력 스트림을 통해 정보 전달 ⇒ stdin방식으로 서블릿/JSP에 전달
-
전달되는 데이터 양에 제한 x
-
사용자가 브라우저상에서 전달되는 데이터 모습을 볼 수 없음
⇒ 로그인, 비번 전달에 유리
GET vs POST
차이 : 데이터를 어떻게 넘기느냐
- GET : URL 뒤에 쿼리 스트링로 직접 전달
- POST : HTTP 헤더 뒤에 입력 스트림 데이터로 전달
서블릿에서 Form 데이터 처리방법
FORM에서 전달된 값은 서블릿의 HttpServletRequest 객체를 통해 얻어낸다
-
getParameter(String name) : name에 해당하는 value 하나를 추출해 문자열로 리턴하고 없으면 null 리턴
⇒ <input> 태그의 name 속성값과 getParameter()의 인자로 전달하는 문자열이 동일해야 함
-
getParameterValues(String name) : name에 매핑되는 모든 value를 String[]로 리턴
-
getParameterNames() : 요청 데이터에서 name 값을 모두 추출해 Enumeration으로 리턴
Form 데이터가 한글인 경우
⇒ request.setCharacterEncoding() 이용해 'UTF-8'로 설정
public class FormBasedHello extends HttpServlet{
private static final String DEFAULT_NAME = "World";
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// name을 인자로 전달하여 Form Data 추출
String name = request.getParameter("myName");
if((name==null) || (name.length()==0)
name = DEFAULT_NAME;
}
}
}
ServletContext
ServletContext
-
웹앱내의 서블릿이나 JSP 간 자원을 공유해서 사용하기 위한 객체
-
웹앱의 파라미터 정보를 읽어 오기 위함
-
웹앱 당 하나의 ServletContext 객체 생성
-
ServletConfig는 해당 서블릿에서만 사용 가능
⇒ ServletContext를 사용해 웹앱 내의 공통적인 내용을 공유하자
RequestDispatcher
클라로부터 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 보냄
메소드
- getResource(String path) : 문자열 path에 지정된 자원을 URL 객체로 리턴
- getContext : 문자열 path에 지정된 자원의 Context 정보 리턴
- getRequestDispatcher : 문자열 path에 지정된 자원을 위한 request dispatcher 객체 리턴
Servlet의 페이지 이동
Forward
-
서버 내부의 서블릿 간 페이지 이동
-
request 객체가 그대로 유지되어 전달
-
forward() 호출시 Request Dispatcher 객체가 req와 res를 전달
-
이때 request.setAttribute() 로 forward된 servlet에 데이터를 전달할 수 있음
Redirect
- 타 서버까지 자유롭게 이동
- sendRedirect() 호출 시
- 웹 컨테이너는 이동하려는 새 URL을 브라우저의 클라이언트에게 전달
- 새로운 req를 생성할 수 있도록 함
-
이전에 생성된 req와 res객체는 사라짐
⇒ 객체에 원하는 데이터를 저장하여 전달 불가
⇒ 세션, 쿠키에 저장해야 함
-
느림 : req, res가 두 번 일어남
include
- 현재 페이지에 다른 페이지를 포함
- include된 서블릿의 response는 서블릿의 최종 response에 포함됨
댓글