当前位置: 首页 > news >正文

企业网站申请永久开发app怎么盈利

企业网站申请永久,开发app怎么盈利,中山网站建设公司哪家好,在线系统作者#xff1a;不学无数的程序员链接#xff1a;https://urlify.cn/jYZFFf在这篇文章《Tomcat是如何运行的#xff1f;整体架构又是怎样的#xff1f;》中我们简单介绍了容器的概念#xff0c;并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——En… 作者不学无数的程序员链接https://urlify.cn/jYZFFf在这篇文章《Tomcat是如何运行的整体架构又是怎样的》中我们简单介绍了容器的概念并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——EndPoint源码解析中我们知道了连接器将请求过来的数据解析成Tomcat需要的ServletRequest对象给容器。那么容器又是如何将这个对象准确的分到到对应的请求上去的呢# 容器的整体设计Container是容器的父接口所有子容器都需要实现此接口我们首先看一下Container接口的设计。public interface Container extends Lifecycle { public void setName(String name); public Container getParent(); public void setParent(Container container); public void addChild(Container child); public void removeChild(Container child); public Container findChild(String name);}Tomcat是如何管理这些容器的呢我们可以通过接口的设计可以了解到是通过设置父子关系形成一个树形的结构(一父多子)、链式结构(一父一子)来管理的。一想到树形的结构我们应该就立马能够联想到设计模式中的组合模式而链式结构我们应该能够想到设计模式中的责任链设计模式。无论这两种的哪一种我们都知道这种关系是上下层级的关系。用图来表示就是如下。既然是父子的结构那么连接器是如何将转换好的ServletRequest给到容器的呢我们可以看CoyoteAdapter中的service方法。因为在连接器中最后一环是将解析过的Request给到Adapter运用适配器设计模式解析为ServletRequest对象。在service方法中我们看到有这么一句。connector.getService().getContainer().getPipeline().getFirst().invoke(                        request, response);而其中的getContainer方法返回的是Engine对象public Engine getContainer();这里看到了PipelinePipeline应该大家有所熟悉是管道的概念那么管道里面装的是什么呢我们看其定义的方法public interface Pipeline extends Contained { public void addValve(Valve valve); public Valve getBasic(); public void setBasic(Valve valve); public Valve getFirst();}可以看到Pipeline管道里面装的是Valve那么Valve是如何组织起来的呢我们也可以看它的代码定义public interface Valve { public Valve getNext(); public void setNext(Valve valve); public void invoke(Request request, Response response)}可以知道每个Valve都是一个处理点它的invoke就是相对应的处理逻辑。可以看到有setNext的方法因此我们大概能够猜到是通过链表将Valve组织起来的。然后将此Valve装入Pipeline中。因此每个容器都有一个Pipeline里面装入系统定义或者自定义的一些拦截节点来做一些相应的处理。因此只要获得了容器中Pipeline管道中的第一个Valve对象那么后面一系列链条都会执行到。但是不同容器之间Pipeline之间是如何进行触发的呢即例如Engine的Pipeline处理完了最后一个Valve那么如何调用Host的PipeLine管道中的Valve呢我们可以看到每个Pipeline中还有一个方法。setBasic这个方法设置的就是Valve链条的末端节点是什么它负责调用底层容器的Pipeline第一个Valve节点。用图表示就是这样的。# Engine容器Engine容器比较简单只是定义了一些基本的关联关系。它的实现类是StandardEngine。 Override public void addChild(Container child) { if (!(child instanceof Host)) throw new IllegalArgumentException (sm.getString(standardEngine.notHost)); super.addChild(child); } Override public void setParent(Container container) { throw new IllegalArgumentException (sm.getString(standardEngine.notParent)); }需要注意Engine容器是没有父容器的。如果添加是会报错。添加子容器也只是能添加Host容器。# Host 容器Host容器是Engine的子容器一个Host在Engine中代表一个虚拟主机这个虚拟主机的作用就是运行多个应用它负责安装和展开这个应用并且标识这个应用以便能够区分它们。它的子容器通常是Context容器。我们可以看配置文件中也能够看出Host文件的作用。 unpackWARstrue autoDeploytrue那么Host容器在启动时具体干了什么呢我们看它的startInternal方法看不出来什么只是启动了相应的Valve是因为在Tomcat的设计中引入了生命周期的概念即每个模块都有自己相应的生命周期模块的生命周期定义有NEW、INITIALIZING、INITIALIZED、SSTARTING_PREP、STARTING、STARTED每个模块状态的变化都会引发一系列的动作那么这些动作的执行是直接写在startInternal中吗这样会违反开闭原则那么如何解决这个问题呢开闭原则说的是为了扩展性系统的功能你不能修改系统中现有的类但是你可以定义新的类。于是每个模块状态的变化相当于一个事件的发生而事件是有相应的监听器的。在监听器中实现具体的逻辑监听器也可以方便的增加和删除。这就是典型的观察者模式。那么Host容器在启动的时候需要扫描webapps目录下面的所有Web应用创建相应的Context容器。那么Host的监听器就是HostConfig它实现了LifecycleListener接口public interface LifecycleListener { public void lifecycleEvent(LifecycleEvent event);}接口中只定义了一个方法即监听到相应事件的处理逻辑。可以看到在setState方法中调用了监听器的触发。protected void fireLifecycleEvent(String type, Object data) { LifecycleEvent event new LifecycleEvent(this, type, data); for (LifecycleListener listener : lifecycleListeners) { listener.lifecycleEvent(event); }}所以容器中各组件的具体处理逻辑是在监听器中实现的。# Context 容器一个Context对应一个Web应用Context代表的是Servlet的Context它具备了Servlet的运行的基本环境。Context最重要的功能就是管理它里面的Servlet实例Servlet实例在Context中是以Wrapper出现的。Context准备运行环境是在ContextConfig中lifecycleEvent方法准备的。Overridepublic void lifecycleEvent(LifecycleEvent event) { // Identify the context we are associated with try { context (Context) event.getLifecycle(); } catch (ClassCastException e) { log.error(sm.getString(contextConfig.cce, event.getLifecycle()), e); return; } // Process the event that has occurred if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) { configureStart(); } else if (event.getType().equals(Lifecycle.BEFORE_START_EVENT)) { beforeStart(); } else if (event.getType().equals(Lifecycle.AFTER_START_EVENT)) { // Restore docBase for management tools if (originalDocBase ! null) { context.setDocBase(originalDocBase); } } else if (event.getType().equals(Lifecycle.CONFIGURE_STOP_EVENT)) { configureStop(); } else if (event.getType().equals(Lifecycle.AFTER_INIT_EVENT)) { init(); } else if (event.getType().equals(Lifecycle.AFTER_DESTROY_EVENT)) { destroy(); }}# Wrapper容器Wrapper容器代表一个Servlet包括Servlet的装载、初始化、执行以及资源的回收。Wrapper是最底层的容器它没有子容器。Wrapper的实现类是StandardWrapper主要任务是载入Servlet类并进行实例化。但是StandardWrapper类并不会调用Servlet的service方法。而是StandardWrapperValue类通过调用StandardWrpper的allocate方法获得相应的servlet然后通过拦截器的过滤之后才会调用相应的Servlet的service方法# 总结Tomcat的容器中有许多值得我们学习的设计思想例如将不变的抽取出来然后变化的子类来实现的模板设计模式、维护一堆父子关系的组合设计模式、事件的发生伴随监听者的相应动作执行的观察者设计模式等等。在学习框架的时候有时没必要深究里面一行一行的代码而要学习它的思想。知道它是如何运行随后如果查找问题或者是对框架进行相应扩展。这时候再深入学习里面的代码将会事半功倍。 往期推荐 ?转给你的老板如何给程序员更少的薪水20年3月数据库排行榜v2ex飞机上用的是什么操作系统点击
http://www.pierceye.com/news/649889/

