1、Tomcat在创建Servlet实例对象时,会将配置文件的参数封装在ServletConfig对象中,然后调用init(ServletConfig config)将参数对象ServletConfig的引用指向类(它继承了GenericServlet)的成员变量config(private transient ServletConfig config)。
2、ServletConfig接口有四个方法:getServletContext,getServletName,getInitParameter和getInitParameterNames。GenericServlet实现了 ServletConfig接口,源码如下:
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
public String getServletName() {
return config.getServletName();
}
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
GenericServlet仅仅是通过调用某个已经实现了ServletConfig接口的类的方法 来实现ServletConfig接口的方法。具体如何getServletName、getServletContext()还是不知道。
3、查阅 How Tomcat Works 这本书发现, StandardWrapper 类实现 了javax.servlet.ServletConfig 接口。
StandardWrapper类的部分源码如下:
@Override
public ServletContext getServletContext() {
if (parent == null)
return (null);
else if (!(parent instanceof Context))
return (null);
else
return (((Context) parent).getServletContext());
}
@Override
public String getServletName() {
return (getName());
}
@Override
public String getInitParameter(String name) {
return (findInitParameter(name));
}
@Override
public Enumeration<String> getInitParameterNames() {
try {
parametersLock.readLock().lock();
return Collections.enumeration(parameters.keySet());
} finally {
parametersLock.readLock().unlock();
}
}