【问题标题】:Confusion regarding the behaviour of the request object对请求对象的行为感到困惑
【发布时间】:2013-01-20 21:37:03
【问题描述】:

我一直在搞乱 servlet 和 JSP,但我有些困惑:

  1. 我制作了一个 servlet(控制器),它将请求分派给 JSP

  2. 我已经使用我的 setAttribute() 方法为请求对象设置了一些属性 servlet。

  3. 我可以在 JSP 中访问请求对象的参数和属性,而无需任何
    问题。

  4. 现在我已使用
    将请求对象作为属性存储在会话对象中 session.setAttribute(“测试”,请求)。

  5. 我已经编写了第二个 JSP(从第一个 JSP 导航到它会通过
    当我单击特定按钮时的 Javascript - 通过使用 window.location 函数和
    将第二个 JSP 的地址作为值)

  6. 在第二个 JSP 中,当我从会话对象中检索请求对象时,我得到一个
    检索到的请求对象的所有属性中的 null 值。
  7. 我可以访问检索到的请求对象的参数,但只有当我检索到了
    在我的第一个 JSP 中使用 request.getParameter() 方法的参数至少一次
    否则它们会在我的第二个 JSP 中返回 null。

我对这些东西真的很陌生,对这种行为感到困惑。为什么我的请求对象的属性被“删除”而参数保持不变(只要我在我的第一个 JSP 中访问了参数;这对我来说更令人困惑,因为它没有意义 IMO)

任何解释将不胜感激!提前谢谢你。

【问题讨论】:

    标签: java jsp servlets scope


    【解决方案1】:

    这只是一个有根据的猜测,但我认为问题在于您选择的容器中的请求对象可能对它的参数很懒惰:当您向它请求参数时,它会到达一些外部上下文并提取所需的数据,同时缓存它。

    尽管如此,奇怪行为的原因并不重要。该问题应该通过不在会话中保存请求来解决。请求对象只是您对当前请求的句柄,而不是数据存储本身。它可能正在使用下面的任何机制,因为我们知道属性可能存储在 threadlocals 中。绝对没有任何合同可以使请求充当任何类型的档案。例如:如果我向安全主体询问这样一个存储的请求,这意味着什么?我的意思是“本届会议的现任负责人”吗?我的意思是“创建请求时的主体”吗?

    编辑:

    出于纯粹的好奇,我只是看了看 Tomcat 的实现(我不知道您使用的是哪个容器),发现它支持我的主张:不仅大部分数据是懒惰地收集的,而且请求对象是回收的!所以如果你尝试将它存储在一个会话中然后使用,你可能会发现你正在使用别人的请求。

    【讨论】:

    • 谢谢!现在说得通了
    • 再次感谢您!你真是太好了。我希望我至少可以对此表示赞同,但 stackoverflow 说我需要获得更多积分才能投票。
    • @ShravanMaridi:谢谢 :-) 如果它回答了您的问题,您可能会考虑将其标记为正确答案 - 如果有人通过 Google 来,他们会知道首先阅读它。
    【解决方案2】:

    Java EE 5 中有 4 个作用域。在Java EE 6Java EE 7 中都有5 个作用域。最常用的是:

    • 请求范围
    • 会话范围
    • 应用范围(Web 上下文)

    您可以通过设置适当的属性在上述所有范围内存储一些数据。

    以下是 Java EE API 文档中关于 请求范围ServletRequest.setAttribute(String, Object) 方法相关的引用:

    void setAttribute(java.lang.String name,
                      java.lang.Object o)
    

    在此请求中存储一个属性。 属性在之间重置 请求。这种方法最常与 请求调度程序。
    ...

    因此,对于每个新请求,您在 request 中设置的先前属性都会丢失。在请求中设置属性后,您必须将请求转发到所需的页面。如果您重定向,这将是一个全新的请求,因此之前设置的属性将丢失。 (如果您仍想使用重定向,请阅读:Servlet Redirection to same page with error message

    HttpSession(在会话范围)中设置的那些属性将在会话存在时一直存在,当然,只有会话所属的用户可以使用.

    至于上下文属性,它们适用于整个 Web 应用程序(应用程序范围)和所有用户,而且只要 Web 应用程序存在,它们就会存在。


    作为结论,如果您之前在 session 中设置了一个属性,只要该会话处于活动状态,该属性就可供同一用户使用。

    希望这会对你有所帮助。

    附言
    也许这篇文章也对你有用:How Java EE 6 Scopes Affect User Interactions
    本文唯一使用 注释 进行范围界定,但您会明白的。

    【讨论】:

    • 您好,这与请求对象的范围无关,而是其参数和属性的行为之间的差异。不管怎样,谢谢你的信息,它比我读的书写得好!
    • @ShravanMaridi 对不起,如果我误解了你的问题。
    • 尽管如此,我发现您的答案中给出的信息非常有用,并且从我已经知道的情况来看非常清楚:)
    • @ShravanMaridi 谢谢,很高兴听到这个消息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多