资讯专栏INFORMATION COLUMN

Servlet解析

用户83 / 2172人阅读

摘要:自带的方法和方法最为重要主要完成以下工作创建用于解析的配置文件的对象。读取默认的自身的配置文件,如果存在则解析。

JAVA WEB 技术是当今主流的互联网WEB应用技术之一,而Servlet则是JAVA WEB 中的核心基础。最近在看了《深入分析Java Web技术内幕》(许令波 著)这本书发现了以前没有看到的内容,就想对书中的内容进行总结,也方便自己以后的回顾,所以就有了这篇文章。

通过这篇文章你将了解到以下内容:

1.Servlet容器是如何工作
2.web应用中的Servlet如何创建
3.Servlet是如何被调用
Servlet容器的启动

在Tomcat中整个的体系结构中,Context容器直接管理Servlet在容器中的包装类Wrapper,所以Context是真正管理Servlet的容器。通过图我们还可以看出,一个Context对应着一个Web工程。在Tomcat配置文件中就可以看出:

 

既然Context容器如此的重要我们就来了解下Tomcat是如何解析Context容器的。

首先,我们已经知道了Context容器是Tomcat运行时的容器,它只有在添加web应用是被加载。

   public Context addWebapp(Host host, String url, String path) { 
    silence(url); 
    Context ctx = new StandardContext(); 
    ctx.setPath( url ); 
    ctx.setDocBase(path); 
    if (defaultRealm == null) { 
        initSimpleAuth(); 
    } 
    ctx.setRealm(defaultRealm); 
    ctx.addLifecycleListener(new DefaultWebXmlListener()); 
    ContextConfig ctxCfg = new ContextConfig(); 
    ctx.addLifecycleListener(ctxCfg); 
    ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML"); 
    if (host == null) { 
        getHost().addChild(ctx); 
    } else { 
        host.addChild(ctx); 
    } 
    return ctx; 
 }

当一个WEB应用被添加时Tomcat将会创建一个StandardContext容器,并给这个Context容器设置必要的参数,URL和path分别代表这个应用在访问路径和这个应用实际的物理路径。其中最重要的配置就是ContextConfig,这个类非常重要,是负责整个WEB应用的解析工作。

我们就来看看这个ContextConfig:

ContextConfig继承了LifecycleListener接口,它是在调用addWebApp方法时被加入到StandardContext容器中的,负责整个web应用的配置文件解析工作。
自带的init()方法和startInternal()方法最为重要
1.init()主要完成以下工作
    -创建用于解析的XML配置文件的contextDisester对象。
    -读取默认的context.xml配置文件,如果存在则解析。
    -读取默认的Host配置文件,如果存在则解析。
    -读取默认的Context自身的配置文件,如果存在则解析。
    -设置Context的DocBase。
2. startInternal()方法
    -创建读取资源文件的对象
    -创建ClassLoader对象。
    -设置应用的工作目录。
    -启动相关的辅助类。
    -修改启动状态,通知感兴趣的观察者。
    -子容器的初始化。
    -获取ServletContext并设置必要的参数
    -初始化“load on startup”的Servlet。

最后将这个Context容器添加到父容器中,然后就是调用Tomcat的start方法启动Tomcat。这样就完成了整个WEB应用加载的前期工作。

WEB应用的初始化

学过Javaweb基础的同学应该知道,web.xml是我们整个web工程中不可缺少的一个部分,如果你的项目中缺少了它,可能就会导致一些
必要的BUG。同时,整个web应用的初始化主要也是解析这个文件,因为这个文件描述了你的web项目中一些关键信息,也是整个web项目的入口。

接下来我们来看下Tomcat是如何加载到这个如此重要的配置文件的。

1.首先会找到globalWebXml
2.接着会找到hostWebXml
3.最后是寻找应用的配置文件web.xml

完成以上的步骤之后,Tomcat会将web.xml中的相应属性保存到WebXml对象中。现在很多的后台web应用都已经升级到Servlet3.0了,如果你的项目也支持了这个版本,那么在解析配置文件的时候,还要完成Servlet3.0中新增的特性的解析以及对annotat的支持。Servlet3.0在这里就不多介绍了,他不是本文的重点内容。

将属性存入WebXml对象后,也将相关的属性设置到Context容器中,这些属性包括Servlet,listener,filter,其中Servlet被包装成具有容器属性的StandardWrapper。

看到这里我们来对web.xml的作用进行一个总结

    
1.web应用的解析入口
2.作为用来指定context容器属性的配置文件
Servlet的创建与初始化

