[JSP] 서블릿(Servlet) 이란? Server Side Program 정의

 

서블릿
서블릿 설명

1. Servlet 이란?
  - Server Side Program으로 서버 쪽에서 실행되는 프로그램을 말한다.

  - 웹 어플리케이션을 구현하기 위해 작성해야 하는 코드 -> 서블릿클래스
  - 서블릿 클래스는 클래스 상태 그대로 실행되는 것이 아니라, 일단 서블릿으로 만들어진 다음에 실행
  - 서블릿은 서블릿클래스로부터 만들어진 객체

 

  => 따라서, 웹컨테이너는 서블릿클래스를 가지고 서블릿 객체를 만든 다음에 그 객체를 초기화해서
       웹서비스를 할 수 있는 상태로 만드는데, 이런 작업을 거친 서블릿 객체만을 서블릿이라 한다

       서블릿클래스가 서블릿이 되기 위해 여러 작업을 해야 하는데 그러한 작업은 웹컨테이너에 의해 수행되기 때문에
       우리는 정해진 규칙에 따라 서블릿 클래스를 작성하고, 컴파일하고 웹컨테이너에 설치하고, 등록하면 된다

 

 

1) CGI (Common Gateway Interface)에 대한 이해 및 서블릿과의 비교
  - CGI는 서버 측에서 수행되는 외부 프로그램간의 통신 규약으로서
   정적인 html만으로는 실시간 급변하는 정보를 제공할 수 없기 때문에 동적으로
   html문서를 생성해낼 수 있는 기술로 등장했다.
  - 이런 프로그램은 C, C++, Perl 등 다양한 프로그래밍 언어로 작성할 수 있는데
   이런 프로그램을 통털어 CGI 프로그램이라고 한다.
  - CGI를 사용하면 웹서버는 프로그램을 실행시키고 사용자의 데이터
   (사용자 정보, html form에서 입력한 정보 등)를 외부 프로그램에 전달한다.
  - 외부 프로그램은 사용자의 데이터를 처리하고 응답을 웹서버에 전달한다.
   웹서버는 외부 프로그램으로부터 받은 응답을 다시 클라이언트(브라우저)에 전달한다.
  - 위와 같은 동작 원리로 Java언어를 사용하여 작성한 CGI 프로그램을
   서블릿(서버 사이드 애플릿)이라고 한다.
  - 그러나 서블릿과 일반 다른 CGI프로그램과는 구별되는 점이 있는데,


   1> 일반 CGI는 클라이언트 요청이 있을 때마다 프로세스를 생성하여 CGI프로그램을
   수행함으로써 서버 측에 작업 부하를 가져오지만, 서블릿은 클의 요청이 있을 때마다
   프로세스를 생성하는 것이 아니라, 스레드를 생성한다. 스레드 생성은 프로세스 생성에
   비해 작업 부하가 적게 걸리고 속도면에서도 상당히 빠르다.
   2> 이 외에도 서블릿은 메모리 사용이 적고,
   3> 표준 API 를 제공하며 (프로젝트 진행시 표준 API 이므로 원활히 진행 가능하다.)
   4> 서블릿 보안 모델 사용 가능하고,
   5> 분산객체기술(RMI, CORBA, EJB 등)을 활용 할 수 있다는 장점을 가진다. 

 

 

서블릿 클래스 만들기
1. 서블릿 클래스는 javax.servlet.http.HttpServlet클래스를 상속하도록 만들어야 한다.
2. doGet 또는 doPost메서드 안에 웹 브라우저로부터 요청이 왔을때 해야 할일을 기술해야 합니다.
3. HTML문서는 doGet, doPost메서드의 두번째 파라미터를 이용해서 출력해야 합니다.

서블릿클래스의 상속관계도를 보여주자


서블릿클래스를 만들어 보자
1. 우선 제목을 만들어야 하는데....
public class HelloServlet extends HttpServlet {

}
**서블릿에서는 반드시 public으로 선언해야 한다.
(왜냐하면, 웹컨터이너가 서블릿 객체를 만들때 이 접근권한이 필요하기 때문)

 

2. 서블릿 클래스 안에 doGet, doPost 메서드를 선언해야 한다.
이 두개의 메소드는 javax.servlet.http.HttpServletRequest와 javax.servlet.http.HttpServletResponse타입의
파라미터를 받아야 하고, 메서드 밖으로 javax.servlet.ServletException과 java.io.IOException을 던질수 있게
선언해야 한다.
public class HelloServlet extends HttpServlet {
 public void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
  throws ServletException, IOException {

 }
}

public class HelloServlet extends HttpServlet { public void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)  throws ServletException, IOException { }}

3. 화면에 출력을 하려면 HTML코드를 이용하여야 하는데...
getWriter라는 메서드를 호출해서 PrintWriter객체를 만들어서 작성을 한다.
PrintWriter writer = response.getWriter();
이렇게 하면 writer객체의 printf, println, print등의 메소드를 통해서 HTML코드를 웹브라우져로 전송하게 된다.

public class HelloServlet extends HttpServlet {
 public void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
  throws ServletException, IOException {
  PrintWriter writer = response.getWriter();
  out.println("<html>");
  out.println("<head><title>Hello Servlet</title></head>");
  out.println("<body><h2>HELLO SERVLET</H2></body>");
  out.println("</html>");
  
 }
}

public class HelloServlet extends HttpServlet { public void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)  throws ServletException, IOException 
{  PrintWriter writer = response.getWriter();  
out.println("<html>");  out.println("<head><title>Hello Servlet</title></head>");  
out.println("<body><h2>HELLO SERVLET</H2></body>");  
out.println("</html>");   }}
서블릿 등록하기 웹애플리케이션의 디플로이먼트 디스크립터(Web appliocation deployment descriptor)
web-int 서브디렉터리 안의 web.xml이라는 이름의 파일에 저장

 

 

 [web.xml 파일]

<web-app>
</web-app>  => web.xml파일의 루트 엘리먼트

<web-app>
<servlet>
 //서블릿 클래스의 이름이 들어갈 부분
</servlet>
<servlet-mapping>
 //서블릿 클래스를 호출할 때 사용항 URL이 들어갈 부분
 //웹서버의 도메인 이름, 포트번호, 웹애플리케이션 디렉터리의 이름까지를 제외한 나머지 부분
 //예 전체URL이 http://localhost:8080/brain/hundred => /hundred
</servlet-mapping>
</web-app>

아래와 같이 클래스이름과 URL을 등록한다
<web-app>
<servlet>
 <servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
 <url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>

이파일에 다른 <servlet>이 등록될수 있으므로 이 <servlet>의 이름을 등록시켜줘야 한다
<web-app>
<servlet>
 <servlet-name>hello</servlet-name>
 <servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>hello</servlet-name>
 <url-pattern>/servlet</url-pattern>
</servlet-mapping>

이렇게 만들어 주면 된다.
</web-app>

 

+ Recent posts