相关文章:

  • 如何做免费网站制作郑州网站建设搜索优化
  • 北京网站制作17页谈谈对seo的理解
  • 西安专业建网站网站可信度必须做吗
  • 做神马网站如何做网站的推广
  • 如何提高网站排名的方法建设一个商业网站费用
  • 电商网站平台有哪些做自己的第一个网站
  • 源码资源下载站百度指数 多少流量 网站名
  • 合肥比较好的网站建设公司青阳网站建设
  • 上海地产网站建设甘肃建设厅网站二级建造师报名时间
  • 扬州网站建设推广泊头网站建设甘肃
  • 什么行业要做网站建设推广这些水墨网站设计欣赏
  • 渠道网站wap百度
  • 在网站上如何做天气预报栏wordpress 分类列表
  • 做网站需要投资多少钱做网站的销售团队
  • 苏州哪个公司做门户网站seo优化方案报价
  • 电力建设官方网站做网站送优化
  • 门户网站建设模式包括网站群和中企动力企业邮箱登陆首页
  • 做调查网站的问卷哪个给的钱高wordpress邮箱注册功能
  • 上海php网站开发基于php网站建设
  • 大丰专业做网站做旅游网站当地人服务赚钱吗
  • 长沙网站制作公司推荐seo关键词排名优化
  • 内蒙古住房与城乡建设部网站广州十大软件公司排名
  • 营销型网站 易网拓德阳做网站
  • 网站建设seo虾哥网络购物网站技术实施方案
  • 门户网站框架下载陕西省建设工会网站
  • 网站有信心做的更好做外贸到什么网站上发布比较好
  • wex5做网站wordpress页面的设置
  • 绍兴市建设银行网站网站建设的基本术语
  • 建筑企业网站模板免费下载seo 网站换程序
  • wordpress怎么做排名seo怎么样