2012-03-06 6 views
4

jsp PageContext 객체는 http 요청 - 응답주기의 일부로 생성 및 삭제되거나 요청간에 캐시되고 다시 사용됩니다.jsp PageContext 객체의 수명주기는 무엇입니까? threadsafe입니까?

PageContext에는 요청 간의 재사용을 제안하는 라이프 사이클 메소드가 있습니다. ie initialize(), release().

재사용하는 경우 심각한 동시성 문제가 발생할 수 있습니다. 두 개의 http 요청이 도착하고 동일한 JSP 페이지를 요청하고 각 요청이 자체 스레드에 의해 처리되지만 공유 PageContext 객체에 속성을 설정하면 각 다른 사람들의 콘텐츠.

도움을 주시면 감사하겠습니다. 그런데 Apache Sling에 포함 된 서블릿 컨테이너를 사용하고 있습니다.

답변

4

PageContext는 JSP 페이지에서만 사용할 수 있습니다. 요청이 서블릿에 의해 처음 처리되고 RequestDispatcher.forward를 사용하여 JSP 페이지로 전달 된 경우 pageContext는이 JSP 페이지에서만 사용할 수 있지만 서블릿에서 액세스 할 수는 없습니다 (pageContext가 아직 없기 때문에). 그 시간에).

JSP 페이지 관점에서, 호출 될 때마다 새로운 pageContext를 얻고 있습니다. 페이지 컨텍스트는 내부적으로 풀링되지만 동시에 여러 JSP 페이지에서 공유되지 않을 수 있습니다.

initializerelease 메서드에는 "이 방법은 페이지 또는 태그 라이브러리 작성자가 사용할 수 없습니다."라는 주석이 있습니다. 그냥 잊어 버려.

+0

알아두면 좋지만, 왜 PageContext에는 수명주기 메소드가 있습니까? – murungu

+0

@murungu : 컨테이너는 페이지 컨텍스트 개체 풀을 사용할 수 있습니다. 이 메소드는 페이지 컨텍스트 사용의 시작과 끝을 나타 내기 위해 컨테이너에 의해 호출됩니다. 페이지 컨텍스트는 필요한 초기화 또는 정리를 수행해야합니다. 이러한 메소드는 JSP 페이지 작성자가 호출하지 않아도됩니다. –

3

Peter is correct.PageContext은 페이지 처리 범위로 제공됩니다. 소비자는이 범위 밖에서 이러한 인스턴스에 대한 참조를 유지하면 안됩니다. 이는 암시 적으로 현재 스레드 외부에서 인스턴스에 액세스 할 수 없어야 함을 의미합니다. JSP 2.2 specification에서

예 JSP 처리 코드는 다음 PageContext 인스턴스 (또는 풀에서 인스턴스 생성) 프로비저닝 방법

public class foo implements Servlet { 
// ... 
public void _jspService(HttpServletRequest request, HttpServletResponse response) 
       throws IOException, ServletException { 
    JspFactory factory = JspFactory.getDefaultFactory(); 
    PageContext pageContext = factory.getPageContext(
     this, 
     request, 
     response, 
     null, // errorPageURL 
     false, // needsSession 
     JspWriter.DEFAULT_BUFFER, 
     true // autoFlush 
    ); 
    // initialize implicit variables for scripting env ... 
    HttpSession session = pageContext.getSession(); 
    JspWriter out = pageContext.getOut(); 
    Object page = this; 
    try { 
    // body of translated JSP here ... 
    } catch (Exception e) { 
    out.clear(); 
    pageContext.handlePageException(e); 
    } finally { 
    out.close(); 
    factory.releasePageContext(pageContext); 
    } 
} 

컨테이너의 구현 세부 사항이다.