上一篇详细介绍了与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. Hibernate HQL详解

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5606444.html  1.实体查询: hql="FROM ...

  2. Maven的镜像设置

    文件位置 国内的阿里云 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven< ...

  3. Android Studio Note

    1.中文乱码 很多同学都安装了Android Studio,但是发现中文是乱码,其实这个很好解决的.在IDE里点击File,选择Settings...快捷键是Ctrl+alt+s 在打开的窗口中,找到 ...

  4. 文件操作FileStream,Log

    1.关于读写文件,犯的一个低级错误,平常代码拷贝习惯了,就像电脑用多了会提笔忘字一样,所以平常还是要多多用心才好. 这段代码的意图是在文件中写入数据,如果原文件不存在,则先新建. 事实上,当真的执行了 ...

  5. PayPal 对接

    时间:2019-1-29 15:39:39 文章相应链接: 官方SDK:https://developer.paypal.com/docs/api/rest-sdks/ 官方API:https://d ...

  6. SWFupload在IE9以上中的bug

    这几天在做图片上传的东西,是用swfupload是出现了再IE9下那选择文件的按钮无法点击的情况,在其他浏览器,例如Firefox.chrome都不会出现,后来google一下才发下这算是IE9以上和 ...

  7. c# 按位与,按位或

    在工作中遇到按位或组合权限串.一直不是特别明白.今天终于花了半个下午的时间搞明白其中的道理. 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ...

  8. unity5, animator state machine, 无条件transition实现播放动画序列

    今天遇到这样一个需求,我有一个名为happy的animation clip和一个名为speak的animation clip.想实现当主角胜利后播放动序列: happy->speak->h ...

  9. C# LDAP

    Lightweight Directory Access Protocol OpenLDAP

  10. shared-service.ts

    shared-service.ts import { Observable } from 'rxjs/Observable'; import { Injectable } from '@angular ...