首先我们来看看Tomcat是如何创建Servlet:
创建Servlet实例的方法是从Wrapper.loadServlet开始的,这个方法要完成的就是获取servletClass,然后交给InstanceManager去创建一个基于servletClass.class的对象。

如果在web.xml中配置了 。。。。这个参数的话,在创建Servlet时初始化的就不是你自己编写的JAVA类了,而是conf/web.xml中的org.apache.jasper.servlet.JspServlet。

Servlet的初始化操作是在StandardWrapper的initServlet方法中完成的,作用就是调用Servlet的init(),同时将StandardWrapperFacade作为ServletConfig传给Servlet。

    
StandardWrapperFacade的作用就是从StandardWrapper中拿到的数据只是ServltConfig中规定的数据,而不把不关心的数据暴露给Servlet,起到了对数据封装的作用。

如果初始化的是JspServlet,那Tomcat会模拟一次请求,去请求这个JSP文件,为的是将这个jsp文件编译成类,并初始化这个类,用于后面的使用。

Servlet如何工作

在前面的内容中我们了解了Servlet的加载、创建、初始化,下面的内容中我们就来看看Servlet是如何被调用的。

用户向服务器发送请求通常包含的信息:

http://hosthome:port/contextpath/servletpath
其中 hosthome 和 port 用于与服务器建立TCP连接,而后面的URL则是用户请求服务器中的某个子容器的数据。

我们以Tomcat这个常用的容器来说明服务器是如何根据这个URL找到正确的Servlet容器。

在Tomcat中这种映射工作是由org.apache.tomcat.util.http.mapper这个专门的类去处理的。
这个类保存了Tomcat的Container容器中所有子容器的信息,当请求的Request类进入Container容器之前,
Mapper将会根据这次请求的hostname和contextPath将host和context容器设置到Request的mappingData属性中。

所以在请求进入容器之前就已经知道要访问那个子容器。

在知道要访问那个子容器后,接下来就是要执行Servlet的service方法。我们通常的做法就是不继承javax.servlet.servlet接口更为简单的HttpServlet类。
但是现在的WEB应用已经直接使用Servlet来完成用户的交互逻辑了,而是使用更为高效的MVC框架来完成这些任务。
而这些框架的入口也是Servlet的Service方法。

当Servlet从Servlet容器中移除时,也就说明Servlet的生命周期就结束了,这时Servlet的destroy方法将被调用,做一些扫尾工作。

写在最后

这篇文章是我的第一篇文章,如果有写的不好的地方,请各位大佬轻喷,小弟再此跪谢了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69902.html

相关文章

  • 7.2、使用基于 Servlet 3.0 的文件上传

    摘要:本文示例见这个项目的分支下的项目这个项目是为本文单独建立的。的内置支持用于处理应用程序中的文件上传。提供了一个的实现,使用了的和一些其他的东西,用于对的请求的解析。首先,创建一个带有的表单,这样用户就可以通过这个表单上传文件了。   本文示例见这个项目的 upload 分支下的项目(这个项目是为本文单独建立的)。   WARNING:本文中有一部分直接把英文原文搬过来了,我的翻译能力实...

    KevinYan 评论0 收藏0
  • Spring MVC概念

    摘要:在中,就是前端控制器的任务是将请求发送给控制器。处理器映射会根据请求所携带的信息来进行决策一旦选择了合适的控制器,会将请求发送给选中的控制器。这些信息被称为模型。因此无需在配置类中显式声明任何的控制器具体来讲是试图解析器。 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,能够构建像Spring框架那样灵活和松耦合的Web应用程序...

    lindroid 评论0 收藏0
  • [转]Apache与Tomcat 区别及联系

    摘要:原文链接和都是网络服务器,两者既有联系又有区别,在进行等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置。侧重于,侧重于引擎,如果以方式运行,功能上与等效支持,但对静态网页不太理想。 原文链接Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML、PHP、JSP、Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置。   Apa...

    Lsnsh 评论0 收藏0
  • [闹着玩-2]spring-mvc 主要流程

    摘要:源码仓库本文仓库三层结构表现层模型业务层持久层工作流程用户前端控制器用户发送请求前端控制器后端控制器根据用户请求查询具体控制器后端控制器前端控制器处理后结果前端控制器视图视图渲染视图前端控制器返回视图前端控制器用户响应结 SpringMvc 【源码仓库】【本文仓库】 三层结构 表现层 MVC模型 业务层 service 持久层 dao 工作流程 用户->前端控制器:用户...

    fuchenxuan 评论0 收藏0

发表评论

0条评论

用户83

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<