【问题标题】:Difference between request.getServletContext() and getServletContext() [duplicate]request.getServletContext() 和 getServletContext() 之间的区别 [重复]
【发布时间】:2015-09-16 13:29:33
【问题描述】:

我有SampleServlet 类,在其中我覆盖了doGet() 方法,如下所示

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String name = request.getParameter("name");

    String userid = (String)request.getServletContext().getInitParameter("userid");

    out.print("Name = " + name + "<br>");

    out.print("User id= " + userid+ "<br>");
}

在我的Web.xml 中,我添加了如下上下文参数,

<context-param>
    <param-name>userid</param-name>
    <param-value>ABC12345</param-value>
</context-param>

我使用request.getServletContext().getInitParameter("userid"); 语句来访问该参数。request.getServletContext().getInitParameter("userid"); 它工作正常。但是getServletContext().getInitParameter("userid");request.getServletContext().getInitParameter("userid"); 之间有什么区别吗?两者都给我相同的输出,但我对这两者没有正确的想法。

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    getServletContext() 只有当您的代码位于扩展 HttpServlet 的类中时,您才能直接调用。那是因为 HttpServlet 基类定义了这个方法。

    request.getSession().getServletContext()返回的ServletContext与getServletContext()相同。HttpSession包含对该会话所属的ServletContext的引用。

    只要您的代码在 servlet 类中,您就可以使用任何东西,因为两者都可以调用。

    如果您有一个不扩展 servlet 的自定义类,并且您需要传递会话对象以在该自定义类中处理它。由于您有对会话的引用,您可以访问 ServletContext使用方法session.getServletContext()

    【讨论】:

      【解决方案2】:

      来自javadoc

      获取此 ServletRequest 上次分派到的 servlet 上下文。

      所以基本上是一样的。

      【讨论】:

        【解决方案3】:

        尝试不使用request.getServletConfig()直接调用getInitParameter("userId")

        它有效。原因是继承。您的 servlet 类是 javax.servlet 的子类。GenericServlet 并且您的类也可以访问它的公共方法。它有以下方法

        @Override
        public String getInitParameter(String name) {
            return getServletConfig().getInitParameter(name);
        }
        

        请求对象也有获取 servletConfig 的访问器,通过使用它,我们可以访问 getInitParameter 方法。 它最终访问 GenericServlet 类的private transient ServletConfig config 变量以获取 ServletContext 对象。

        这就是您能够访问 getServletContext().getInitParameter("userid"); 的原因不使用“请求”参数。

        PS:代码取自 apache-tomcat 源代码。过一遍,你会更清楚。

        【讨论】:

          【解决方案4】:

          这两种方法都提供对同一个对象的访问。

          当您编写 getServletContext().getInitParameter("userid"); 时,方法左侧有一个隐含的 this。这意味着您正在使用来自GenericServlet 类的方法。

          【讨论】:

          • 这不是关于 Java 的问题——这是关于 Servlet API 的问题。以下方法不一样:request.getServletContext()——在HttpServletRequest中声明,request.getSession().getServletContext()——在HttpSession中声明,this.getServletContext()——在GenericServlet中声明。因此,它们是否返回相同的对象取决于 API 定义的内容和实现的实际作用。还没有人完全回答那个问题。
          【解决方案5】:

          基本上是一样的。但是如果你使用 request.getSession().getServletContext() 你会在你真正不需要的时候创建一个会话。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-16
            • 2011-04-08
            • 2012-11-24
            • 2013-06-05
            • 2021-09-29
            • 2020-05-27
            • 2016-03-23
            相关资源
            最近更新 更多