前面很多文章都提到过ServletHandler这种类型,它在整个http的处理中所占的位置如下:
(1)connector -> (2)server->(3)contextHandlerCollection->(4)WebAppContext->(5)ServletHandler->(6)Servlet
从上面整个http的处理过程来看,ServletHandler应该算得上是最接近用户定义的servlet的了。。。
一般情况下context收到http请求之后,这个请求最终都会直接交到servletHandler来处理,因此它也需要负责对http请求的path进行处理,从而才能将这个http请求交给正确的servlet。。。。
好了,先来看看ServletHandler的一些重要的属性的定义吧:
private ContextHandler _contextHandler; //这个servlet所属的contextHandler
private ContextHandler.SContext _servletContext; //当前这个context的servletcontext
private FilterHolder[] _filters; //filter数组
private FilterMapping[] _filterMappings; //xml中的filter的map信息
private boolean _filterChainsCached=true;
private int _maxFilterChainsCacheSize=1000;
private boolean _startWithUnavailable=true;
private ServletHolder[] _servlets; //servletholder数组,一般情况下用户定义的servlet都会被servletholder包装一下
private ServletMapping[] _servletMappings; //用于保存从xml中读取出来的servlet的map信息
private transient Map _filterNameMap= new HashMap(); //filter的name对应
private transient List _filterPathMappings; //将filter与特定的path对应起来
private transient MultiMap _filterNameMappings; //servlet的name与filter的对应,有的filter可能会指定特定的servlet
private transient Map _servletNameMap=new HashMap(); //servlet与名字进行对应
private transient PathMap _servletPathMap; //pathmap,这个很重要,当请求来了之后,就会通过它来匹配出合适的servlet来处理
protected transient HashMap _chainCache[]; //请求访问path与fitlerchain的缓存,防止每次都要创建
这里最为重要的一个属性应该就是servletPathMap了吧,我们在web.xml文件中会定义许多servlet,最后都会通过 <servlet-mapping> 元素将某个servlet与一个或者多个path对应起来。。。而这最终的对应关系都会在servletPathMap里面。。。另外还有许多其他的属性,具体他们是干什么的,应该注释就说的很清楚了吧。。。
那么接下来我们来看看ServletHandler的doStart方法吧:
//servlethandler的启动过程
protected synchronized void doStart()
throws Exception {
_servletContext=ContextHandler.getCurrentContext(); //获取当前的servletcontext
_contextHandler=_servletContext==null?null:_servletContext.getContextHandler(); //保存其所属的contextHandler
updateNameMappings(); //名字对应map的更新,也就是我们在xml文件中定义的servlet名字与servletholder对象的对应,当然这里还有filter