GenericServlet中getServletContext()的递归

时间:2015-02-17 13:17:20

标签: java servlets

以下是 GenericServlet 类中的两种方法,

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        return getServletConfig().getServletContext();  // is this RECURSION?
    }

其次,这个方法 getServletContext() 最终会返回什么?

1 个答案:

答案 0 :(得分:1)

不,这不是递归,因为方法中的getServletContext()调用是在SevletConfig对象上调用的,而不是在servlet本身上调用。

看起来像递归的原因是GenricServlet 实现 ServletConfig并公开该接口的所有方法 on,但它通过将所有这些调用委托给其实例成员变量ServletConfig所持有的config对象来实现。

这样做是为了方便地在其ServletConfigdoGet()方法中使用servlet自己的doPosts()。例如,servlet想要在<servlet>标签中用<init-param> s读取 web.xml 中定义的初始化参数。

然后而不是这样做

out.write(getServletConfig().getInitParameter("adminEmail"));

servlet可以直接调用此

out.write(getInitParameter("adminEmail"));

同样的简写也适用于getServletContext()。如果GenericServlet课程没有实施ServletConfig,您就不得不在任何地方致电getServletConfig().getServletContext()


  

但是GenericServlet实现了ServletConfig。因此,再次调用将在GenericServlet的方法

不,这是递归

public String toString() {
    return toString(); // BAD! StackOverflowError
}

这不是

public String toString() {
    return instanceVar.toString(); // OK
}

仅仅因为方法名称相同,不会使其递归

您必须在上看到正在调用该方法的对象。在servlet的情况下,第一次调用是在GenericServlet对象(或技术上是它的子类),第二次调用是在config成员变量 - ServletConfig对象上。