我一直在servlet和JSP瞎搞,我是有点的东西困惑:
我做了一个servlet(控制器),这将请求分派到JSP
我一直在使用setAttribute()方法在我的servlet设置一些属性来请求对象。
我可以在JSP中访问请求对象的参数和属性没有任何
问题。
现在,我已经在会话对象的属性,使用存储请求对象
session.setAttribute( “测试”,请求)。
我已经写了第二个JSP(从第一个JSP导航到它会通过
JavaScript的,当我使用window.location的功能点击一个特定的按钮 - 和
给第二JSP的作为值的地址)
- 在第二个JSP,当我从会话中检索对象的请求对象,我得到一个
从检索请求对象的所有属性空值。 - 我可以访问检索请求对象的参数,但只有当我取回了
参数在我的第一JSP ATLEAST一次使用的request.getParameter()方法
否则,他们在我的第二个JSP返回null。
我真的很新的这东西,感到困惑的这种行为。 为什么我的请求对象的属性被“抹去”,而参数保持不变(只要我在访问我的第一个JSP的参数,这更加扑朔迷离到我,因为它没有任何意义IMO)
任何解释,将不胜感激! 请多关照。
这仅仅是一个受过教育的猜测,但我认为这个问题是在你选择的容器的请求对象可能是偷懒一下它的参数:当你问它的参数达到了一定的外部环境和拉所需要的数据,在同时其高速缓存。
然而,奇怪的行为的原因是不是真的很重要。 这个问题应该由不保存在会话请求解决。 请求对象只是你处理当前请求,而不是一个数据存储本身。 它可能使用的任何机制下,我们都知道的属性可以存储在threadlocals。 绝对没有任何合同,这将使请求充当任何形式的档案。 例如:这一切意味着什么,如果我要求安全主体这样一个存储的请求? 我将意味着“会议的现任校长”? 我将意味着“校长当请求被创建的时刻”?
编辑:
出于好奇纯我刚刚花了偷看Tomcat的实现(我不知道哪个容器您正在使用),并发现它支持我的要求:不仅大多数数据都懒洋洋地聚集,但请求对象被回收! 所以,如果你试图将其存储在一个会话,然后使用,你可能会发现你正在使用某人的其他请求。
有4个领域中的Java EE 5 。 在这两种的Java EE 6和Java EE的7有5个作用域。 最常用的是:
您可以通过设置适当的属性存储在所有上述范围的一些数据。
下面是相关的Java EE API文档报价ServletRequest.setAttribute(字符串,对象)关于请求范围的方法:
void setAttribute(java.lang.String name, java.lang.Object o)
商店在这个要求的属性。 属性是请求之间重置 。 这种方法是最经常与RequestDispatcher的结合使用。
...
因此,每一个新的请求,您在请求中设置以前的属性都将丢失。 在您设定的请求的属性,您必须将请求转发给需要的页面。 如果您重定向,这将是一个完全新的请求,从而预先设置的属性都将丢失。 (如果你仍然想使用重定向阅读: 错误消息的Servlet重定向到同一页 )
这是在设置的属性HttpSession中 (在会话范围内 ),只要将居住在会话的生命,当然,将只提供给哪个会话所属的用户。
对于上下文属性他们是为了提供给整个Web应用程序( 适用范围 ),并为所有用户,再加上只要Web应用程序生活,他们住。
作为结论,如果您以前在会话中设置一个属性也将提供给相同的用户只要会话存活。
希望这会帮助你。
PS
也许这篇文章也将是对您有用: 如何Java EE 6个的作用域影响用户互动
唯一的一点,本文使用的注释的作用域,但你会得到的想法。