Jsp/Servlet 이란
Jsp란 동적인 웹페이지를 개발하기위한 웹프로그래밍 기술이다.
이름에서처럼 자바 언어를 사용해 서버 측에서 웹 페이지들을 생성해 웹브라우저로 전송해준다.
동적인 웹페이지란
동일한페이지라 하더라도 그때그때 내용이 달라질수있는 웹페이지 즉 서버가 클라이언트의 요청을 해석하여 가장 적절한 웹페이지를 그때그때 생성해 보내주는 기술이다. 따라서 클라이언트는 요청한 계정, 시간, 지역, 언어, 기타입력값에 따라 다른결과를 받는다.동적 웹페이지는 전처리 과정을 거쳐 응답 페이지를 동적으로 생성한다. 그리고 이 전처리를 어떻게 하느냐에 따라 구체적인 동적 웹페이지 기술이 나뉜다. 그중 jsp와 서블릿에 대해서만..
서블릿
서블릿은 서버측에서 실행된다. 클라이언트의 요청을 받으면 서버에서 처리한후 응답으로는 결과값만 보내주는구조이다. 서블릿은 자바 파일.java를 컴파일한 클래스파일 .class파일형태이며 이를 실행하고 관리해주는 런타임을 서블릿컨테이너 라고 한다.
서블릿의 특징은
1. 클라이언트의 요청에 대해 동적으로 작동하는 웹애플리케이션 컴포넌트이다.
2. mvc모델에서 컨트롤러 역할을 한다.
3. 모든 메소드는 스레드로 동작된다.
4. javax.servlet.http 패키지의 HttpServlet클래스를 상속받는다.
서블릿컨테이너
서블릿은 스스로작동하는것이 아니라 서블릿을 관리하는 컨테이너가 필요하다. 대표적으로 Apache의 tomcat이 있다.
컨테이너는 서블릿의 생명주기를 관리하고, 요청이오면 스레드를 생성해 처리해준다. 또 클라이언트의 요청을 받아서 응답을 보내도록 통신을 지원해준다.
서블릿 컨테이너의 역할
통신지원 : 클라이언트와 통신하려면 포트와 소켓을 열고 IO스트림을열고 해야하는데 서블릿컨테이너는 API를 제공해서 간단히 해준다.
수명주기 관리 : 서블릿을 인스턴스화 한후 초기화하고, 요청에 맞는 적절한 메소드를 호출한다. 응답한 후에는 가비지 컬렉션을 통해 객체를 소멸시킨다.
멀티스레딩관리 : 서블릿 요청들은 스레드를 생성해 처리한다. 즉 멀티 스레드 방식으로 여러 요청을 동시에 처리할수있다.
선언적인 보안관리 및 JSP 지원 : 서블릿 컨테이너는 보안 기능을 지원하므로 별도로 구현하지않아도 된다.
서블릿 생명주기 메소드
서블릿은 클라이언트의 요청이 들어오면 가장먼저 서블릿 객체를 생성하고, 서블릿을 초기화한후 요청을 처리한다. 마지막으로 서버를 종료할때 객체를 소멸시킨다. 이것이 서블릿의 생명주기 lifecycle이다.
서블릿의 생명주기는 서블릿컨테이너가 관리한다. 즉 서블릿 컨테이너는 서블릿 객체를 생성하고, 각단계마다 자동으로특정 메소드를 호출하여 해당 단계에 필요한 기능을 수행한다. 이때 호출되는 콜백메소드가 생명주기 메소드이다.
서블릿객체 생성 ▶전처리를 위한 @PostConstruct ▶ init() ▶ service() [ doGet() or doPost() ] ▶ destroy() ▶ 후처리를 위한 @PreDestroy
init()메소드는 서블릿 초기화 작업을 수행하기위해 호출되고 최초요청시 딱 한 번 호출된다.
service는 클라이언트의 요청을 처리하귀해 호출된다.
destroy()는 서블릿이 새롭게 컴파일되거나, 서버가 종료될떄 호출된다.
서블릿 동작방식
서블릿은 mvc패턴의 컨트롤러 역할을 한다.
1. 클라이언트의 요청을 받아서
2. 분석한후 요청을 처리할 서블릿을 찾는다.
3. 서블릿을 통해 비지니스 서비스 로직을 호출하고
4. 모델로부터 그 결과값을 받아서
5. request나 session영역에 저장한후 결과값을 출력할 적절한 view를 선택한다.
6. 최종적으로 선택된 뷰(jsp 페이지)에 결과값을 출력한후 클라이언트에 응답하게 된다.
서블릿 작성규칙
서블릿은 javax.servlet, javax.servlet.http, java.io패키지를 임포트한다.
서블릿클래스는 반드시 public 으로 선언해야하고, HttpServlet을 상속받아야한다.
사용자 요청을 처리하기위해 doGet() 메소드다 doPost(0메소드를 반드시 오버라이딩해야한다.
doGet() doPost() 메소드는 ServletException과 IOExceptio예외를 던지도록선언한다.
doGet() doPost() 메소드를 호출할때의 매개변수는 HttpServletRequest와 HttpServlettResponse를 사용한다.
서블릿 작성은 클라이언트의 요청을 받아 전달할 요청명을 결정하는 일부터 시작한다.
jsp에서는 클라이언트 요청을 jsp가 직접받아 처리하지만, 서블릿은 요청명을 기준으로 이를 처리할 서블릿을 선택하게되는 매핑작업을 해야한다.
매핑에는 두가지 방식이 있다.
web.xml에 기술하거나, @WebServlet어노테이션을 사용해 코드에 명시할수있다.
web.xml에 기술할때에는 <servlet>태그 안에 아래 두 태그를 사용해서 서블릿 클래스를 등록한다.
<servlet-name>에는 서블릿을 참조할때 사용할 이름을 입력하고, <servlet-class>태그 안에는 패키지를 포함한 클래스명을 입력한다. 닫는태그는 꼭 쓴다. 여기서 </servlet>닫는태그까지 작성한다.
<servlet-mapping> 안에 아래 두 태그를 작성하여 매핑정보를 등록한다.
<servlet-name> 위에 <servlet>태그에서 사용한 <servlet-name>과 같은 이름을 입력하고, <url-pattern>안에 요청명으로 사용할 경로를 입력한다. 이때 컨텍스트 루트를 제외한'/'로 시작하는 경로를 사용해야한다.
@WebServlet어노테이션으로 매핑할때에는 클래스명 위에 어노테이션을 붙이고 @WebServlet("url패턴")의 방식으로 작성하면된다.