spring-web模块为client和server两端构建响应式web应用提供了低级别的基础结构和http抽象概念。全部的公共api都将围绕着Reactive Streams和Reactor创建和实现。html
server端支持下面两个层次:java
HttpHandler and server adapters —http请求处理 Reactive Streams back pressure 的最基本、通用的api。react
WebHandler API — 稍高级别的,可是通常用在过滤器式链的server web api。git
每个http server都有一些处理http请求的api。HttpHandler 是一个处理简单的经过一个方法来处理请求和响应的协议。它主要的目的是为不一样的server提供一个共用的、Reactive Streams based API。github
spring-web 模块包含了对全部支持的server的适配器。下面的表显示了已被使用的server APIs以及Reactive Streams的支持来源:web
Server name | Server API used | Reactive Streams support |
---|---|---|
Nettyspring |
Netty APIapache |
|
Undertowtomcat |
Undertow API |
spring-web: Undertow to Reactive Streams bridge |
Tomcat |
Servlet 3.1 non-blocking I/O; Tomcat API to read and write ByteBuffers vs byte[] |
spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Jetty |
Servlet 3.1 non-blocking I/O; Jetty API to write ByteBuffers vs byte[] |
spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Servlet 3.1 container |
Servlet 3.1 non-blocking I/O |
spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
这里是必须的依赖, supported versions,以及每一个server的代码片断:
Server name | Group id | Artifact name |
---|---|---|
Reactor Netty |
io.projectreactor.ipc |
reactor-netty |
Undertow |
io.undertow |
undertow-core |
Tomcat |
org.apache.tomcat.embed |
tomcat-embed-core |
Jetty |
org.eclipse.jetty |
jetty-server, jetty-servlet |
Reactor Netty:
HttpHandler handler = ... ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); HttpServer.create(host, port).newHandler(adapter).block();
Undertow:
HttpHandler handler = ... UndertowHttpHandlerAdapter adapter = new UndertowHttpHandlerAdapter(handler); Undertow server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build(); server.start();
Tomcat:
HttpHandler handler = ... Servlet servlet = new TomcatHttpHandlerAdapter(handler); Tomcat server = new Tomcat(); File base = new File(System.getProperty("java.io.tmpdir")); Context rootContext = server.addContext("", base.getAbsolutePath()); Tomcat.addServlet(rootContext, "main", servlet); rootContext.addServletMappingDecoded("/", "main"); server.setHost(host); server.setPort(port); server.start();
Jetty:
HttpHandler handler = ... Servlet servlet = new JettyHttpHandlerAdapter(handler); Server server = new Server(); ServletContextHandler contextHandler = new ServletContextHandler(server, ""); contextHandler.addServlet(new ServletHolder(servlet), "/"); contextHandler.start(); ServerConnector connector = new ServerConnector(server); connector.setHost(host); connector.setPort(port); server.addConnector(connector); server.start();
你也能够将经过包装处理过将ServletHttpHandlerAdapter转换成Servlet后的war包部署在servlet3.1容器中。
httphandler 是运行在不一样server的基础。而WebHandler API为exception handlers (WebExceptionHandler), filters (WebFilter),当前处理器(WebHandler)提供了一个稍高级别的api。
全部的组件均可以工做在ServerWebExchange
--http request和response的容器,增长了request attributes, session attributes, access to form data, multipart data,以及更多。
这个处理链能够和WebHttpHandlerBuilder放在一块儿,当建立在一个能够运行在server adapter 的HttpHandler上时。若是要增长单独的组件或者指向ApplicationContext时就须要注意如下的检测:
Bean name | Bean type | Count | Description |
---|---|---|---|
"webHandler" |
WebHandler |
1 |
Target handler after filters |
<any> |
WebFilter |
0..N |
Filters |
<any> |
WebExceptionHandler |
0..N |
Exception handlers after filter chain |
"webSessionManager" |
WebSessionManager |
0..1 |
Custom session manager; |
"serverCodecConfigurer" |
ServerCodecConfigurer |
0..1 |
Custom form and multipart data decoders; |
"localeContextResolver" |
LocaleContextResolver |
0..1 |
Custom resolver for |
spring-web 模块提供了 HttpMessageReader 和 HttpMessageWriter 来编解码Reactive Streams. 的 http请求和响应体。它创建在一个低级别的协议上从 spring-core:
DataBuffer — 抽象化的字节buffer — e.g. Netty ByteBuf
, java.nio.ByteBuffer
Encoder — 序列化一个对象流到数据buffer
Decoder — 反序列化一个数据buffer到对象流
基本的 Encoder 和 Decoder 实现存在于spring-core,可是spring-web增长了更多像XML,JSON以及其余的格式。你能够经过EncoderHttpMessageWriter
和 DecoderHttpMessageReader
来包装encoder和decoder成reader和writer。这里是附加的信息,web-only reader 和 writer 实现自server-sent事件、表单数据以及更多。
最后,ClientCodecConfigurer
和 ServerCodecConfigurer
能够用来实例化 readers and writers 的列表。他们支持classpath检测以及一个默认值随着须要覆盖货替换默认值。