서블릿 자체는 자바로 구현하지만 서블릿 컨테이너에 해당 클래스가 서블릿임을 알려야 하며 어떤 URL에서 실행해야 하는지 등록하는 과정이 필요하다.
서블릿 클래스는 javax.servlet.Servlet
인터페이스를 구현한 추상 클래스인 GenericServlet 클래스와 HttpServlet 클래스 중 하나를 상속해 구현하는 형태이다.
웹 프로그래밍의 대부분은 HTTP 프로토콜에 최적화되어 있는 HttpServlet 클래스를 상속해 구현하는 것이 좋다.
// HttpServlet 클래스 상속
public Class MyServlet extends HttpServlet {
// Get 방식
public doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Get 방식 요청 시 처리할 내용
}
// Post 방식
public doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Post 방식 요청 시 처리할 내용
}
}
doGet(), doPost() 메서드에서 파라메터로 사용되는 request, response는 서블릿 컨테이너가 클라이언트 요청과 응답을 처리할 수 있도록 서블릿에 제공하는 객체로 클라이언트와 상호작용에 필요한 다양한 메서드를 제공한다.
request와 response는 session, application과 함께 JSP의 내장객체이기도 하며 속성 관리 기능을 이용해 컨트롤러와 뷰 페이지 간 데이터 전달 등의 목적에도 사용된다.
HttpServletRequest 클래스는 HTTP 프로토콜의 request 정보를 서블릿에 전달하기 위한 목적으로 사용한다. 헤더 정보, 파라메터, 쿠키, URL, URI 등의 정보를 읽어드리는 메서드와 HTTP Body의 Stream을 읽어들이는 메서드를 가지고 있다.
서블릿 컨테이너에서 생성되고 클라이언트 요청이 doGet(), doPost()로 전달될 때 파라메터로 함께 전달되며 서블릿에서 클라이언트와 연결되어 처리할 작업은 모두 HttpServletRequest를 통해야 한다.
HttpServletRequest와 마찬가지로 클라이언트와 연결된 처리가 가능하며 서버에서 클라이언트로 전달하려는 목적을 위한 기능으로 구성된다. 서블릿 컨테이너는 요청 클라이언트에 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에 전달한다.
서블릿은 해당 객체를 이용하여 content type, 응답 코드, 응답 메시지 등을 전송할 수 있다.
서블릿 클래스 자체만으로는 톰캣에서 실행이 불가능하므로 web.xml 이나 어노테이션으로 서블릿임을 선언해야 한다.
아래 내용은 web.xml의 작성 예시이며 지금은 거의 사용하지 않는다.
<?xml version="1.0" encoding="UTF-8">
<web-app ...>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>package.servle.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
서블릿 3.0 부터는 자바 어노테이션을 사용하여 다음과 같이 등록한다.
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
...
}
}
urlPatterns란 어떤 클라이언트 요청에 해당 서블릿을 실행할지 지정하는 것으로 여러 URL을 등록할 수 있다. 패턴 형식으로 특정한 경우에 실행되도록 설정하는 것도 가능하다.