우리가 실제 웹을 개발할 때 서블릿을 가지고 개발할 일은 없을 거 같습니다. 스프링 프레임워크 혹은 전자정부표준프레임워크를 이용해서 개발하겠죠?
그러나 스프링도 전자정부표준프레임워크도(전자정부표준프레임워크가 스프링입니다.) 모두 내부에서는 서블릿을 사용하여 웹을 구성합니다. 우리가 단순 코더가 아니라 아키텍처를 파악하고 능동적으로 웹을 개발하기 위해서 서블릿의 이해는 필수입니다.
자 이제 서블릿의 개요와 라이브러리를 등록하는 방법을 살펴보았으니 서블릿을 직접 작성해 보도록 하겠습니다.
서블릿은 우리가 지금까지 살펴봤던 다른 자바 클래스를 호출하는 방법과 동일한 방법으로 호출할 수 없습니다. 지금까지 자바는 main 메서드를 갖고 있는 Application이었고 Exam 클래스의 test() 메서드를 호출하려면 아래와 같이 new 연산자를 이용하여 객체 생성을 한 후 메서드를 호출해야 했습니다.
Exam obj = new Exam()
obj.test()
그러나 서블릿은 주로 html 페이지에서 하이퍼링크를 클릭하거나 이미지를 클릭하거나 양식 태그에서 뭔가를 선택하고 입력하고 버튼을 누를 때 서버 쪽에서 실행이 됩니다. 태그 내부에서는 자바 코드를 실행하는 명령문을 정의할 수 없습니다.
즉, 지금까지와는 다른 방식으로 실행될 것이라는 뜻이죠. html 태그 내부에서 요청하는 규칙에 맞춰서 서블릿을 요청하면 서버가 그 요청을 분석해서 서블릿을 찾아 자동으로 실행합니다. 서버가 자동으로 실행한다는 것은 지켜야 하는 규칙이 있다는 의미겠죠?
이제 서블릿을 작성하기 위한 규칙을 살펴보도록 하겠습니다.
[서블릿 작성 규칙]
- public 클래스로 작성하기
- HttpServlet 상속하기
- doGet, doPost 등의 메서드 오버라이딩하기
- web.xml에 서블릿 등록하기
1. public 클래스로 작성하기
서블릿은 직접 호출문을 정의해서 호출하는 것이 아니라 서버에서 호출합니다. 외부에서 호출하므로 서블릿 클래스는 public 클래스로 작성해야 합니다.
2. 서블릿 클래스 상속받기
일반 클래스로 작성하면 서버가 호출할 수 없으므로 반드시 서블릿 클래스의 하위 클래스로 작성해야 합니다. 다음과 같은 상속관계에 있는 클래스를 상속받아 작성합니다. 우리가 서블릿을 만들어서 실행할 환경이 웹 환경이고 웹은 http 프로토콜을 사용하므로 대부분은 HttpServlet을 상속받아 서블릿을 작성합니다.
package basic;
import javax.servlet.http.HttpServlet;
public class FirstServlet extends HttpServlet{
}
3. 서블릿의 lifecycle에 관련된 메서드를 오버라이딩
서버가 요청을 받으면 요청을 분석해서 서블릿 디렉토리에서 요청받은 서블릿을 찾아 실행합니다. 상황에 맞게 적절하게 메서드를 오버라이딩해서 처리하고 싶은 기능을 구현합니다. 서블릿의 lifecycle은 다음 강좌에서 다루도록 하겠습니다.
- init : 서블릿이 생성된 후 서블릿 객체가 초기화될 때 호출되는 메서드
- service : 요청을 받을 때마다 호출되는 메서드 (요청 방식 구분 없이 실행되는 메서드)
- doGet : get 방식으로 요청될 때 호출되는 메서드
- doPost : post 방식으로 요청될 때 호출되는 메서드
- destroy : 서블릿 객체가 소멸될 때 호출되는 메서드
우선 service 메서드를 오버라이딩 해보도록 하겠습니다.
package basic;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
public void service(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
System.out.println("서블릿 요청 성공");
}
}
4. 서블릿 등록하기
이제 마지막 작업으로 서블릿을 등록할 수 있어야 합니다. "어떻게 요청이 오면 어떤 서블릿을 실행해라"라는 내용을 서버에 등록해 놓아야 서버가 요청에 맞게 서블릿을 찾아서 실행할 수 있습니다. 이런 설정을 정의할 수 있는 설정 파일은 web.xml입니다. 사실 지금은 annotation을 이용하여 작업하지만 그전에 web.xml에 직접 등록을 해 보아야 annotation을 쉽게 이해할 수 있으므로 직접 해보도록 하겠습니다. web.xml 파일은 xml 파일입니다. xml 파일은 웹 서비스로 전달받은 데이터를 저장하기도 하며 이렇게 많은 프로그램의 설정 파일로 사용되기도 합니다. web.xml 파일을 작성할 때는 신중하게 작업해야 합니다. 만약 실수가 있으면 서버가 start 되지 않기 때문입니다.
우리가 등록할 web.xml의 엘리먼트는 <servlet>과 <servlet-mapping>입니다.
요청 방식과 실행할 서블릿의 정보를 정의하는 엘리먼트로 반드시 한 쌍으로 등록을 해야 합니다. 등록해야 하는 엘리먼트에 대해서 좀 더 자세히 살펴보도록 하겠습니다.
1) <servlet>엘리먼트
하위 엘리먼트로 <servlet-name>,<servlet-class>를 등록해야 합니다.
<servlet>
<servlet-name>서블릿클래스의 별칭</servlet-name>
<servlet-class>패키지명을 포함한 실제 서블릿 클래스의 경로</servlet-class>
</servlet>
실제 사용할 서블릿의 별칭을 등록하는 엘리먼트입니다.
ex) basic 패키지에 저장된 FirstServlet을 first라는 이름으로 등록하기 위해서는 다
음과 같이 작업합니다..
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>basic.FirstServlet</servlet-class>
</servlet>
2) <servlet-mapping>엘리먼트
<servlet-mapping>
<servlet-name>위에서 등록한 서블릿의 별칭</servlet-name>
<url-pattern>실제 서블릿을 요청할 요청 path</url-pattern>
</servlet-mapping>
등록한 서블릿을 어떻게 요청할지 정의하는 엘리먼트로 <url-pattern>은 반드시
/로 시작해야 합니다.
ex) first로 등록 서블릿을 /first.do로 요청하기 위해서 다음과 같이 작업합니다.
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first.do</url-pattern>
</servlet-mapping>
위에서 우리가 처음으로 작성한 서블릿을 등록해보도록 하겠습니다.
서블릿명은 "first"로 요청 path는 "/first.do"로 등록해보도록 하겠습니다. 먼저 web.xml을 오픈합니다.
다음과 같이 FirstServlet에 대한 요청 정보를 정의합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>serverWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>basic.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first.do</url-pattern>
</servlet-mapping>
</web-app>
서버가 start 될 때 서버가 인식하는 위치에 있는 모든 설정 파일을 읽어서 생성할 객체가 있으면 생성하고 실행할 내용이 있으면 실행합니다. 따라서 지금 변경한 xml 파일은 지금 서버가 인식하지 못합니다. xml이 변경되면 항상 서버를 restart 해야 합니다.
서버를 restart 한 후 앞에서 작성한 FirstServlet 파일을 선택하고 단축 메뉴를 나타냅니다.
[Run As]-[Run on Server]를 선택하여 실행합니다.
실행하면 아직 화면을 만드는 작업을 하지 않았기 때문에 백지상태의 화면이 응답되어 브라우저에는 아무것도 표시되지 않을 것입니다.
콘솔 탭을 확인해보면 우리가 sysout으로 출력한 문자열이 출력되어 있는 것을 확인할 수 있습니다.
'웹 > servlet&JSP' 카테고리의 다른 글
external web browser 설정 (0) | 2019.07.31 |
---|---|
프로젝트에 서블릿 JSP 라이브러리 등록하기 (0) | 2019.07.22 |
서블릿 디렉토리 (0) | 2019.07.18 |
서블릿의 개요 (0) | 2019.07.17 |