본문 바로가기
Programming/> Java

[java] Servlet & JSP 정리

by 니키ᕕ( ᐛ )ᕗ 2015. 8. 16.

1. Servlet 


- 자바플랫폼에서 웹 어플리케이션(클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는)을 개발하기 위해 만든 표준 API, 웹 프로그래밍 기술
- 자바코드를 HTML로 변환해주는 기술
- 웹 어플리케이션의 확장이 용이하고 플랫폼에 독립적인 개발 가능
- 컨텐츠와 비즈니스 로직을 분리
- WAS 를 통해 컴파일 된 후 메모리에 적재되어 클라이언트의 HTTP Get, Post 등의요청을 처리하는 자바 프로그램
          - 초기화된 서블릿이 클라이언트의 요청이 있을 때 마다 Thread를 생성해서 병렬적으로 service를 수행한다는 것. 서블릿 객체는 여러개 생성되지 않음

2. Servlet 장점

- 스레드를 기반으로 효율적인 웹 어플리케이션 운영이 가능
- 자바 기반이므로 모든 자바 API 사용 가능
- 자바가 운영체제나 하드웨어에 영향을 받지 않으므로 다양한 서버 환경에서 실행 가능
- 컨텐츠와 비즈니스 로직이 분리
- 컨트롤러와 뷰 역할 분담으로 원활한 작업 가능

3. Servlet Container

- 대표적인 것이 Apache Tomcat
- 서블릿을 서버에서 실행하기 위한 서버 프로그램으로 웹 서버는 서블릿 자체를 실행하지 못하므로 JVM을 내장한 컨테이너라는 서블릿 실행환경이 필요
- 서블릿의 생명주기를 관리하고 Resquest에 따른 스레드를 생성
- 클라이언트의 Request를 받아들이고 Response를 보낼 수 있도록 웹 서버와 소켓을 만들어서 통신

1) 통신(Communication) 지원
- 서블릿과 웹서버가 통신할 수 있는 방법 제공
- ServerSocket 생성, 포트 리스닝, 스트림 생성 등의 통신 기능을 API로 제공

2) 생명주기(Lifecycle) 관리
- 서블릿 클래스를 메모리에 로딩하여 인스턴스화, 초기화 메서드 호출, 요청에 따른 서블릿 메소드 호출 작업
- 가비지 컬렉션 진행

3) 멀티스레딩 관리
- 서블릿 컨테이너는 서블릿 요청이 들어오면 스레드를 생성
- 클라이언트 요청에 따른 HTTP 서비스 메소드 작업을 수행하면 스레드가 죽음
- 스레드의 안정성에 대해선 서버가 다중 요청에 대해 스레드 생성 및 운영을 책임

4) 선언적인 보안관리
- 컨테이너를 사용하면 보안관리는 XML 배포 서술자에 기록만 하면 됨
- 보안에 관련된 내용을 서블릿 또는 자바클래스 코드 안에 하드코딩 할 필요가 없음

5) JSP 지원



3. Servlet 구조


     1) 생명주기




- 여러 요청이 한꺼번에 들어와도 스레드를 생성하여 Service를 호출하기 때문에 처리속도가 빠름




        2) 동작과정

i) 클라이언트에서 서버로 HTTP 요청



ii) 서블릿 컨테이너가 URL분석 후, 서블릿인지를 확인하여 HttpServletRequest, HttpServletResponse 객체를 생성




iii) 메모리 확인 후 서블릿에서 작업을 수행하기 위해 스레드를 생성



iv) 컨테이너에서 생성한 HttpServlert객체를 서블릿에서 생성된 스레드로 넘김




v) 서블릿이 Servlet service를 호출하고 HTTP 호출방식(get/post)에 따라 doGet/doPost 메소드를 호출
     해당 메소드는 동적으로 HTML 페이지를 생성하여 Response 객체에 넣음




vi) 호출작업이 끝나면 서블릿에서 생성한 스레드는 생명주기가 다하여 삭제되고 
     클라이언트에서 요청되어 생성된 페이지가 HttpServlertResponse에 담겨 컨테이너로 다시 전달




vii) 컨테이너가 요청한 클라이언트로 HTML페이지를 HTTP로 응답함. 이후 컨테이너가 생성했던 HttpServlertRequest와 HttpServlertResponse는 메모리에서 제거됨


3) Servlet 구조 


- 비지니스 영역(클래스)과 프레젠테이션 영역(HTML)이 구분되지 않음
- 요청 URL패턴 : /servlet/서블릿 클래스명, servlet은 가상 Path이고 물리적으로는 /WEB-INF/classes


4. Servlet 기본 샘플 코드

public class HelloServlet extends HttpServlet {

     public void doGet(HttpServletRequest req,HttpServletResponse res)

               throws ServletException,IOException {

          res.setContentType("text/html;charset=UTF-8");          // 응답방식 결정

          PrintWriter out = res.getWriter();                               // 출력 통로 결정. Response 객체가 가지고 있음

         

          out.println("<HTML>");

          out.println("<BODY>");

          out.println("Hello World!!");

          out.println("</BODY>");

          out.println("</HTML>");

          out.close();
     }
}

