Java request.getServletContext()和getServletContext()之间的差异

Java request.getServletContext()和getServletContext()之间的差异,java,jakarta-ee,Java,Jakarta Ee,我有SampleServlet类,在该类中我重写了doGet()方法,如下所示 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); S

我有
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>");
}
我使用了
request.getServletContext().getInitParameter(“userid”)语句来访问该参数。
request.getServletContext().getInitParameter(“userid”)工作正常。然而,
getServletContext().getInitParameter(“userid”)
请求.getServletContext().getInitParameter(“userid”)两者都给我相同的输出,但我对这两者没有正确的认识

来自:

获取上次调度此ServletRequest的servlet上下文

所以基本上是一样的。

来自:

获取上次调度此ServletRequest的servlet上下文


所以基本上是一样的。

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


当您编写
getServletContext().getInitParameter(“userid”)
方法左侧有一个隐式
this
。这意味着您正在使用类中的方法。

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

当您编写
getServletContext().getInitParameter(“userid”)
方法左侧有一个隐式
this
。这意味着您使用的是类中的方法。

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

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

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

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

getServletContext()访问
ServletContext
只有当代码位于扩展HttpServlet的类中时,才可以直接调用。这是因为HttpServlet基类定义了此方法

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

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

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

尝试在没有请求的情况下直接调用getInitParameter(“userId”)。getServletConfig()

它起作用了。原因是继承性。您的servlet类是javax.servlet.GenericServlet的子类,它的公共方法也可供您的类访问。它有以下方法

@Override
public String getInitParameter(String name) {
    return getServletConfig().getInitParameter(name);
}
请求对象也有访问器来获取servletConfig,通过使用它,我们可以访问getInitParameter方法。 它最终访问GenericServlet类的
私有瞬态ServletConfig配置
变量以获取ServletContext对象

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

PS:代码取自ApacheTomcat源代码。通过它,你会有更多的清晰度

尝试在没有请求的情况下直接调用getInitParameter(“userId”)。getServletConfig()

它起作用了。原因是继承性。您的servlet类是javax.servlet.GenericServlet的子类,它的公共方法也可供您的类访问。它有以下方法

@Override
public String getInitParameter(String name) {
    return getServletConfig().getInitParameter(name);
}
请求对象也有访问器来获取servletConfig,通过使用它,我们可以访问getInitParameter方法。 它最终访问GenericServlet类的
私有瞬态ServletConfig配置
变量以获取ServletContext对象

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


PS:代码取自ApacheTomcat源代码。仔细看,你会更清楚。

基本上是一样的。但是如果您使用request.getSession().getServletContext(),您将在实际不需要会话时创建会话。

基本上是一样的。但是如果您使用request.getSession().getServletContext(),您将在实际不需要会话时创建会话。

这不是关于Java的问题,而是关于Servlet API的问题。以下方法不同:
request.getServletContext()
——在HttpServletRequest中声明,
request.getSession().getServletContext()
——在HttpSession中声明,
this.getServletContext()
——在GenericServlet中声明。因此,它们是否返回相同的对象取决于API定义了什么以及实现实际做了什么。还没有人完全回答这个问题,这不是关于Java的问题,而是关于ServletAPI的问题。以下方法不同:
request.getServletContext()
——在HttpServletRequest中声明,
request.getSession().getServletContext()
——在HttpSession中声明,
this.getServletContext()
——在GenericServlet中声明。因此,它们是否返回相同的对象取决于API定义了什么以及实现实际做了什么。还没有人完全回答这个问题。