当你从request和getServletContext()调用它们时,get/setAttribute()有什么不同?我注意到你需要
RequestDispatcher rd = request.getRequestDispatcher("/view.jsp");
rd.forward(request, response); 您只需导航到应用程序中的另一个jsp或servlet即可使用getServletContext().getAttribute()。
但我不明白背后是怎么回事。
发布于 2011-03-08 21:13:29
request.setAttribute()在请求作用域中设置一个属性,因此仅在同一请求/响应周期内可用。servletContext.setAttribute()在应用程序作用域中设置一个属性,因此在所有其他请求/会话之间共享。当涉及特定于请求的数据时,您不希望这样做,否则访问者Y将能够看到访问者X的数据。
如果您希望某些属性在response.sendRedirect()重定向后仍然存在,则请求作用域并不合适,因为重定向基本上会指示客户端( new浏览器)创建一个全新的HTTP请求。您需要通过session.setAttribute()将数据放入会话作用域,而不是应用程序作用域(如果在整个会话期间不需要持久化,则最好在后续请求中将其删除)。
另请参阅:
发布于 2011-03-08 21:12:58
servlet上下文有一个全局“应用程序”名称空间,在整个应用程序部署过程中都会维护该名称空间。
该请求有一个针对每个请求的命名空间,该命名空间在单个请求的生命周期内保持不变。
因此,使用servletContext.setAttribute()来存储在作用域中需要是全局的、在不同请求之间共享的内容(因此必须是线程安全的),并使用request.setAttribute()来存储仅与当前请求相关的内容(通常不需要担心线程安全,因为请求通常由单个线程提供服务)。
发布于 2011-03-08 21:36:34
首先,你需要知道一些作用域。有会话作用域、请求作用域、应用作用域、页面作用域。不同作用域属性将存储在不同的时间长度中。
就像您的示例一样,存储在ServletContext中的属性也在应用程序范围内。在服务器应用程序中,就像tomcat一样,当服务器启动时,每个web应用程序的内存中只有一个ServletContext实例。该实例将一直持续到服务器停止。因此,存储在此实例中的属性可以在web应用程序的整个生命周期中使用。但是当客户端发出http请求时,请求的实例将被创建,服务器发送响应消息后,请求的实例将不复存在。因此,请求中的属性只能在请求的生命周期中使用。
我只是在学习java web。如果我在上面有什么错误,我希望得到批评。
https://stackoverflow.com/questions/5232846
复制相似问题