- 이런식으로 서블릿은 자바 파일로 HTML파일을 동적으로 생성
- 생성 방식/규칙이 복잡하기 때문에 HTML위에 자바코드를 삽입하는 방식인 JSP가 나옴


5. JSP 

- JavaServer Pages, 동적인 웹 컨텐츠를 생성하기 위한 자바기반의 스크립트 언어
- HTML Tag사이에 포함되는 자바코드로 웹디자이너가 자바를 모르더라도 접근이 가능하도록 만들어진 스크립트 언어
- Servlet을 기본바탕으로 하고 있음
- ASP처럼 쉽고 빠르게 웹 응용프로그램을 만들수있게 해주는 기술
- 소프트웨어를 재사용할수있는 컴포넌트 모델을 지원( JavaBeans)

1) JSP 구성요소

i) 디렉티브(Directive)

<%@ 디렉티브이름 속성1="값1" 속성2="값2" ... %>

JSP가 제공하는 디렉티브

- page : JSP페이지에 대한 정보를 지정. JSP가 생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지등
            JSP페이 지에서 필요로하는 정보를 입력
- taglib : JSP 페이지에서 사용할 태그 라이브러리를 지정
- include : JSP 페이지의 특정 영역에 다른 문서를 포함 시킴

ii) 스크립트 요소

표현식(Expression) : <%= ... %> , 값으 출력
스크립트릿(Scriptlet) : <% ... %> , 자바 코드를 실행
선언부(Declaration) : <%! ... %> , 자바 메서드(함수) 정의 및 전역변수 선언

iii) 표현언어(Expression Language; EL)
JSP페이지 내부에서 사용되는 간단한 스크립트 언어, JSP2.0부터 추가, 스크립트릿과 표현식 대신에 쉽고 간단하게 사용 가능

iv) 기본 객체 (Implicit Object)
request, response, session, application, page 등....

v) 정적인 데이터 (HTML, CSS.. 등)

vi) 표준 액션 택그 (Action Tag)
액션 태그는 JSP페이지 내에서 많이 사용하는 기능을 XML 기반의 태그로 제공하는것
<jsp:액션태그이름>

[참고] 디렉티브 및 스크립트 요소를 다음과 같이 액션태그를 이용해서 사용
<jsp:expression> : 표현식, <%= %>
<jsp:declaration> : 선언부 <%! %>
<jsp:scriptlet> : 스크립트릿, <% %>
<jsp:directive.page> : 페이지 지시자, <%@ %>

vii) 커스텀 태그(Custom Tag)와 표준 태그 라이브러리(JSTL)
커스텀 태그는 JSP를 확장시켜주는 기능, xml 기반
JSTL(JaverServer Pages Standard Tag Library) 는 커스텀 태그 중에서 자주 사용되는 것들을 별도로 표준화한 태그 라이브러리임

2) JSP 동작 



i) client 요청이 웹서버에 전달되고 웹서버는 JSP요청이 들어온것을 확인
ii) 바로 웹컨테이너인 JSP 엔진에게로 요청을 넘김
iii) JSP엔진은 요청한 JSP페이지에 해당하는 Servlet이 있는지 확인하고, 없다면
iv) Servlet코드를 생성
v) 자바 컴파일러에 의해 컴파일 과정을 거쳐 Servlet class가 만들어짐
vi) 웹 컨테이너는 메모리에 클래스 로딩 즉, 객체 생성과정을 거치고 내부적으로 callback 메소드가 수행되며 필요하다면 JavaBeans클래스도 메모리에 올려 사용vii) callback 메소드인 서비스 메소드가 완료되면 웹 컨테이너는 결과값을 웹 서버에게 넘김
viii) 웹서버는 웹 Client에게 응답을 주고 나면 이 연결은 끊어짐

- JSP파일은 웹컨테이너에서 .java형태로 코드 변환 -> 컴파일 -> 메모리 로드 -> 서비스

- JSP에 해당하는 서블릿이 존재하지 않을 경우 JSP페이지를 컴파일하여 서블릿을 생성후, 생성된 서블릿을 사용하여 클라이언트의 요청을 처리
- JSP에 해당하는 서블릿이 존재하는 경우, 곧바로 서블릿을 사용하여 클라이언트의 요청을 처리

- JSP페이지를 요청할때에는 JSP를 직접 실행하는 것이 아니라 JSP를 자바소스코드로 변환한뒤 컴파일해서 생성된 서블릿을 실행하는것이다.
- JSP페이지를 자바코드로 변경하는 단계를 변환(translation) 단계" 라고함
- 자바코드를 서블릿 클래스로 변경하는 단계를 "컴파일(compile) 단계" 라고함.

- 웹서버는 JVM의 존재를 모르므로 JSP요청을 즉각적으로 처리하지 못함.


'Programming > > Java' 카테고리의 다른 글

[Java] Comparable, Comparator  (0) 2017.10.04
[Java] java.lang.UnsatisfiedLinkError Exception  (0) 2015.10.30
[Java] 콘솔 소켓 채팅 프로그램  (0) 2015.10.19
[java] jdk 환경변수 설정  (0) 2014.07.20

댓글