2012-07-17 2 views
0

HttpServlet 클래스를 확장하는 클래스가 있습니다. 나는 자바가 다중 쓰레드이고 다른 쓰레드 (읽기 : HTTP 요청)가 같은 인스턴스를 사용할 수 있다는 것을 알고있다. 첫 번째 요청에서 Object를 인스턴스화하고 세션이 끝날 때까지 Object를 사용하려고합니다.HttpServlet을 확장 한 클래스에서 객체를 인스턴스화하는 방법은 무엇입니까?

어떻게해야합니까?

예 : 첫 번째 요청에서 파일을 열고 세션이 끝날 때 닫습니다.

+0

세션을 말할 때 사용자의 http 세션이 사이트를 방문했는지 또는 서블릿에 대한 단일 요청을 의미합니까? –

+0

내가 세션을 말할 때 나는 내 사이트를 방문하는 사용자의 HTTP 세션을 의미한다. – user1521526

답변

3

서블릿 중 하나에서 직접 인스턴스화하거나 doXxx() 방법은

SomeObject someObject = (SomeObject) request.getSession().getAttribute("someObject"); 

if (someObject == null) { 
    someObject = new SomeObject(); 
    request.getSession().setAttribute("someObject", someObject); 
} 

// Use someObject. 

또는 당신이 HttpSessionListener

@WebListener 
public class SomeObjectInitializer implements HttpSessionListener { 

    @Override 
    public void sessionCreated(HttpSessionEvent event) { 
     event.getSession().setAttribute("someObject", new SomeObject()); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
     // NOOP. 
    } 

} 

어느 방법으로 직접 인스턴스화 할 수는 SomeObject 자체가 imple 수있는 세션에서 그것의 존재에 따라 (HttpSessionBindingListener) 세션에 바인드 및 바인딩 해제 중 일부 논리를 수행 할 수 있습니다.

public class SomeObject implements HttpSessionBindingListener { 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     // Perform job during adding to the session. 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     // Perform job during removal from the session. 
    } 

} 
+0

Balusc 나는 doGet() 메소드에서 인스턴스를 만들려고했지만 request.getSession(). setAttribute ("x", x) 메소드를 사용하여 Object를 저장하는 것으로 보입니다. NULL – user1521526

+0

그런 다음 세션이 제대로 유지되지 않습니다 (웹 브라우저의 개발자 툴셋을 사용하여 'JSESSIONID'쿠키를 추적합니다). 또는 잘못된 속성 이름 (대소 문자를 구별합니다!)을 사용했거나 실제로 null을 넣었습니다. – BalusC

+0

확인했는데 세션이 제대로 유지 관리되지 않는 것 같습니다. 세션을 어떻게 유지할 수 있는지 알고 있습니까? "request.getSession(). setMaxInactiveInterval (30 * 60)"을 시도했지만 작동하지 않습니다. – user1521526

2

첫 번째 요청에서 Object를 인스턴스화하고 세션이 끝날 때까지 사용하고 싶습니다.

글쎄, 서블릿이 아닌 세션에 넣는 것이 좋습니다.

Java 서블릿의 세션 사용에 대한 자세한 내용은 this tutorial을 참조하십시오. 여러 대의 서버로 수평 확장하려는 경우 세심한 영향을주의 깊게 생각해야합니다. (데이터베이스에 세션 정보를 유지하거나 동일한 세션에 대한 모든 요청을 동일한 시스템에 보내도록로드 밸런서를 구성하려고 시도 할 수 있습니다.)

관련 문제