分析Servlet运行原理

news/2024/7/8 12:40:11

原文链接:http://www.yiidian.com/servlet/servlet-how-work.html

接下来我们有必要了解下Servlet的工作原理,这样才能更好地理解Servlet。本文我们将以之前开发过的Servlet程序来讲解Servlet的内部细节。

1 Servlet基本执行过程

Web容器(如Tomcat)判断当前请求是否第一次请求Servlet程序 。

如果是第一次,则Web容器执行以下任务:

  • 加载Servlet类。

  • 实例化Servlet类。

  • 调用init方法并传入ServletConfig对象
    如果不第一次执行,则:

  • 调用service方法,并传入request和response对象
    Web容器在需要删除Servlet时(例如,在停止服务器或重新部署项目时)将调用destroy方法。

2 Web容器如何处理Servlet请求

Web容器负责处理请求。让我们看看它如何处理请求。

  • 将用户请求与web.xml文件中的Servlet进行映射。
  • 创建请求和响应对象
  • 创建新的线程,并在该线程上调用Servlet的service方法
  • 在public的service方法内部调用protected的service方法
  • protected的service方法根据请求的类型调用doGet方法。
  • doGet方法生成响应并将其传递给客户端。
  • 发送响应后,Web容器将删除请求和响应对象。该线程是继续留在线程池中还是被删除取决于服务器实现。

3 public的service方法部分源码

public的service方法将ServletRequest对象转换为HttpServletRequest类型,而ServletResponse对象转换为HttpServletResponse类型。然后,调用传递这些对象的服务方法。让我们看一下内部代码:

public void service(ServletRequest req, ServletResponse res)  
    throws ServletException, IOException  
{  
    HttpServletRequest request;  
    HttpServletResponse response;  
    try  
    {  
        request = (HttpServletRequest)req;  
        response = (HttpServletResponse)res;  
    }  
    catch(ClassCastException e)  
    {  
        throw new ServletException("non-HTTP request or response");  
    }  
    service(request, response);  
}  

4 protected的service方法部分源码

protected的service方法判断请求的类型,如果请求类型为GET,则调用doGet方法,如果请求类型为POST,则调用doPost方法,依此类推。让我们看一下内部代码:

protected void service(HttpServletRequest req, HttpServletResponse resp)  
        throws ServletException, IOException  
{  
    String method = req.getMethod();  
    if(method.equals("GET"))  
    {  
        long lastModified = getLastModified(req);  
        if(lastModified == -1L)  
        {  
            doGet(req, resp);  
        }   
....  
//rest of the code  
    }  
}  

file

欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com


http://www.niftyadmin.cn/n/2643093.html

相关文章

php 年月日 带星期几,zblogPHP模板加入当天(当前)年月日时间,当天星期几(汉字)...

如上图,今天在写一个zblog模板的时候需要加入当天时间,年月日以及星期几,星期几是汉字表示!年月日:就简单了,直接在zblog模板中写入:今天是:{date(Y年m月d日)}以上输出的就是当天的年…

Python要点总结,我使用了100个小例子!

1静态/动态OR强类型/弱类型 静态类型 vs 动态 编程语言 强类型 vs 弱类型 编程语言 1.1 类型检查 类型检查是一个验证和施加类型约束的过程,编译器或解释器通常在编译或运行阶段做类型检查。例如,你不能拿一个string类型值除以浮点数。 用更简单的术语…

第二阶段个人总结7

项目个人工作总结: 今天是我们团队项目第二次冲刺的第七天 ,个人总结如下: 昨天:进行用户信息修改的设计 今天:文件的搜索设计 遇到的困难:没有遇到什么困难 转载于:https://www.cnblogs.com/GloryYT/p/555…

php 代码编辑,GitHub - yynan555/php_online_coding: 基于PHP的在线服务器代码编辑工具

php_online_coding该项目是以PHP为基础,实现在浏览器中对服务器代码进行在线编辑和查看。DEMO地址 : http://demo.yynan.cn编辑器快捷键快捷键帮助: CtrlAltH搜索批量替换: CtrlF > altEnter 即可选中全部需要替换的内容批量替换: CtrlH找到下一个相同的单词: Al…

使用mutex同步多进程

下面程序的功能是,创建一片共享内存,让父进程和子进程都往里面写数据,但是要求,父进程或者子进程写完后,另一个进程才能开始写,所有就需要同步。 关键点 mutex占用的内存空间必须是共享内存 必须把mutexa…

H3C入门配置

1.初始化,还原出厂配置rest saved-configuration2.设置名称syssysname S13.配置管理IP网关int vlan1undo ip addressqundo int vlan 1 二层交换机要取消vlan1的逻辑虚拟vlan 32int vlan 32ipaddress 10.26.32.224 255.255.255.0 设置交换机IPqiproute-sta…

ubuntu 安装java运行环境,Ubuntu 安装java环境搭建

2、解压文件$ sudo mkdir /usr/lib/jvm$ sudo mv jdk-8u11-linux-x64.tar.gz /usr/lib/jvm/$ cd /usr/lib/jvm/$ sudo tar -zxvf jdk-8u11-linux-x64.tar.gz$ rm ./jdk-8u11-linux-x64.tar.gz3、配置$ sudo gedit /etc/environment报错:(gedit:7473): Gtk-WARNING **: cannot o…

MathType二次偏导怎么表示

求导以及求偏导运算在数学中是很重要的一个部分,尤其是在高等数学中,基本都由函数的导数与偏导组成,很多公式定理也是关于这方面的,如果少了这一部分,数学将会黯然失色。因此在文档中涉及到这些内容时,必然…