
JSP와 Servlet(서블렛)은 모두 웹 어플리케이션을 만들기 위한 도구이다. JSP와 Servlet은 역할의 차이만 있고 기능적 차이는 거의 없다.
클라이언트가 서버를 통해 html 문서를 요청하면 servlet은 아래와 같이 IO 입출력으로 html 코드를 전부 print 해주어야한다.
response.setContentType("text/html;")
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<head>");
writer.println("</head>");
writer.println("<body>");
writer.println("Hello");
writer.println("</body>");
writer.println("</html>");
writer.close();
이러한 방식은 레이아웃이 조금만 복잡해져도 코드가 매우 길어지고 가독성 또한 좋지 않아진다. 이러한 단점을 보완하기 위해 JSP가 나왔다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 자바 코드 --%>
<%
for(int i = 0; i < 10; i++) {
out.println(i);
}
%>
</body>
</html>
위와 같이 JSP는 기본적으로 HTML 형식을 하며, 필요한 부분에 자바 코드를 삽입해 페이지를 구성하기 위한 로직을 작성할 수 있다. 클라이언트로부터 요청을 받으면 JSP는 Servlet으로 변환하여 반환된다. 이러한 이유로 당연하게, 처음 실행 시 변환 과정이 Servlet에 비해 한 번 더 있으므로 서블릿보다 느리다. 그러나 첫 실행 시 class 파일을 생성해두고 실행하면 컴파일 과정이 없기 때문에 서블릿과 거의 동일하게 실행된다.

class파일이 존재한다면 Servlet과 거의 동일하게 실행되며 자바 언어를 이용해 손쉽게 페이지 구성과 로직을 짤 수 있다. 하지만, JSP만 사용한다면, 화면 로직(View)과 비즈니스 로직(Controller)이 한 공간에서 작성되어 협업이 매우 어려워진다. 또한, JSP 코드가 복잡해져 유지 보수가 어려워진다.
위와 같은 특징으로 일반적으로 Servlet과 JSP를 같이 사용하는 MVC Model을 많이 이용한다. 위의 이미지를 보면 화면(View)은 JSP, 비즈니스 로직(Controller)은 Servlet이 담당한다.
서블릿 클래스에서 처리되는 요청과 응답은 서블릿 컨테이너에서 다음과 같은 생명주기를 거치게 된다.