본문 바로가기

StackOverflow

[JSP]JSF, Servlet, JSP의 차이점이 무엇인가요?

http://stackoverflow.com/questions/2095397/what-is-the-difference-between-jsf-servlet-and-jsp


Q: JSF, Servlet, JSP의 차이점이 무엇인가요?


(질문자: Cheung Tat Ming )


A: 

JSP (JavaServer Pages)

JSP는 Java View 기술로서, 특정 양식(클라이언트 사이드 언어, 즉 HTML, CSS, JavaScript 등)의 텍스트를 출력하는 역할을 하는, 서버에서 동작하는 기술입니다.

JSP는 taglibs를 지원하는데, 이것은 페이지 흐름이나 출력을 동적으로 제어할 수 있는 자바코드입니다. 잘 알려진 tablibs에는 JSTL이 있습니다. JSP는  Expression Language도 지원하는데, 이것은 백엔드 데이터 (페이지 내에서 유효한 변수, request, 어플리케이션 스코프에서의 세션)을 이용할 수 있게 해주며, 주로 taglibs와 혼합되어 이용됩니다.

JSP가 처음 실행되는 경우이거나, 웹앱이 시작될 때, 서블릿 컨테이너가 JSP파일을 HttpServlet을 상속받는 클래스로 변환해 주고, 웹앱이 동작하는 동안 계속 이용합니다. 서버의 작업 디렉토리에서 컴파일 된 결과 파일을 볼 수 있습니다. 예를 들어 Tomcat 서버에서, /work 디렉토리를 보면 컴파일 결과파일을 확인할 수 있습니다. JSP request에서, 서블릿 컨테이너가 컴파일 된 JSP클래스를 실행하며 생성된 결과물 (일반적으로는 단순한 HTML/CSS/JS)을 서버에서 클라이언트로로 전송하며, 클라이언트 웹 브라우저에서 화면으로 출력됩니다.


Servlets

서블릿은 Java application programming interface (API)이며 서버에서 동작하는데, 클라이언트에서 요청한 request를 가로챈 뒤, response를 만들고 다시 클라이언트로 반환합니다. 잘 알려진 예로는 HttpServlet이 있는데, GET과 POST같은  HTTP methods를 이용하는 HTTP 요청을 가로채는 메소드를 제공합니다. 당신은 특정 URL 패턴에 대해 동작하도록 HttpServlet을 설정할 수 있는데, web.xml파일이나  Java EE 6에서는 @WebServlet어노테이션을 이용하여 설정할 수 있습니다.

서블릿이 처음으로 요청을 받거나 웹앱이 처음 시작할 때, 서블릿 컨테이너는 자신의 인스턴스를 하나 생성하며, 웹 앱이 실행되는 동안 이것을 메모리에 유지합니다. 동일한 URL 요청에 대해, 동일한 인스턴스가 다시 재사용되는 방식으로 실행됩니다. request 데이터는 HttpServletRequest 으로 처리하고, response는 HttpServletResponse으로 처리할 수 있습니다. HttpServlet의 메소드가 오버라이드 된 메소드 내에서, 앞에서 언급한 두 오브젝트를 이용할 수 있는데, 예를 들면 doGet()이나 doPost()에서 쓸 수 있습니다.


JSF (JavaServer Faces)

JSF는 Servlet API 위에서 구현된 component based MVC framework인데, taglibs를 통해 components 를 제공하고, 이것은 다시 JSP 또는 다른 Java를 이용하는 기술에서 이용될 수 있는데, 예를 들면 Facelets같은 것이 있습니다. Facelets는 JSP보다는 JSF에 훨씬 적합합니다. 이 기술은 composite components등의 templating capabilities을 명시적으로 지원하는데 반해, JSP는 단순히<jsp:include>만을 템플릿으로 제공하고, 만약 계속 반복되는 컴포넌트 그룹을 하나의 컴포넌트로 대체하고 싶다면 JSP에서는 기나긴 자바코드를 작성해야 합니다. (이 작업은 JSF에서는 불투명하고 오랜 시간이 걸리는 작업입니다) JSF 2.0부터는, JSP는 Facelets 에서는 더 이상 이용하지 말 것이 권고되고 있습니다.

