1、什么是Handler
先来看看javadoc中对Handler的描述
/* ------------------------------------------------------------ */
/** A Jetty Server Handler.
*
* A Handler instance is required by a {@link Server} to handle incoming
* HTTP requests. A Handler may: <ul>
* <li>Completely generate the HTTP Response</li>
* <li>Examine/modify the request and call another Handler (see {@link HandlerWrapper}).
* <li>Pass the request to one or more other Handlers (see {@link HandlerCollection}).
* </ul>
*
* Handlers are passed the servlet API request and response object, but are
* not Servlets. The servlet container is implemented by handlers for
* context, security, session and servlet that modify the request object
* before passing it to the next stage of handling.
*
*/
public interface Handler extends LifeCycle, Destroyable
也就是说,当一个HTTP请求到来的时候,需要Handler进行处理,而且必须要有一个Handler否则消息无法处理。Handler主要有以下几个功能:
1)产生HTTP Response
2)检查和修改request,并且调用其他Handler。之前已经介绍过,HandlerWrapper可以将多个Handler连接起来使用。
3)将request传递给其他的一个或者多个Handler。
现在知道了Handler的大致功能,接下来看看Jetty中实现了哪些Handler可以供开发者使用。
2、现有的Handler
在来回顾下之前的两篇文章中已经提到的Handler,
1)DefaultHandler,用于返回默认的错误页面404
2)ContextHandler,可以设置web应用的context
3)WebAppContext,可以设置web应用的context,用于加载和处理已有的web工程。
4)ServletContextHandler,可以设置web的context,同时可以添加servlet用于处理http request。
5)ResourceHandler,用于加载本地资源并且显示
之外还有HandlerWrapper,HandlerCollection,ContextHandlerCollection,HandlerList。
3、Handler调用路径
首先可以确认的是Server中的handle是调用Handler的入口,那么我们以这个函数为线索一步一步找出Handler是如何被调用的。
1)看一下handle函数是如何被调用的
2)查看handleRequest是如何被调用的
3)查看handle是如何被调用的
4)查看handle是如何被调用的
可以看出是在一个线程中被调用的,那么找出这个线程,
5)查看_handler是如何被调用的