前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet 如何工作

Servlet 如何工作

作者头像
JavaEdge
发布2018-05-16 10:57:37
6280
发布2018-05-16 10:57:37
举报
文章被收录于专栏:JavaEdgeJavaEdge

我们已经清楚了 Servlet 是如何被加载的、初始化及其体系结构,现在的问题就是它是如何被调用的.

用户从浏览器向服务器发起的一个请求通常会包含如下信息 http://hostname: port /contextpath/servletpath

  • hostname 和 port:与服务器建立 TCP 连接
  • URL:选择在服务器中哪个子容器服务用户的请求

服务器是如何根据这个 URL 到达正确的 Servlet 容器中的呢?

  • 在 Tomcat7 中这件事很容易解决,因为这种映射工作有专门的一个类来完成 org.apache.tomcat.util.http.mapper. 该类保存了 Tomcat 的 Container 容器中所有子容器的信息. 在org.apache.catalina.connector.Request 类进入 Container 容器之前,mapper 会根据这次请求的 hostnanecontextpathhostcontext 容器设置到 RequestmappingData 属性中,如下图所示. 所以当 Request进入 Container 容器之前,它要访问哪个子容器就已经确定了.

Request 的 Mapper 类关系图

可能你有疑问,mapper 中怎么会有容器的完整关系? 这要回到http://upload-images.jianshu.io/upload_images/4685968-f4c4cc6126fe8e14.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700中 第 19 步 MapperListener 类的初始化过程,下面是其的init 方法代码

代码语言:javascript
复制
 public void init() { 
        findDefaultHost(); 
        Engine engine = (Engine) connector.getService().getContainer(); 
        engine.addContainerListener(this); 
        Container[] conHosts = engine.findChildren(); 
        for (Container conHost : conHosts) { 
            Host host = (Host) conHost; 
            if (!LifecycleState.NEW.equals(host.getState())) { 
                host.addLifecycleListener(this); 
                registerHost(host); 
            } 
        } 
 }

这段代码的作用就是将 MapperListener 作为一个监听者加到整个 Container 容器的每个子容器中. 如此,任何一个容器发生变化,MapperListener 都将会被通知到,相应的保存容器关系的 MapperListener 的 mapper 属性也会被修改. 在for 循环中就是将 host 及下面的子容器注册到 mapper 中.

Request 在容器中的路由图

上图描述了一次 Request 请求如何达到最终的 Wrapper 容器. 我们现在知道了请求是如何达到正确的 Wrapper 容器,但在请求到达最终的 Servlet 前还要完成一些步骤,必须要执行 Filter 链以及通知你在 web.xml 中定义的 listener.

接下来就要执行 Servlet 的 service 方法了,通常我们自定义的 servlet 并不直接实现 javax.servlet.servlet 接口,而是去继承更简单的 HttpServlet 或 GenericServlet,我们可以有选择的覆盖相应方法去实现我们要完成的工作.

Servlet 的确已经能够帮我们完成所有的工作了,但是现在的 web 应用很少有直接将交互的全部页面用 servlet 来实现,而是采用更加高效的 MVC 框架来实现. 这些 MVC 框架基本的原理都是将所有的请求都映射到一个 Servlet,然后去实现 service 方法,这个方法也就是 MVC 框架的入口.

当 Servlet 从 Servlet 容器中移除时,也就表明该 Servlet 的生命周期结束,这时 Servlet 的 destroy 方法将被调用,善后.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档