request.get / setAttribute()vs this.getServletContext()。get / setAttribute()

时间:2011-03-08 13:04:44

标签: java jsp servlets

get/setAttribute()从请求和getServletContext()调用它们之间的区别。 我注意到你需要

RequestDispatcher rd = request.getRequestDispatcher("/view.jsp");
rd.forward(request, response); 

要求工作,但您只需要导航到应用程序中的另一个jsp或servlet以使用getServletContext().getAttribute()

但我不明白背后会发生什么。

3 个答案:

答案 0 :(得分:9)

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

如果您希望某个属性在response.sendRedirect()重定向后继续存在,则请求范围不合适,因为重定向基本上指示客户端(webbrowser)创建全新的HTTP请求。您需要将数据放在会话范围中session.setAttribute()而不是应用程序范围(如果在整个过程中不需要持久化,则最好在后续请求中删除会话)。

另见:

答案 1 :(得分:2)

servlet上下文具有全局“应用程序”命名空间,该命名空间在应用程序的整个部署过程中得到维护。

请求具有每请求命名空间,该命名空间在单个请求的生命周期内维护。

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

答案 2 :(得分:0)

首先,您需要了解一些范围。有会话范围,请求范围和应用范围,页面范围。不同范围的属性将存储在不同的时间长度。

就像您的示例一样,存储在ServletContext中的属性位于应用程序范围内。在像tomcat这样的服务器应用程序中,当服务器启动时,每个Web应用程序的内存中只有一个ServletContext实例。实例将持续,直到服务器停止。因此,存储在此实例中的属性可以在Web应用程序的所有生命周期中使用。但是当来自客户端的http请求时,请求的实例将被构建,在服务器发送响应消息之后,它将不再存在。因此请求中的属性只能在请求的生命周期中使用。

我刚刚学习java web。如果我上面有一些错误,我想批评一下。