上一篇详细介绍了与Servlet相关的几个核心的接口和类,当我们自己写Servlet类时,一般需要继承HttpServlet类,实现init()、doGet()、doPost()等方法。当我们写好Servlet类时,它在什么时候被初始化(init())?什么时候执行doGet()、doPost()等方法?本篇重点介绍这两个问题。

1、Servlet初始化

        之前的一篇《web.xml文件配置详解》中已经说过,我们自己写的Servlet类需要配置在<servlet-class>标签之中,同时还要配置<servlet-name>、<load-on-startup>、<servlet-mapping>等几个标签。下图说明了在web.xml文件中关于servlet配置的内容,<servlet-class>标签中的MainServlet类就是我们自己写的类。

当我们用Tomcat启动整个web项目时,当配置了<load-on-startup>标签并且里面的数字>=0时,会加载MainServlet类,创建MainServlet类的实例,调用init()方法初始化。在init()方法里面可以通过getServletConfig()方法获取ServletConfig对象,然后通过此对象的getInitParameter()等方法获取<init-param>标签里面的配置信息,并对配置文件进行解析,此初始化在整个servlet生命周期中只会进行一次;如果未配置<load-on-startup>标签或数字<0时,Tomcat启动时不会创建MainServlet类的实例,当然也就不会调用init()方法进行初始化,当用户首次访问时会加载类并初始化,所以此时第一次访问时可能会加载很慢。我们在开发中,一般会配置<load-on-startup>标签,如果有多个<servlet>,分别给他们的<load-on-startup>配置不同的值(一般是0、1、2……),Tomcat会按从小到大的顺序依次加载Servlet类。

由于Tomcat容器采用“单实例多线程”的方式处理多个请求的,无论是Tomcat启动时创建MainServlet类的实例,还是用户首次访问时创建MainServlet类的实例,在整个MainServlet类的生命周期中,它的实例都只会创建一次,只会执行一次init()方法初始化。此后当多个用户访问此Servlet的时候,它们共享这一个实例,每个用户都有自己的一个线程,所以是“单实例多线程”。当然,这就可能引发线程安全的问题,以后我会单独介绍Servlet的线程安全问题。

2、处理HTTP请求的过程

当我们用Tomcat成功启动web项目后,就可以在浏览器中输入本地地址,来打开页面(如果配置了<weblcome-file- list>标签会优先加载标签里面的页面显示),如下图所示。

可以看到,在浏览器中输入的地址是“http://localhost:8080/yqzl/product_input.action”,其中“http”是协议名,“localhost”是本地地址,“8080”是server.xml中配置的端口号,“yqzl”是web项目的名字,“product_input.action”是指向的页面。那么浏览器是如何根据地址找到我们的MainServlet类并处理请求呢?下面结合web.xml文件里面的配置说明。

首先根据地址末尾的“product_input.action”找到<url-pattern>(映射地址),即上图中标(1)的行;然后根据这个<url-pattern>就能找到<servlet-name>(servlet名字),即上图中标(2)的行;这个servlet名字(yqzl)与上面的名字相对应,进而找到图中标(3)的行;最后就找到了下面<servlet-class>标签的路径,即上图中标(4)的行,也就找到了我们自己写的MainServlet类。

处理请求时,Tomcat容器会调用HttpServlet类的service(HttpServletRequest req, HttpServletResponse resp)方法,这个方法会判断用户发送的请求类型,是“POST”请求还是“GET”请求或是其他请求,然后根据请求类型执行MainServlet类的doPost()方法、doGet()方法或其他方法。Tomcat容器会将用户请求的数据封装到HttpServletRequest对象中,服务器处理完用户请求之后,将结果信息返回到HttpServletResponse对象中,最终这两个对象作为参数传递到doPost()、doGet()或其他方法中,将结果信息返回到页面显示。以上就是处理请求的大致流程。

zhuanzi https://www.cnblogs.com/Y-oung/p/8428536.html

Servlet初始化及处理HTTP请求的更多相关文章

  1. (转)Servlet初始化、运行、销毁全部过程

    Servlet初始化.运行.销毁全部过程 (2012-07-05 10:41:26) 标签: 杂谈 分类: java基础面试知识 Servlet的生命周期是由servlet的容器来控制的.分为3个阶段 ...

  2. javaee学习-servlet初始化参数

    1.需要定义ServletConfig对象来接收servlet配置的初始化参数. 2.当servlet配置了初始化参数后,web容器在创建servlet实例对象时, 会自动将这些初始化参数封装到Ser ...

  3. Servlet交互【重定向 与 请求分派】详解

    Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...

  4. Servlet(五):请求转发和重定向

    请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...

  5. servlet初始化参数

    使用<context-param>标签初始化的参数是被应用程序中所有的servlet所共享.但是有时候我们需要为某一个特定的servlet配置参数,这个时候我们就需要使用servlet初始 ...

  6. jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失

    jsp当做第二个servlet  request的生命周期   请求 响应  不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束  request的域消失

  7. springmvc中配置servlet初始化类

    <bean  id="InitStart" lazy-init="false" init-method="InitSystem" cl ...

  8. web.xml中servlet初始化参数的设置

    <context-param><param-name>param1</param-name><param-value>value1</param- ...

  9. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

随机推荐

  1. 如何更改Docker默认的images存储位置

    Docker的镜像以及一些数据都是在/var/lib/docker目录下,它占用的是Linux的系统分区,也就是下面的/dev/vda1,当有多个镜像时,/dev/vda1的空间可能不足,我们可以把d ...

  2. Linux 压缩文件的命令行总结

    Linux压缩文件的读取 ·    *.Z       compress 程序压缩的档案: ·    *.bz2     bzip2 程序压缩的档案: ·    *.gz      gzip 程序压缩 ...

  3. java集合框架01——总体框架一览

    java集合框架是java提供的工具包,在java.util.*中,这个包中包含了常用的数据结构:集合.数组.链表.栈.队列.映射等.java集合框架主要可以分为四个部分:List列表.Set集合.M ...

  4. 解决chrome和firefox flash不透明的方法

    透明flash在IE内核的浏览器下正常.在chrome和火狐下不透明了. 解决方法: <object height="377" width="712" c ...

  5. (MVC)从客户端中检测到有潜在危险的 Request.Form 值

    在传统的.net Request验证中 ,只需要在WebConfig HttpRuntime节点 加入 RequestValidateMode 属性,值为2.0(此处2.0并非Framework版本) ...

  6. 删除Git记录里的大文件

    删除Git记录里的大文件 仓库自身的增长 大多数版本控制系统存储的是一组初始文件,以及每个文件随着时间的演进而逐步积累起来的差异:而 Git 则会把文件的每一个差异化版本都记录在案.这意味着,即使你只 ...

  7. Xml+Xslt测试工具

    下载地址:http://download.csdn.net/detail/a497785609/5791359 说明:下载后,修改下Xslt部分的头部:<xsl:stylesheet versi ...

  8. Effective Java-第三章

    第3章 对于所有对都通用的方法 尽管Object是一个具体类,但是设计它主要是为了扩展,它所有的非final方法(equals,hashCode,toString,clone和finalize)都有明 ...

  9. 动态添加定时任务-quartz定时器

    Quartz动态添加.修改和删除定时任务 在项目中有一个需求,需要灵活配置调度任务时间,刚开始用的Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务 ...

  10. matplotlib之设置极坐标起点的位置

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: polar.py #Auth ...