我有一个代码,每当我在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*/}
}
答案 0 :(得分:0)
属性的值不是更改 - 它在整个上下文的生命周期中都是相同的引用。当你递增计数器时,它不会改变属性的值......它只是改变属性值所引用的对象中的数据。
现在你可以在servlet上下文中存储Integer
而不是AtomicInteger
,只需使用同步来保持原子性......(调用{{1}在递增后适当地适合你吗?
setAttribute