我一直在搞弄servlet和JSP,对某些事情有些困惑:
我已经制作了一个servlet(控制器),它将请求分发给JSP。
我已经在Servlet中使用setAttribute()方法为请求对象设置了一些属性。
我可以毫无问题地在JSP中访问请求对象的参数和属性 。
现在,我已经使用 session.setAttribute(“ test”,request)将请求对象作为属性存储在会话对象中。
我已经编写了第二个JSP( 当我单击特定按钮时,可以通过Javascript 从第一个JSP导航到它-通过使用window.location函数并 提供第二个JSP的地址作为值)
在第二个JSP中,当我从会话对象中检索请求对象时,我从检索到的请求对象的 所有属性中得到一个空值。
仅当我 使用request.getParameter()方法在第一个JSP中至少检索了一次参数时,才可以访问检索到的请求对象BUT 的参数, 否则,在第二个JSP中它们返回null。
我真的很陌生,对这种行为感到困惑。为什么在保留参数不变的情况下“删除”了请求对象的属性(只要我在第一个JSP中访问了参数;这对我来说就更加令人困惑,因为它对IMO没有意义)
任何解释将不胜感激!预先感谢您。
这只是一个有根据的猜测,但是我认为问题在于您选择的容器中的请求对象可能对它的参数不满意:当您请求它的参数时,它会到达某个外部上下文并在其中提取所需的数据。同时缓存它。
但是,奇怪行为的原因并不十分重要。应该通过 不在会话中保存请求 来解决该问题 。 请求对象只是您对当前请求的句柄,而不是数据存储本身。它可能在下面使用任何机制,因为我们知道所有属性都可以存储在threadlocals中。绝对没有合同可以使请求充当任何形式的档案。例如:如果我向安全主体请求了这样的存储请求,那意味着什么?我的意思是“会议的当前负责人”吗?我的意思是“创建请求时的主体”吗?
编辑:
出于纯粹的好奇心,我只是看了一眼Tomcat的实现(我不知道您使用的是哪个容器),发现它支持我的主张:不仅大多数数据都是惰性收集的,而且请求对象也被回收了!因此,如果您尝试将其存储在会话中然后使用,则可能会发现您正在使用其他人的请求。