Servlet工作原理初识
来源:互联网 发布:网络授课平台 编辑:程序博客网 时间:2024/05/22 02:31
1. Servlet容器
Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:
在Tomact容器等级中,Context容器直接管理Servlet在容器中的包装类Wrapper,每个Context对应一个Web项目,所以Context如何运行直接影响到Servlet的运行。
1.2 Servlet容器的启动过程
下面这段代码描述了将一个Web工程添加到Context容器中:
public Context addWebapp(Host host, String url, String name, String path) { silence(host, url); Context ctx = new StandardContext(); //创建一个context ctx.setName(name); ctx.setPath(url); ctx.setDocBase(path); //设置一系列参数 ctx.addLifecycleListener(new DefaultWebXmlListener()); //添加Listener ContextConfig ctxCfg = new ContextConfig(); //创建web配置类 ctx.addLifecycleListener(ctxCfg); // prevent it from looking ( if it finds one - it'll have dup error ) ctxCfg.setDefaultWebXml(noDefaultWebXmlPath()); if (host == null) { getHost().addChild(ctx); } else { host.addChild(ctx); //将context添加到host中 } return ctx; }
在上述代码中,创建了一个context,并且设置了一些必要的参数。其中最重要的配置是ContextConfig,这个类将会负责整个Web应用的解析工作。其会负责整个Web应用的配置文件的解析工作,如下:
ContextConfig的init方法将会主要完成以下工作:
1.创建用于解析XML配置文件的contextDigester对象。
2.读取默认的context.xml配置文件,如果存在则解析它。
3.读取默认的Host配置文件,如果存在则解析它。
4.读取默认的context自身的配置文件,如果存在则解析它。
5.设置context的DocBase。
执行完init方法后,context容器将会执行startInternal方法,主要晚餐一下工作:
1.创建读取资源文件的对象。
2.创建ClassLoader对象。
3.设置应用的工作目录。
4.启动相关的辅助类,如logger,realm,resources等。
5.修改启动状态,通知感兴趣的观察者。
6.子容器的初始化。
7.获取ServletContext并设置必要的参数。
8.初始化“load on startup“的Servlet。
2.创建Servlet实例
前面已经完成了Servlet的解析工作,并且被包装成StandardWrapper添加在Context中,接下来就是Servlet的实例化和初始化。
创建Servlet实例的方法是从Wrapper.loadServlet开始的。loadServlet方法要完成的就是获取servletClass,然后把它交给InstanceManager去创建一个基于servletClass.class的对象。
初始化Servlet是调用Wrapper.initServlet方法,这个方法就是调用了Servlet的init方法,同时把包装了StrandardWrapper对象的StrandardWrapperFacade作为ServletConfig传给Servlet。如下代码:
//创建Servlet方法 public synchronized Servlet loadServlet() throws ServletException { ............... //省略部分代码 Servlet servlet; try { long t1=System.currentTimeMillis(); ............... //省略部分代码 InstanceManager instanceManager = ((StandardContext)getParent()).getInstanceManager(); //获取InstanceManager try { servlet = (Servlet) instanceManager.newInstance(servletClass); //创建Servlet ............. //省略部分代码 initServlet(servlet); //初始化Servlet ............. //省略部分代码 return servlet; }
3. Servlet体系结构
如图:
由图可知,与Servlet主动关联的是三个类ServletConfig,ServletReuqest,ServletResponse。这三个类都是通过容器传递给Servlet的,其中ServletConfig在Servlet初始化就传给Servlet了,其它两个是在请求时传递给Servlet。ServletConfig是为了获取Servlet的一些配置属性,而ServletContext是为模块交换数据提供交易场景。
4.Servlet如何工作
用户发起一个请求到服务器,服务器是如何根据URL来到正确的Servlet容器中呢。在Tomact中映射工作是通过一个专门的mapper类来完成,这个类保存了Tomact的Container容器中的所有子容器的信息,在请求进入Request进入Container容器之前,Mapper将会根据这次请求的hostname和contextPath将host和context容器设置到Request的mappingData属性中。Request的Mapper类图如下:
5.Servlet的生命周期
Servlet生命周期:加载,实例化,服务,销毁。
在Servlet接口中有如下三个方法:
1.init(ServletConfig config):在Servlet的生命周期中执行一次,在服务器装入Servlet是执行,负责初始化Servlet。
2.Service()方法:它是Servlet的核心,负责响应用户的请求。HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3.destroy():当Servlet从容器中移除的时候调用,也就表明Servlet的生命周期结束了。
本篇文章是参考《深入分析JavaWeb技术内幕》
- Servlet工作原理初识
- Servlet容器工作原理
- Servlet容器工作原理
- Servlet容器工作原理
- Servlet 工作原理解析
- Servlet工作原理
- Servlet 工作原理解析
- Servlet工作原理
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet工作原理
- Servlet 工作原理解析
- Servlet 工作原理解析
- Servlet 工作原理解析
- 如何在ubuntu下快速的把视频流分割成图片
- (安卓APP)利用NavigationView做的侧滑菜单案例
- Windows batch编程常用语法及命令介绍
- tensorflow安装的时候,没有su权限,即使利用anaconda虚拟环境,pip仍没有权限的问题
- Spring面试题常问的Top25
- Servlet工作原理初识
- window API播放pcm格式音频文件,函数waveOutOpen等
- 网格去噪的几种算法(利用Laplacian矩阵)
- c++ 宏
- JDBC中连接池的概述(DataSource)
- scatter函数绘制散点图——MATLAB
- 神经网络的可视化
- org.hibernate.exception.SQLGrammarException: could not extract ResultSet
- CSS 基础