MVC (Model-View-Controller) 프레임워크로서, JSF는 FacesServlet을 유일한 request-response 컨트롤러로 제공합니다. 이를 통해 모든 표준, 그리고 느린 HTTP request / response 작업을 직접 할 필요가 없게 되었는데, 예를 들면 이용자 입력을 받는 부분, 그것을 검증하고 변환하는 부분, 그것을 모델 오브젝트에 넣고, 액션을 시작하고, response를 렌더링하는 작업 등입니다. 이 방법으로 당신은 JSP나 Facelet (XHTML) 페이지를 View로 이용하고, Javabean 클래스를 Model로 이용할 수 있습니다. JSF 컴포넌트는 view를 model에 할당할 때 이용되며 (ASP.NET 웹 컨트롤 처럼) FacesServlet은 JSF 컴포넌트 트리를 다른 모든 작업을 수행할 때 이용합니다.

연관된 질문:

(답변자: BalusC)


_


How are JSP and Servlet related to each other? Is JSP some kind of Servlet? How are JSP and JSF related to each other? Is JSF some kind of prebuild UI based JSP like ASP.NET-MVC?

shareeditflag

_

813down voteaccepted

JSP (JavaServer Pages)

JSP is a Java view technology running on the server machine which allows you to write template text in (the client side languages like HTML, CSS, JavaScript and so on). JSP supports taglibs, which are backed by pieces of Java code that let you control the page flow or output dynamically. A well known taglib is JSTL. JSP also supports Expression Language, which can be used to access backend data (via attributes available in page, request, session and application scopes), mostly in combination with taglibs.

When a JSP is requested for the first time or when the webapp starts up, the servlet container will compile it into a class extending HttpServlet and use it during the webapp's lifetime. You can find the generated source code in the server's work directory. In for example Tomcat, it's the /workdirectory. On a JSP request, the servlet container will execute the compiled JSP class and send the generated output (usually just HTML/CSS/JS) through the webserver over network to the client side, which in turn displays it in the web browser.

Servlets

Servlet is an Java application programming interface (API) running on the server machine, which intercepts requests made by the client and generates/sends a response. A well known example is theHttpServlet which provides methods to hook on HTTP requests using the popular HTTP methodssuch as GET and POST. You can configure HttpServlets to listen on a certain HTTP URL pattern, which is configurable in web.xml, or more recently with Java EE 6, with @WebServlet annotation.

When a Servlet is first requested or during webapp startup, the servlet container will create an instance of it and keep it in memory during the webapp's lifetime. The same instance will be reused for every incoming request whose URL matches the servlet's URL pattern. You can access the request data by HttpServletRequest and handle the response by HttpServletResponse. Both objects are available as method arguments inside any of the overridden methods of HttpServlet, such as doGet() and doPost().

JSF (JavaServer Faces)

JSF is a component based MVC framework which is built on top of the Servlet API, and providescomponents via taglibs which can be used in JSP or any other Java based view technology such asFacelets. Facelets is much more suited to JSF than JSP. It namely provides great templating capabilities such as composite components, while JSP basically only offers the <jsp:include> for templating, so that you're forced to create custom components with raw Java code (which is a bit opaque and a lot of tedious work in JSF) when you want to replace a repeated group of components with a single component. Since JSF 2.0, JSP has been deprecated as view technology in favor of Facelets.

As being a MVC (Model-View-Controller) framework, JSF provides the FacesServlet as the sole request-response Controller. It takes all the standard and tedious HTTP request/response work from your hands, such as gathering user input, validating/converting them, putting them in model objects, invoking actions and rendering the response. This way you end up with basically a JSP or Facelets (XHTML) page for View and a Javabean class as Model. The JSF components are been used to bind the view with the model (such as your ASP.NET web control does) and the FacesServlet uses theJSF component tree to do all the work.

Related questions

shareeditflag