大家好,又见面了,我是你们的朋友全栈君。
1. Servlet容器 Servlet是运行Servlet容器的基础之上的,所以了解Servlet工作原理就得先从Servlet容器说起,以Tomact为例:
在Tomact容器等级中,Context容器直接管理Servlet在容器中的包装类Wrapper,每个Context对应一个Web项目,所以Context如何运行直接影响到Servlet的运行。 1.2 Servlet容器的启动过程 下面这段代码描述了将一个Web工程添加到Context容器中:
代码语言:javascript复制 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。如下代码:
代码语言:javascript复制//创建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技术内幕》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185894.html原文链接:https://javaforall.cn