博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jetty的架构
阅读量:2183 次
发布时间:2019-05-02

本文共 3292 字,大约阅读时间需要 10 分钟。

Jetty的架构 - Gui Xun Long - Hello Java

Connector(连接器)集合负责接收HTTP连接。handler(处理器)集合负责处理连接请求并给予响应。而Jetty Server(服务器)则是前两者的管道连接器。负责创建并初始化connector、handler、ThreadPool组件,然后调用start方法启动他们。ThreadPool(线程池)为他们完成工作提供线程。

Jetty Server演示代码

Java代码  
  1. //1:定义server  
  2. Server server = new Server();  
  3.   
  4. //2:把连接器集合放到server里  
  5. Connector connector=new SelectChannelConnector();  
  6. connector.setPort(8080);  
  7. server.setConnectors(new Connector[]{connector});  
  8.   
  9. //3:并把处理器集合放到server里  
  10. Handler param=new ParamHandler();  
  11. Handler hello=new HelloHandler();  
  12. HandlerCollection handlers = new HandlerCollection();  
  13. handlers.setHandlers(new Handler[]{param,hello});  
  14. server.setHandler(handlers);  
  15.   
  16. //4:启动server  
  17. server.start();  
  18. server.join();  
 

模式

Jetty的架构 - Gui Xun Long - Hello Java
 
jetty遵循一些比较规范的模式,最抽象的概念通过接口定义,如连接器,处理器和缓冲区。在抽象类中实现这些接口的通用操作,如AbstractConnector, AbstractHandler and AbstractBuffer。

Connectors

 Jetty的架构 - Gui Xun Long - Hello Java

 

连接器表示协议的处理者,负责解析请求并生成响应。不同类型的连接器在其基于的协议下有效,如调度模型和IO API的使用:

?SocketConnector - for few busy connections or when NIO is not available.

?BlockingChannelConnector - for few busy connections when NIO is available
?SelectChannelConnector - for many mostly idle connections or asynchronous handling of Ajax requests.
?SslSocketConnector - 没有使用NIO的SSL连接器。
?SslSelectChannelConnector - 使用非阻塞NIO支持的SSL连接器。
?AJPConnector AJP protocol support for connections from apache mod_jk or mod_proxy_ajp

connectors的使用代码

Java代码  
  1. Connector connector=new SelectChannelConnector();  
  2. connector.setPort(8080);  

Handlers

Jetty的架构 - Gui Xun Long - Hello Java
 

Handler组件负责处理接收到的请求. handler核心的API是handle方法:

 

Java代码  
  1. public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)  
  2.     throws IOException, ServletException;  
 

这个方法的实现可以处理请求,传递请求到另外一个处理器(或者servlet),或修改并包装请求并传递出去。有三种类型的处理器:

  1. Coordinating Handlers - 负责路由请求到其他处理器的处理器(eg HandlerCollection, ContextHandlerCollection)
  2. Filtering Handlers - 负责增加请求并传递到其他处理器的处理器(eg. HandlerWrapper, ContextHandler, SessionHandler)
  3. Generating Handlers - 负责产生内容的处理器(eg ResourceHandler and ServletHandler)

Handler代码如下

Java代码  
  1. Handler handler=new HelloHandler();  
  2. server.setHandler(handler);  
  3.   
  4.  public static class HelloHandler extends AbstractHandler  
  5.     {  
  6.         public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException  
  7.         {  
  8.             Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest();  
  9.             base_request.setHandled(true);  
  10.   
  11.             response.setContentType("text/html");  
  12.             response.setStatus(HttpServletResponse.SC_OK);  
  13.             response.getWriter().println("<h1>Hello OneHandler</h1>");  
  14.         }  
  15.     }  
 

Servlets

Context

Contexts是一种处理器,负责组织其他特定URI上下文路径或者一个虚拟机的处理器。通常情况下一个上下文必须有:

  • 一个上下文路径,负责通过上下文定义哪一个请求被处理。 (eg /myapp )
  • 一个基于静态内容的资源(a docroot)
  • 一个类加载器去获得指定上下文中的类(通常在docroot/WEB-INF/classes下)
  • 虚拟机名称

上下文实现包括:

  •  ContextHandler
  • Servlet Context
  •  a Web Application Context

Context示意代码:

Java代码  
  1. ContextHandler context = new ContextHandler();  
  2. context.setContextPath("/");  
  3. context.setResourceBase(".");  
  4. context.setClassLoader(Thread.currentThread().getContextClassLoader());  
  5. server.setHandler(context);  
 

Web Applications

Jetty的架构 - Gui Xun Long - Hello Java
 
一个WebAppContext是servlet Context的子类,它提供web应用程序标准的层次结构,以及session, security, listeners, filter, servlets 和JSP的配置。
Java代码  
  1. WebAppContext webapp = new WebAppContext();  
  2. webapp.setContextPath("/");  
  3. webapp.setWar(jetty_home+"/webapps/test");  
  4. webapp.setDefaultsDescriptor(jetty_home+"/etc/webdefault.xml");  
  5.   
  6. server.setHandler(webapp);  

转载地址:http://hiokb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】278-First Bad Version
查看>>
【LEETCODE】303-Range Sum Query - Immutable
查看>>
【LEETCODE】21-Merge Two Sorted Lists
查看>>
【LEETCODE】231-Power of Two
查看>>
【LEETCODE】172-Factorial Trailing Zeroes
查看>>
【LEETCODE】112-Path Sum
查看>>
【LEETCODE】9-Palindrome Number
查看>>
【极客学院】-python学习笔记-Python快速入门(面向对象-引入外部文件-Web2Py创建网站)
查看>>
【LEETCODE】190-Reverse Bits
查看>>
【LEETCODE】67-Add Binary
查看>>
【LEETCODE】7-Reverse Integer
查看>>
【LEETCODE】165-Compare Version Numbers
查看>>
【LEETCODE】299-Bulls and Cows
查看>>
【LEETCODE】223-Rectangle Area
查看>>
【LEETCODE】12-Integer to Roman
查看>>
【学习方法】如何分析源代码
查看>>
【LEETCODE】61- Rotate List [Python]
查看>>
【LEETCODE】143- Reorder List [Python]
查看>>
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>