JSP/서블릿 흝어 보기

내장객채

​내장객체란?

JSP 파일이 자바소스 파일로 변환되면서 _jspService( ) 메소드 내에 자동으로 선언 및 초기화되는 변수들을 '내장 객체'라고 합니다. 그러므로 내장객체는 스크립트릿(<% %>), 표현식 (<%= %>) 태그에서 별도의 선언과 초기화 작업 없이 바로 사용할 수 있습니다.

개발자가 JSP파일로 작성하여 저장하면, JSP파일이 실행될 때 자바소스로 변환되고 이 자바 소스가 컴파일 되어 실행됩니다. 이 과정에서 JSP 파일이 자바 소스로 변한될 때 _jspService( ) 메소드가 반드시 삽입되며, JSP가 실행될 때마다 자동으로 호출되는데 _jspService( ) 메소드 안에 자동으로 생성되는 코드에 공통으로 삽입되는 코드가 있습니다. 바로 변수를 선언하고 초기화하는 부분입니다. 이 선언 및 초기화 되는 변수들이 JSP파일에서 사용되는 내장객체 입니다.

자바소스 파일로 변환된 jsp 파일의 소스코드를 보자

  public void _jspService(final javax.servlet.http.HttpServletRequest request, 
                          final javax.servlet.http.HttpServletResponse response)
          throws java.io.IOException, javax.servlet.ServletException {

     ....생략...

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
          		null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

     ....생략...

    }
  }

JSP에서 사용되는 내장객체는 아래와 같으며 대부분 서블릿에서와 동일하다.

  • request
    request 객체는 HttpServletRequest 타입의 요청정보 처리 객체이다.
  • response
    response 객체는 HttpServletResponse 타입의 응답정보처리 객체이다.
  • session
    session 객체는 은 HttpSession 타입의 내장객체이다. 클라이언트마다 하나씩 생성되어 클라이언트 단위로 정보를 유지하고자 할 때 사용된다. 대표적인 활용예로 로그인와 로그아웃 처리다.
  • application
    application 객체는 javax.servlet.ServletContext 타입의 내장객체이다. ServletContext는 웹 애플리케이션마다 하나씩, 서비스가 시작될 때 생성되는 객체로서, 서버에 대한 정보 추출과 웹 애플리케이션 단위로 상태정보를 유지하기 위해 사용한다.
  • pageContext
    pageContext 객체는 javax.servlet.jsp.PageContext 타입이다. 이는 서블릿에서는 보지 못했던 객체이다. 이 객체는 JSP 페이지마다 하나씩 생성된며 PageContext 객체의 메소드는 아래와 같다.
    반환형  메소드명  기능
    Exception getException( )  현재 발생된 Exception 객체를 반환한다
    Object getPage( )   현재 JSP 문서 정보 객체를 반환한다
    ServletRequest getRequest( )  현재 JSP 문서의 HttpServletRequest 객체를 반환
    ServletResponse getResponse( )  현재 JSP 문서의 HttpServletResponse 객체를 반환
    ServletConfig getServletConfig( )  현재 JSP 문서의 ServletConfig 객체를 반환
    ServletContext getServletContext( )  현재 JSP 문서의 ServletContext 객체를 반환
    HttpSession getSession( )  현재 JSP문서의 HttpSession 객체를 반환
    void include(String relativeUrlPath)  인자갑으로 지정된 페이지를 현재 JSP 문서에 포함한다.
    void foward(String relativeUrlPath) 인자값으로 지정된 페이지로 이동

    참고로 책 p354페이지에서 PageContext 객체의 getOut( ) 메소드를 이용해 출력하는 부분이 있는데 책에는 이와 관련된 설명이 없어 구글링을 하다 톰캣 4.1.x에서 지원하는 JSP 1.2와 달리 톰캣 7.0.x에서 지원하는 JSP 2.2에서 PageContext가 구현되는 방법이 다른 것을 확인했다. JSP 1.2에서 지원하는 PageContext의 일부 메소드들이 JSP 2.2에서는 JspContext에서 구현되어 있고 PageContext가 이를 상속받아 구현하도록 되어있다. 결과적으로 버전차이에도 JSP 1.2의 PageContext에서 구현되었던 메소드들을 그대로 사용할 수 있다.
    (※ JSP 2.2에서 왜 둘로 나뉘어졌을까?? 아시는 분 댓글 부탁드려요!!) 
  • out
    out은 javax.servlet.jsp.JspWriter 타입이며, 웹브라우저(클라이언트)로 출력하는 기능을 가졌다. 서블릿에서 다뤄왔던 PrintWriter 객체와 비슷하다.

댓글

댓글 본문