Servlet初始化及处理HTTP请求
上一篇详细介绍了与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请求的更多相关文章
- (转)Servlet初始化、运行、销毁全部过程
Servlet初始化.运行.销毁全部过程 (2012-07-05 10:41:26) 标签: 杂谈 分类: java基础面试知识 Servlet的生命周期是由servlet的容器来控制的.分为3个阶段 ...
- javaee学习-servlet初始化参数
1.需要定义ServletConfig对象来接收servlet配置的初始化参数. 2.当servlet配置了初始化参数后,web容器在创建servlet实例对象时, 会自动将这些初始化参数封装到Ser ...
- Servlet交互【重定向 与 请求分派】详解
Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
- servlet初始化参数
使用<context-param>标签初始化的参数是被应用程序中所有的servlet所共享.但是有时候我们需要为某一个特定的servlet配置参数,这个时候我们就需要使用servlet初始 ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- springmvc中配置servlet初始化类
<bean id="InitStart" lazy-init="false" init-method="InitSystem" cl ...
- web.xml中servlet初始化参数的设置
<context-param><param-name>param1</param-name><param-value>value1</param- ...
- Servlet的学习之Request请求对象(3)
本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...
随机推荐
- jsfiddle在线測试Html、CSS、JavaScript——http://jsfiddle.net/
jsfiddle在线測试Html.CSS.JavaScript,并展示測试结果 1.选择jQuery1.9.1 2.选择jQuery UI 1.9.2 3.Html <ul id="n ...
- ElasticSearch「1」本地安裝Elasticsearch 6.0.1 + Elasticsearch-head插件
# 下載包 https://www.elastic.co/downloads/past-releases/elasticsearch-6-0-1 https://github.com/mobz/ela ...
- iOS多线程的初步研究(一)-- NSThread
对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NSThread.一般构造NSTh ...
- 刻录车载CD音乐光盘的历程
1.买盘 车载CD播放器不支持读可重复擦写的光盘,所以买了sony的DVD+R 4.7G(它是用来存储数据和视频的),买错了,刻了车载CD播放器也不能播放(苦笑脸#).之后又买CD+R. 2.下载歌曲 ...
- AMQP && MQTT comparision
1. AMQP (Advanced Message Queuing Protocol) 2. MQTT (Message Queuing Telemetry Transport) Introducti ...
- python-数据结构Data Structure1
四种数据结构: 列表list = [val1,val2,val3,val4]字典dict = {key1:val1,key2:val2}元组tuple = (val2,val2,val3,val4)集 ...
- 三款免费的PHP加速器:APC、eAccelerator、XCache比较
前几天给 Nova 的缓存系统添加了 Memcache 支持.但是这玩意儿对个人博客系统来说可能不太合适(哪天 XKLog 推出多用户版本了可能会派上用场),事实上,就我自己试用而言,单机情况下使用 ...
- Event-Souring模式
Event-Sourcing模式使用仅附加存储来记录或描写叙述域中数据所採取的动作,从而记录完整的一系列系列事件,而不是仅存储实体的当前状态.由于存储包括全部的事件,能够用来具体化域对象. Event ...
- Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向 1. 一个伟大的事业必然是过程导向为主 1 1.1. 过程的执行情况(有明确的执行手册及标准) ...
- Android实现微信自己主动抢红包的程序
简单实现了微信自己主动抢红包的服务,原理就是依据keyword找到对应的View, 然后自己主动点击.主要是用到AccessibilityService这个辅助服务,基本能够满足自己主动抢红包的功能, ...