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 ...
随机推荐
- Linux程序员福利 - 追女友神奇(Linux终端运行炫酷程序)
概述 作为IT人员,给同事的感觉呆板,不会会浪漫,不懂情趣.其实不然,我们可以用我们的技能创造出IT人员独有的浪漫.girlLove脚本就可以实现IT人员的浪漫.girlLove本质上是一个简易的问答 ...
- C# 反射只获取自己定义的属性,不获取父类的属性
PropertyInfo[] p = user.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | Bi ...
- java基础讲解03-----java的结构
前面我们说了java是面向对象的语言,java程序的基本组成单元是类,类中又属性,方法两个部分,每个应用程序都会有一个mian函数,含有main()方法的类,我们称为主类 package Test; ...
- android 中的 Handler 线程间通信
一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public v ...
- unity,set ugui rectTransform anchor by script
如果想用代码实现与下面面板相同的功能 试验可知改变上面选项下面四个值也随之变化: 所以说明二者是一回事儿. 因此,只要通过代码修改RectTransform的anchorMax和anchorMin成员 ...
- 【转载】 使用rman进行坏块修复(ORA-01578、ORA-01110)
[转自]http://blog.itpub.net/21256317/viewspace-1062055/ 使用rman进行坏块修复(ORA-01578.ORA-01110) 2012年的一天,处理的 ...
- zookeeper综述
zk概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.他主要用来解决分布式应用中的数据管理的一 ...
- iOS之设置用户头像的圆角
1. 显示用户头像用UIImageView实现,添加默认图片后效果如下图所示,头像显示为矩形图片. 代码实现: // ViewController.m // SetUserImage // // Cr ...
- 启动tomcat的时候,报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program 的解决方案
解决方法,如下所示: 先看Tomcat的startup.bat,它调用了catalina.bat,而catalina.bat则调用了setclasspath.bat.只要在setclasspath.b ...
- AdapterView 和 RecyclerView 的连续滚动
AdapterView 和 RecyclerView 的连续滚动 android RecyclerView tutorial 概述 ListView 和 GridView 的实现方式 Recycler ...