【发布时间】:2017-05-24 20:04:13
【问题描述】:
假设我有两个 servlet,A 和 B。在 Servlet A 中,我创建一个 HashMap 并在 init() 中存储到 Servlet 上下文中,如下所示:
ServletContext context = getServletContext();
context.setAttribute("otable", someObject);
现在在 Servlet B 的 init() 中,我正在初始化对 servlet 上下文对象的本地引用(我正在指定首先创建 servlet 上下文对象的 servlet 以首先通过 web.xml 启动):
// 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>
【问题讨论】:
-
啊,我明白了。谢谢马库斯,只是好奇,但在那种情况下,servlet 的局部变量不会与 servlet 上下文相同吗?或者 servlet 上下文是否用于同一个 servlet 的多个实例?使用并发哈希映射获取和放置两个 servlet 有什么问题吗?
-
我删除了我的评论,因为它是错误的,对不起!
-
你确定你的servlet已经初始化了吗?您可以在启动时设置负载。否则在第一个请求到达之前它们不会被初始化。是的,当您期望并发访问时,绝对不要使用 HashMap。它可能最终处于竞争状态!
-
我编辑了问题以显示我的 web.xml 条目首先加载初始 servlet 的样子,这就是您所说的初始化吗?
-
我是,从某种意义上说它是 ServletContext,因为我没有使用 Spring。这是你的意思吗?我曾认为 ServletContext 是可以在 Web 应用程序中的所有 servlet 之间共享某些东西的地方