ServletContextAttributeListener.attributeReplaced()方法不起作用

时间:2014-01-05 20:41:58

标签: java servlets listener

我有一个代码,每当我在servlet中更改它时,它必须打印我的原子计数器。但我的代码不起作用。我无法弄清楚问题是什么。我需要在监听器中打印一个新的计数器值。有什么建议我怎么打印出来?

    @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*/}
}

1 个答案:

答案 0 :(得分:0)

属性的值不是更改 - 它在整个上下文的生命周期中都是相同的引用。当你递增计数器时,它不会改变属性的值......它只是改变属性值所引用的对象中的数据。

现在你可以在servlet上下文中存储Integer而不是AtomicInteger,只需使用同步来保持原子性......(调用{{1}在递增后适当地适合你吗?

setAttribute