实际上Jetty的工作方式非常简单,当Jetty接收到一个请求时,Jetty就把这个请求交给在Server中注册的而代理Handler去执行,如何执行注册的Handler同样由你规定,Jetty要做的就是调用你注册的第一个Handler的handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)方法,接下来要怎么做,完全由你决定。
要能接收一个Web请求访问,首先要创建一个ContextHandler。
当我们在浏览器中输http://localhost:8080时请求将会代理到Server类的handle方法,Server的handle方法将请求代理给ContextHandler的handle方法,ContextHandler又调用另一个Handler的handle方法。这个调用方式是和Servlet的工作方式类似,在启动之前初始化,创建对象后调用Servlet的service方法。在Servlet的API中我通常也只实现它的一个包装好的类,在Jetty中也是如此。虽然ContextHandler也只是一个handler,但是这个Handler通常由Jetty帮你实现,我们一般只要实现一些与具体要做的业务逻辑有关的Handler就好了,而一些流程性的或某些规范的Handler,我们直接用就好了。下图是请求Servlet的时序图。
Jetty处理请求的过程就是Handler链上handle方法的执行过程。这里需要解释的一点是ScopeHandler的处理规则,ServletContextHandler、SessionHandler和ServletHandler都继承了ScopeHandler,那么这三个类组成一个Handler链,他们的执行规则是ServletContextHandler.handler→ServletContextHandler.doScope→SessionHandler.doScope→ServletHandler.doScope→ServletContextHandler.doHandle→SessionHandler.doHandle→ServletHandler.doHandle,他这种机制使得我们可以在duScope阶段做一些额外工作。