以下是 GenericServlet 类中的两种方法,
public ServletConfig getServletConfig() {
return this.config;
}
public ServletContext getServletContext() {
return getServletConfig().getServletContext(); // is this RECURSION?
}
其次,这个方法 getServletContext() 最终会返回什么?
答案 0 :(得分:1)
不,这不是递归,因为方法中的getServletContext()
调用是在SevletConfig
对象上调用的,而不是在servlet本身上调用。
看起来像递归的原因是GenricServlet
实现 ServletConfig
并公开该接口的所有方法 on,但它通过将所有这些调用委托给其实例成员变量ServletConfig
所持有的config
对象来实现。
这样做是为了方便地在其ServletConfig
,doGet()
方法中使用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
对象上。