2014-01-05 4 views
-1

서블릿에서 변경할 때마다 원자 카운터를 인쇄해야하는 코드가 있습니다. 하지만 내 코드가 작동하지 않았다. 나는 그 문제가 뭔지 알 수 없다. 리스너에서 카운터의 새로운 가치를 인쇄해야합니다. 어떻게 인쇄 할 수 있습니까?ServletContextAttributeListener.attributeReplaced() 메서드가 작동하지 않습니다.

@WebServlet (description = "StartServlet", urlPatterns = {"/*"}) 
    public class StartController extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
       ((AtomicInteger) getServletContext(). 
         getAttribute("ctr")). 
         incrementAndGet(); 
    } 
} 

@WebListener 
public class ContextAttributeListenerImpl implements ServletContextAttributeListener { 

    @Override 
    public void attributeReplaced(ServletContextAttributeEvent event) { 
     AtomicInteger c = (AtomicInteger) event. 
       getServletContext(). 
       getAttribute("ctr"); 

     System.out.println(c); // all magic must be here 
    } 

    @Override 
    public void attributeRemoved(ServletContextAttributeEvent event) {/*NOP*/} 

    @Override 
    public void attributeAdded(ServletContextAttributeEvent event) {/*NOP*/} 
} 

@WebListener 
public class ContextCreationListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 

     AtomicInteger counter = new AtomicInteger(0); 
     event.getServletContext().setAttribute("ctr", counter); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) {/*NOP*/} 
} 
+0

ContextCreationListener가 작동합니까? (contextInitialized에 로그인하면 올바르게 로그합니까?) –

답변

0

속성의 값은 변경되지 - 그것은 문맥의 수명 전반에 걸쳐 동일한 도면이다. 카운터를 증가 시키면 속성 값이 변경되지 않습니다 ... 속성 값이 참조하는 객체 내의 데이터를 변경하는 것입니다.

이제 대신 AtomicInteger의 서블릿 컨텍스트에 Integer를 저장할 수 있으며, 단지 자성 (증가 후 적절하게 setAttribute를 호출하는) 당신을위한 것 그 일을 유지하기 위해 동기화를 사용할 수 있습니까?

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    ServletContext context = getServletContext(); 
    synchronized (context) { // Or choose something else... 
     Integer count = (Integer) context.getAttribute("ctr"); 
     context.setAttribute("ctr", count + 1); 
    } 
} 
+0

Integer를 사용하더라도 작동하지 않습니다. doGet 메서드에서는 컨텍스트에서 가변 값을 증가 시키지만 attributeReplaced 메서드는 값을 보지 못합니다. – user3163426

+0

@ user3163426 : 그게 무슨 뜻인지 잘 모르겠습니다. –

+0

감사합니다. 당신의 해결책은 좋습니다. – user3163426

관련 문제