Servlet规范核心类(接口)
ServletContext:定义了一些可以和Servlet Container交互的方法。
Registration:实现Filter和Servlet的动态注册。
ServletRequest(HttpServletRequest):对HTTP请求消息的封装。
ServletResponse(HttpServletResponse):对HTTP响应消息的封装。
RequestDispatcher:将当前请求分发给另一个URL,甚至ServletContext以实现进一步的处理。
Servlet(HttpServlet):所有“服务器小程序”要实现了接口,这些“服务器小程序”重写doGet、doPost、doPut、doHead、doDelete、doOption、doTrace等方法(HttpServlet)以实现响应请求的相关逻辑。
Filter(FilterChain):在进入Servlet前以及出Servlet以后添加一些用户自定义的逻辑,以实现一些横切面相关的功能,如用户验证、日志打印等功能。
AsyncContext:实现异步请求处理。
HTTP消息
HTTP请求消息分为请求行、消息报头、请求正文三部分
HTTP响应消息分为状态行、消息报头、消息正文三部分
WebAppClassLoader
Jetty中用于对Servlet规范的ClassLoader的实现,它继承自URLClassLoader。它不会加载任何System Class(使用System ClassLoader加载),
对Java2中父ClassLoader优先于子ClassLoader的规则,可以使用WebAppContext的setParentLoadPriority为true来配置。
如果没有配置父ClassLoader,则使用当前的Thread Context ClassLoader,
如果该ClassLoader也为null,则使用加载该类的ClassLoader,
如果它还为null,则使用SystemClassLoader作为其父ClassLoader
XmlConfiguration
Jetty中用来实现使用XML文件配置WebAppContext实例的框架
Server
Jetty中最核心的是类,它即包含Connectors数据,有包含了Handler的集合,即
它是Jetty中用于连接Connector和Handler的类。
同时它还包含了一个Container,用于存储Jetty中核心类实例的关系发生变化时触发事件的Listener,
接收者可以注册一个Listener以获取Jetty中某个类的关系发生变化
Connector
Connector收到一个客户端的连接时(ServerSocket或ServerSocketChannel的accept()方法返回),
Connector会首先创建一个ConnectedEndPoint用于和连接的底层(Socket、Channel)打交道(读写数据),
在创建的ConnectedEndPoint时会同时使用该EndPoint创建相应类型的Connection,
然后会创建一个Task仍给线程池,最终线程池会启动一个线程启动这个Task,而在这个Task中调用Connection中的handle()方法,以处理当前的连接请求,
在这个Task中,它会持续的调用Connection中的handle()方法直到连接关闭或Connector停止。
在ConnectorEndPoint中,它自己就实现了Runnable接口,因而可以将它自己丢给线程池,而在SelectChannelEndPoint中则交给SelectorManager来管理客户端连接过来的Channel,并调用Connection的handle方法
Handler
Handler在使用Jetty时,我们首先要向Server注册相应的Handler实例. Server作为Handler的容器,
在Server中以HttpConnection为参数的handle()和handleAsync()方法中,会调用向这个Handler容器中注册的所有Handler的handle()方法
Container
Container用于生成父实例和子引用的关系发生变化时生成的时间,以提供其注册的Listener接收到相应的事件
Connector
Connector是核心接口,来抽象服务器对某个端口的监听。在Connector启动时,它会启动acceptors个Acceptor线程用于监听在Connector中配置的端口
SelectChannelConnector
BlockingChannelConnector
Buffer
Buffer是对Java中Stream IO中的buffer和NIO中的buffer的抽象表示,它主要用于缓存连接中读取和写入的数据
ByteBuffer
DirectNIOBuffer
IndirectNIOBuffer
RandomAccessFileBuffer
View
EndPoint
EndPoint是对一次客户端到服务器连接的抽象,每一个新的连接都会创建一个新的EndPoint,并且在这个EndPoint中包含这次连接的Socket.
StreamEndPoint
ChannelEndPoint
BlockingChannelEndPoint
SelectChannelEndPoint
SslSelectChannelEndPoint
Connection
Connection表示客户端和服务器的一次连接
HttpConnection是对Connection的主要实现,它表示Http客户端和服务器的一次连接,用于将Request、Response、EndPoint联系在一起
Parser
Parser抽象请求消息和响应消息的解析类引擎
HttpParser抽象HTTP请求消息和响应消息的解析类引擎,采用事件驱动机制,用户可以通过注册的EventHandler实例获取相应的消息.在HttpConnection中使用
Generator
Generator专门处理HTTP响应消息和请求消息的生成和发送
HttpGenerator
NestedGenerator
Handler
Handler是核心接口,它用于处理所有连接以外的逻辑,比如对Servlet框架的实现,以及用户自定义的Handler等,它继承自LifeCycle和Destroyable接口,只有一个主要方法:handle,包含Request和Response实例
DefaultHandler
DumpHandler
ErrorHandler
ErrorPageErrorHandler.
ResourceHandler
HandlerWrapper是一个Handler的Wrapper
ConnectHandler
DebugHandler
IPAccessHandler
RequestLogHandler
StatisticsHandler
ScopedHandler
Handler设计更多的像是Chain Of Responsibility模式,它的处理逻辑只能从链头走到链尾,而没有返回的路程,引入ScopedHandler的目的就是用于解决这个问题
ContextHandler
继承自ScopedHandler,它是对一个Web Application的各种资源进行管理,并串联实现整个Servlet框架的类
ServletContextHandler
WebAppContext
Resource是对静态资源的抽象
URLResource
FileResource
JarResource
JarFileResource
BadResource
SimpleServer.java
QueuedThreadPool threadPool = new QueuedThreadPool(10, 4, 1000);
Server server = new Server(threadPool);
ServerConnector connector = new NetworkTrafficServerConnector(server);
connector.setSoLingerTime(-1);
connector.setPort(port + 1);
server.setConnectors(new Connector[] { connector });
WebAppContext bb = new WebAppContext();
bb.setServer(server);
bb.setContextPath(context);
bb.setWar("jettyapp/web/");
server.setHandler(bb);
// ResourceHandler resource_handler = new ResourceHandler();
// resource_handler.setDirectoriesListed(true);
// resource_handler.setWelcomeFiles(new String[]{ "lire.html" });
// resource_handler.setResourceBase("jettyapp/web");
// server.setHandler(resource_handler);
server.start();
server.join();