gpt4 book ai didi

java - ServletContext 变量对其他 servlet 不可见

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:41 24 4
gpt4 key购买 nike

假设我有两个 servlet,A 和 B。在 Servlet A 中,我创建一个 HashMap 并存储到 init() 中的 Servlet 上下文中,如下所示:

ServletContext context = getServletContext();
context.setAttribute("otable", someObject);

现在,在 Servlet B 的 init() 中,我正在初始化对 servlet 上下文对象的本地引用(我通过 web.xml 指定首先创建 servlet 上下文对象的 servlet 首先启动):

// get and set reference to object cache
oc = (ObjectCache)getServletContext().getAttribute("otable");

然后我插入,大小变为 1。当再次调用 Servlet A 并检查 servlet 上下文 HashMap 时,大小仍然为 0。

存储对 servlet 上下文对象的本地引用是一个坏主意吗?我还尝试直接从 servlet 上下文获取对象,但得到了相同的结果。我在这里缺少什么?

创建共享对象的 servlet 首先在我的 web.xml 中启动,内容如下:

<servlet>
<servlet-name>ServletA</servlet-name>
<servlet-class>package.ServletA</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

最佳答案

在 ServletContext 中存储跨 Servlet 又名应用程序范围的对象的想法是完全可行的。我重新测试了你的方法,效果非常好。您一定错过了代码中忘记发布的某些内容。

我可以使其工作如下:

ServletA(截图):

public void init() throws ServletException {
Map<String, String> map = new ConcurrentHashMap<>();
getServletContext().setAttribute("map", map);
System.out.println("Servlet A Mapsize: " + map.size());
map.put("foo", "bar");
System.out.println("Servlet A Mapsize: " + map.size());
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> map = (Map<String, String>) getServletContext().getAttribute("map");
System.out.println("Servlet A Mapsize: " + map.size());
}

ServletB(片段):

public void init() throws ServletException {
Map<String, String> map = (Map<String, String>) getServletContext().getAttribute("map");
System.out.println("Servlet B Mapsize: " + map.size());
map.put("foo", "bar");
System.out.println("Servlet B Mapsize: " + map.size());
}

web.xml(片段):

<servlet>
<servlet-name>ServletA</servlet-name>
<servlet-class>mypackage.ServletA</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletB</servlet-name>
<servlet-class>mypackage.ServletB</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>

启动应用程序会提供以下输出:

Servlet A Mapsize: 0

Servlet A Mapsize: 1

Servlet B Mapsize: 1

Servlet B Mapsize: 1

如您所见, map 已正确填充。

现在您可以调用servletA来检查是否一切正常。

在浏览器中打开(我的设置):

http://localhost:8080/servtest/a

将产生以下输出

Servlet A Mapsize: 1

顺便说一句,使用 CDI 可用,您可以编写 applicationScoped 缓存生成器以获得更易于维护的代码。

关于java - ServletContext 变量对其他 servlet 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44167530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com