request.getServletContext()和getServletContext()之间的区别

时间:2015-09-16 13:29:33

标签: java java-ee

我有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");之间是否有任何区别两者都给我相同的输出,但我对这两者没有正确的认识。

5 个答案:

答案 0 :(得分:7)

只有当您的代码位于扩展HttpServlet的类中时,才可以直接调用

getServletContext()。那是因为HttpServlet基类定义了这个方法。

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

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

如果您有一个不扩展servlet的自定义类,并且您需要传递会话对象以在该自定义类中处理它。当您有对该会话的引用时,您可以访问{{1使用方法ServletContext

答案 1 :(得分:1)

来自javadoc

  

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

基本上它是一样的。

答案 2 :(得分:1)

  

尝试直接调用getInitParameter(“userId”)而不需要request.getServletConfig()

有效。原因是继承。您的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源代码。通过它,你会更清晰。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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