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定义了什么以及实现实际做了什么。还没有人完全回答这个问题。