转自:http://blog.csdn.net/kobejayandy/article/details/20165769
在以前读netty的代码的时候,有一个很重要的东西,那就是pipeline,在上面通过对参数的传递实现了handler的链式调用,在jetty中也涉及到链式的调用,不过它是基于装饰器模式来实现的...与netty的不一样...不过个人觉得还是netty的pipeline更加直观简洁吧.....
HanlderWrapper从类型的名字就大概知道了它是对handler的一种包装....它是jetty实现handler的链式调用的关键环节..
还是先来看看它的继承体系吧:
这里还是先从最开始的接口开始吧,abstractHandler以前已经说过了,这里就不说了。。。
那么直接来看看HandlerContainer的定义吧:
- //handler的容器,用于添加以及移除handler
- public interface HandlerContainer extends LifeCycle
- {
- public void addHandler(Handler handler); //添加handler
- public void removeHandler(Handler handler); //移除handler
- public Handler[] getChildHandlers(); //获取所有额handler
- public Handler[] getChildHandlersByClass(Class byclass); //获取某种类型的handler
- public Handler getChildHandlerByClass(Class byclass); //一个
- }
接口的实现还是比较的简单,无非就是一些添加,移除和获取handler的方法的定义。。。
这里abstractHnalderContainer没啥用。。就不看他了。。直接来看HandlerWrapper的定义吧:
- //其实这是一张装饰器模式的实现,其实这里最终也是为了实现handler的链式调用,感觉还是netty的pipeline实现更为直观简洁
- public class HandlerWrapper extends AbstractHandlerContainer
- {
- private Handler _handler; //用于内装饰的handler
- public HandlerWrapper() {
- super();
- }
- //返回内部的handler
- public Handler getHandler() {
- return _handler;
- }
- //设置handler,这里还需要在server上面激活一些事件
- public void setHandler(Handler handler) {
- try {
- Handler old_handler = _handler; //这里保存以前的handler
- if (getServer()!=null)
- getServer().getContainer().update(this, old_handler, handler, "handler"); //这里其实相当于是激活事件
- if (handler!=null) { //设置handler所属的server
- handler.setServer(getServer());
- }
- _handler = handler; //保存新设置的handler
- if (old_handler!=null) {
- if (old_handler.isStarted()) //如果以前的handler是开启的,那么需要将其停止
- old_handler.stop();
- }
- } catch(Exception e) {
- IllegalStateException ise= new IllegalStateException();
- ise.initCause(e);
- throw ise;
- }
- }
- //添加一个handler,如果以前已经有handler了,那么将原来那个handler加入到这个新的handler中,类似于形成一条链
- public void addHandler(Handler handler) {
- Handler old = getHandler();
- if (old!=null && !(handler instanceof HandlerContainer))
- throw new IllegalArgumentException("Cannot add");
- setHandler(handler);
- if (old!=null) { //如果原来的handler不是空,那么将其放到新的handler当中,让其形成一条链
- ((HandlerContainer)handler).addHandler(old);
- }
- }
- //移除handler
- public void removeHandler (Handler handler) {
- Handler old = getHandler();
- if (old!=null && (old instanceof HandlerContainer)) {
- ((HandlerContainer)old).removeHandler(handler);
- } else if (old!=null && handler.equals(old)) {
- setHandler(null);
- } else {
- throw new IllegalStateException("Cannot remove");
- }
- }
- //当前组件的启动,说白了就是handler的启动
- protected void doStart() throws Exception {
- if (_handler!=null)
- _handler.start();
- super.doStart();
- }
- //停止当前的组件
- protected void doStop() throws Exception {
- super.doStop();
- if (_handler!=null)
- _handler.stop();
- }
- //处理http请求,第一个参数其实就是http请求的path,然后后面是转发类型,这个方法在子类中一般都会重载
- public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {
- if (_handler!=null && isStarted())
- _handler.handle(target,request, response, dispatch);
- }
- //设置当前的server对象
- public void setServer(Server server) {
- Server old_server=getServer();
- super.setServer(server);
- Handler h=getHandler();
- if (h!=null)
- h.setServer(server);
- if (server!=null && server!=old_server)
- server.getContainer().update(this, null,_handler, "handler");
- }
- /* ------------------------------------------------------------ */
- protected Object expandChildren(Object list, Class byClass)
- {
- return expandHandler(_handler,list,byClass);
- }
- }
- 其实看到这里就能够看出来这就是装饰器模式的典型实现而已,,,,通过将handler一层又一层的包起来,调用的时候从外向里一层一层的调用。。。这样也就实现了handler的链式调用。。。
相关推荐
在这个“用jetty8.0写的websocket实现的简单聊天程序”中,我们将深入探讨如何利用Jetty 8.0这个轻量级、高性能的Java Web服务器和Servlet容器来构建WebSocket应用。 Jetty是一个开源的HTTP服务器和Servlet容器,...
Jetty是一个轻量级、高性能的Java Web服务器和Servlet容器,它也支持WebSocket协议,并且集成了一系列WebSocket的API,使得开发者可以轻松地在Java应用中实现WebSocket功能。 在Jetty中实现WebSocket功能,首先你...
除了上述的WebAppContext,Jetty还提供了Handler集成功能,如HandlerList、HandlerWrapper等,可以灵活地管理和组织多个Web应用或Handler。 五、安全性与性能优化 Jetty提供了安全模块,如JAAS认证、SSL/TLS加密等...
NULL 博文链接:https://vista-rui.iteye.com/blog/1386427
**Jetty + Maven Webapp 实现HTTP与HTTPS的简要介绍** 在Web应用程序开发中,Jetty是一个轻量级、高性能的嵌入式Java HTTP服务器和Servlet容器。它被广泛用于快速开发、测试和部署Java Web应用。Maven则是一个项目...
### Jetty的安装与使用 #### 一、Jetty简介 Jetty 是一款开源的、高性能的、基于Java语言的Web服务器,它被广泛应用于开发和生产环境中。Jetty不仅体积小巧,而且功能强大,支持多种协议(如HTTP/1.1、HTTP/2、...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛应用于各种规模的项目,从小型的个人项目到大型的企业级应用。...无论你是新手还是经验丰富的开发者,Jetty都能提供一个理想的平台来实现你的想法。
这个压缩包包含Jetty 8版本的实现及其依赖库,是学习和理解Jetty工作原理,尤其是NIO(非阻塞I/O)和Servlet容器实现的宝贵资源。 Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理...
4. **Jetty与Maven集成**:讲解如何在Maven项目中添加Jetty插件,实现快速的本地开发服务器。 二、Jetty核心概念 1. **Servlet**:深入理解Servlet接口和生命周期,以及如何在Jetty中注册和部署Servlet。 2. **...
Jetty的扩展主要通过实现Handler并将它们添加到Server中完成。所有组件的生命周期管理遵循观察者模式,当特定事件发生时,相关的Listener会被调用,这种设计比Tomcat的LifeCycle更为简洁。 Jetty的Handler体系结构...
4. **与Maven生命周期集成**:Maven Jetty Plugin提供了多个目标(goals),例如`jetty:run`用于启动服务器,`jetty:stop`用于停止服务器,这些目标可以与Maven的生命周期阶段结合,方便地在构建过程中调用。...
jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....
6. **WebSocket支持**:Jetty是最早支持WebSocket的服务器之一,提供了完善的WebSocket API,便于开发实时通信应用。 7. **Maven集成**:由于Jetty项目与Maven紧密集成,开发者可以方便地通过Maven依赖管理来获取和...
- **强大的Maven集成**:Jetty可以轻松地与Maven构建工具集成,方便开发、测试和部署。 - **可扩展性**:Jetty提供了丰富的API和插件机制,开发者可以自定义拦截器、会话管理策略等,以适应特定需求。 总之,Jetty...
jetty-sslengine.jar包含了处理SSL/TLS连接的类和方法,使Jetty能够处理基于SSL的请求,支持数字证书,实现服务器与客户端之间的安全通信。这使得开发人员可以轻松地在Jetty上搭建安全的Web服务,满足诸如电子商务...
这个JAR文件提供了Servlet、Filter和Listener等核心接口,以及与之相关的类。在使用Jetty作为Servlet容器时,通常需要这个API来编写和运行Servlet代码。 jetty-io-9.4.14.v20181114.jar是Jetty的网络I/O库,用于...
2. **jetty-http.jar**:这个库提供了HTTP协议的实现,包括请求和响应的解析与构建。 3. **jetty-servlet.jar**:Servlet是Java Web开发的标准接口,这个jar包包含了Servlet容器的基本功能,如Servlet的加载、注册...
在"jetty内嵌实现"的场景下,我们可以直接将Jetty集成到我们的Java应用中,避免了传统方式下需要将应用部署到独立的Web服务器(如Tomcat)的步骤。这种方式尤其适用于测试、开发环境,甚至小型生产环境,因为它简化...
在选择Jetty时,必须考虑到与Java Development Kit (JDK)的兼容性,因为不同的Jetty版本可能会对应不同版本的JDK。 标题提到的"jetty 适合jdk1.8用的服务器",意味着Jetty 9.4系列是与JDK 1.8(也称为Java 8)兼容...