首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.get/setAttribute() vs this.getServletContext()..get/setAttribute()

.get/setAttribute() vs this.getServletContext()..get/setAttribute()
EN

Stack Overflow用户
提问于 2011-03-08 21:04:44
回答 3查看 13.4K关注 0票数 3

当你从request和getServletContext()调用它们时,get/setAttribute()有什么不同?我注意到你需要

代码语言:javascript
复制
RequestDispatcher rd = request.getRequestDispatcher("/view.jsp");
rd.forward(request, response); 

您只需导航到应用程序中的另一个jsp或servlet即可使用getServletContext().getAttribute()

但我不明白背后是怎么回事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-08 21:13:29

request.setAttribute()在请求作用域中设置一个属性,因此仅在同一请求/响应周期内可用。servletContext.setAttribute()在应用程序作用域中设置一个属性,因此在所有其他请求/会话之间共享。当涉及特定于请求的数据时,您不希望这样做,否则访问者Y将能够看到访问者X的数据。

如果您希望某些属性在response.sendRedirect()重定向后仍然存在,则请求作用域并不合适,因为重定向基本上会指示客户端( new浏览器)创建一个全新的HTTP请求。您需要通过session.setAttribute()将数据放入会话作用域,而不是应用程序作用域(如果在整个会话期间不需要持久化,则最好在后续请求中将其删除)。

另请参阅:

票数 10
EN

Stack Overflow用户

发布于 2011-03-08 21:12:58

servlet上下文有一个全局“应用程序”名称空间,在整个应用程序部署过程中都会维护该名称空间。

该请求有一个针对每个请求的命名空间,该命名空间在单个请求的生命周期内保持不变。

因此,使用servletContext.setAttribute()来存储在作用域中需要是全局的、在不同请求之间共享的内容(因此必须是线程安全的),并使用request.setAttribute()来存储仅与当前请求相关的内容(通常不需要担心线程安全,因为请求通常由单个线程提供服务)。

票数 3
EN

Stack Overflow用户

发布于 2011-03-08 21:36:34

首先,你需要知道一些作用域。有会话作用域、请求作用域、应用作用域、页面作用域。不同作用域属性将存储在不同的时间长度中。

就像您的示例一样,存储在ServletContext中的属性也在应用程序范围内。在服务器应用程序中,就像tomcat一样,当服务器启动时,每个web应用程序的内存中只有一个ServletContext实例。该实例将一直持续到服务器停止。因此,存储在此实例中的属性可以在web应用程序的整个生命周期中使用。但是当客户端发出http请求时,请求的实例将被创建,服务器发送响应消息后,请求的实例将不复存在。因此,请求中的属性只能在请求的生命周期中使用。

我只是在学习java web。如果我在上面有什么错误,我希望得到批评。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5232846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档