자바 서블릿이란.
자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며,
흔히 "서블릿"이라 불린다.
자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는
자바 클래스의 일종 (물론 Servlet은 interface)이다.
서블릿은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면,
서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.
..라고 위키백과에 정의 되어있습니다. 저기서 중요한 건 자바클래스의 일종이다라는 것입니다.
웹과 관련해서 조금 더 쉽게 설명해보겠습니다.
서버-클라이언트 관계에서는 클라이언트가 요청을 하면 서버가 요청에 맞게 응답을 해줍니다.
인터넷 초기에는 정적 컨테츠를 주고받기만 하면 됬었는데,
인터넷이 발달하면서 동적컨텐츠가 필요하게 되었고
많은 프로그래밍 언어들이 이런 동적컨텐츠를 처리하는것에 도전하게 됩니다.
물론 java에서도 이런 동적컨테츠를처리하는 방법이 나오기시작했고
이러한 방법들을 모아서 Servlet이란 interface를 만들었습니다.
웹에서는 HTTP통신을 하기 때문에 동적컨텐츠를 처리하는 방법을 모은 Servlet을 상속해
HTTP통신에서의 동적컨텐츠를 처리할 수 있는 클래스인 HttpServlet을 만들었습니다.
이 HttpServlet이라는 인터페이스에는 HTTP통신으로 요청한 동적컨텐츠를
오로지 java만으로 처리해서 응답할 수 있는 기능이 있습니다.
이제 HttpServlet클래스를 상속받아 메소드를 오버라이딩하면
입맛대로 동적컨텐츠를 처리 할 수 있게되었습니다.
일반적으로 이런 HttpServlet를 상속받은 클래스를 Servlet이라고 부릅니다.
즉, Servlet도 하나의 클래스이자 자바파일인 것입니다.
서블릿이란 자바에서 웹 애플리케이션을 만드는 기술
자바에서 동적인 웹 페이지를 구현하기 위한 기술 표준
(즉 Interface로 구성되어있고, 이거를 상속받아 구현한 것을 일반적으로 서블릿이라고 부름
※ 자바만으로 html코드를 만들기 위해서 out.print를 했는데 힘들다
-> html이랑 같이쓰면서 자바 필요한 곳에서는 자바를 사용하자.
-> jsp 등장!!
서블릿 상속관계
서블릿 컨테이너
- 서블릿 컨테이너
: 서블릿들의 생성, 실행, 파괴를 담당한다.
: 서블릿들을 위한 상자(Container)입니다.
서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리 해주는 것이 필요한데,
이러한 역할을 하는 것이 바로 서블릿 컨테이너 입니다.
서블릿 컨테이너는 구현되어 있는 Servlet 클래스의 규칙에 맞게
서블릿 객체를 생성, 초기화, 호출 종료하는 생명 주기를 관리합니다.
참고 : 컨테이너라는 개념이 잘 이해가 안간다면
https://brilliantdevelop.tistory.com/28?category=975559의 WAS부분을 참고하세요.
서블릿의 생명주기
1) init()
서블릿을 처음 메모리에 올릴때 실행되어, 서블릿을 초기화하며 처음에 한번만 실행됩니다.
2) service() : Http요청방식에 상관없이 get방식이든,post방식이든 요청이 들어오면 실행되는 메소드
doGet() : get방식으로 요청이 왔을 때 실행되는 메소드
doPost() : post방식으로 요청이 왔을 때 실행되는 메소드
※get,post방식 이외에도 많은 요청방식이 있지만 주로 이 2개의 방식이 사용됩니다.
3) destroy()
서블릿 종료요청이 있을때 destroy() 메소드가 실행됩니다.
(서버가 종료될때가 아닙니다)
서블릿 개발과정
1. 서블릿 규약에 따라 자바코드 작성( HttpServlet상속받은 자바코드 작성)
2. web.xml파일에 서블릿 설정
다음과 같이 HttpServlet을 상속받은 Sum 클래스를 만들어봅시다.
패키지는 com.study.servlet입니다.
package com.study.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Sum extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out=resp.getWriter();
resp.setContentType("text/html; charset=utf-8");
out.print("<html><body><h2>1부터 10까지의 합</h2>");
StringBuffer result=new StringBuffer();
result.append("<ul>");
int sum=0;
for(int i=1;i<=10;i++){
sum+=i;
result.append("<li>"+i+"="+sum);
}
result.append("</ul>");
out.print(result.toString());
out.print("</body></html>");
}
}
서블릿을 만들기만 하면 아무런 역할을 하지않습니다.
서블릿은 HTTP 요청이 올 때 처리를 하는것에 의미가 있는데
어떤 요청이 올 때 어떤 서블릿이 처리하는지에 관한 내용은 web.xml에 기술합니다.
<servlet>
<servlet-name>sum</servlet-name>
<servlet-class>com.study.servlet.Sum</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sum</servlet-name>
<url-pattern>*.ch</url-pattern>
</servlet-mapping>
<servlet-name>이 둘다 sum이므로 url-pattern이
확장자가 ch로 끝나는 모든 요청은 Sum클래스가 처리하겠다는 의미입니다.
URL패턴 종류
- "/’로 시작하고 ‘/*’로 끝나는 url-pattern은 경로 매핑을 위해 사용한다
- ‘*.’로 시작하는 url-patter은 확장자에 대한 매핑을 할 때 사용한다
- ‘/’만 포함하는 경우 어플리케이션 기본 서블릿으로 매핑한다
- 이 외 다른 문자열은 정확한 매핑을 위해 사용한다.
우선순위는 정확한매핑, 경로, 확장자, 기본 매핑입니다.
단 경로,확장자가 겹치게 하는 경우는 거의 없기 때문에
정확한 매핑>경로,확장자>기본매핑 순이라고 보면 됩니다.
기본매핑은 다른 url패턴과 겹치지 않는 모든 요청을 처리합니다
※ 톰캣은 서블릿이다 -> 자바다 -> 서버를 킨다는건 = main메소드 실행
모든 요청은 서블릿이받는다
-> *.jsp도 서블릿이 받는다
- > jsp Servlet이 기본 톰캣 Server프로젝트 web.xml에 있다
동적처리는 웹컨테이너
-> 톰캣은 자바기반, 서블릿
-> 서블릿이 동적처리
-> 톰캣의 웹컨테이너는 서블릿컨테이너