applicationServlet 实际上如何管理上下文变量



applicationServlet 实际上是如何管理上下文变量的?如果我在应用程序上下文级别设置变量,无论它存储在方法区域还是堆栈区域或堆中,如果是这样,它如何存储以及如何访问?

在这里,我创建了局部变量作为 MAP,并将一些值放在应用程序上下文级别。

我在下面写了一些示例代码。

    public class ContextLoaderListener implements ServletContextListener {
    private ServletContext ctx;
    private WebApplicationContext springContext;
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    Map<String, String> resourceMap=new HashMap<>();
    resourceMap.put("1","abc1");
    resourceMap.put("2","abc2");
    resourceMap.put("3","abc3");
    sce.getServletContext().setAttribute("resourceMap", resourceMap);
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) { }
    }

我将在这里回答您的评论,我认为它也回答了您的问题。

您在评论中的问题如下:

资源映射是这种部分方法的本地映射。 完成后 此方法的执行 资源映射局部变量将 摧毁。如果是这样,那么资源映射上下文变量如何引用本地 变量资源映射 ?

井资源图只是一个本地参考。堆中的对象本身。你是对的,资源映射在方法执行完成后丢失。但是,您将引用的副本传递给另一个寿命更长的对象。请参阅以下示例:

class TestClass {
    public static void main(String[] args) {
        final ServletContext servletContext = new ServletContext();
        final ServletContextEvent servletContextEvent = new ServletContextEvent(servletContext);
        final ServletContextListener servletContextListener = new ServletContextListener();
        servletContextListener.contextInitialized(servletContextEvent);
        final Object resourceMap = servletContext.getMap().get("resourceMap");
        // See, resourceMap is still accesiable. Because it still has an alive reference to it from ServletContext!
        System.out.println(resourceMap);
        // Output will be:
        // {1=abc1}
    }
}
class ServletContext {
    final Map<String, Object> map = new HashMap<String, Object>();
    public void setAttribute(String resourceMap, Map<String, String> value) {
        this.map.put(resourceMap, value);
    }
    public Map<String, Object> getMap() {
        return map;
    }
}
class ServletContextEvent {
    private final ServletContext servletContext;
    public ServletContextEvent(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
    public ServletContext getServletContext() {
        return servletContext;
    }
}
class ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        Map<String, String> resourceMap = new HashMap<String, String>();
        resourceMap.put("1", "abc1");
        sce.getServletContext().setAttribute("resourceMap", resourceMap);
    }
}

这回答了你的问题吗?

最新更新