【问题标题】:Why do I need an HttpSession to get the ServletContext?为什么我需要一个 HttpSession 来获取 ServletContext?
【发布时间】:2011-12-12 10:10:54
【问题描述】:

在 Java Servlet API 中,获取 ServletContext 的唯一方法是通过 HttpSession (Javadoc) 的实例。

如果我不想创建会话而只需要 servlet 上下文怎么办?也就是说,为什么HttpServletRequest类中没有getServletContext()方法?

编辑

我知道我可以从 servlet 本身获取 ServletContext,因为它在初始化期间接收到它。但是,我无法单独从HttpServletRequest 获取它,即使它链接到一个servlet。那么如果我有一个请求,但没有引用任何 servlet 怎么办?

【问题讨论】:

    标签: java httpsession servlets


    【解决方案1】:

    getServletContext()GenericServlet 的一部分,它是HttpServlet 的父类,因此您应该能够在您的servlet 实现中调用它。

    编辑:

    HttpServletRequestservlet 3.0 以来从 ServletRequest 继承 getServletContext(),因此如果您必须使用版本,您似乎必须将上下文与请求和响应对象一起传递3.0之前。

    【讨论】:

    • 问题不是这个。
    【解决方案2】:

    只是每个处理请求的实体(服务器、过滤器、页面)都有自己的getServletContext(或init()

    【讨论】:

    • +1,然而,情况并非总是如此。有时您只有一个请求,而进入 servlet 上下文的唯一方法是通过会话。
    • @LaurentPireyn 例如,当您在其他层中传递请求时不知道 Servlets API?这是可能的,但在这种情况下,我们最终会丢失一些问题:首先获取ServletContext 是否是一个好主意;我们不应该只是将上下文推送到属性中吗?我们不应该重新组织我们的逻辑吗?等等……
    • 我正在进入“酸葡萄”模式,抱歉。无论如何,真正的问题是什么?我相信的基本原理是保持方法的数量合理:我更惊讶getServletContext 将它变成了HttpSession
    • 我也很惊讶,因此我提出了问题。自 Servlet 3 以来,该请求可以直接访问 servlet 上下文(而不是通过会话)(感谢 rsp 提及这一点)。所以这可能是他们确实忘记的东西。
    【解决方案3】:

    你的 servlet 类有一个 getServletContext() 方法,你不需要去请求。

    这是有道理的,servlet 本身具有容器提供的上下文,这与任何特定请求无关。

    【讨论】:

    • 问题不是这个。
    • @Laurent 原始问题没有额外信息,即只有请求可用。
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2011-04-14
    • 2011-08-27
    相关资源
    最近更新 更多