1 Servlet基本生命周期

一个Servlet是HttpServlet的子类,由支持Servlet的服务器完成该子类的对象初始化的工作。当有多个客户端请求同一个Servlet时候,servlet引擎就会为每个客户端启动一个线程来处理连接。

Servlet容器一般采用“单实例,多线程”的方式管理Servlet,即Servlet容器只会创建一个Servlet实例,针对不同的用户访问将开启不同的线程运行service方法,每个线程调用的service方法都在各自由JVM分配的内存地址中独立运行,Servlet容器一般会维护一个线程池去管理这些线程。

Servlet的生命周期有三个过程:

1)初始化Servlet。当Servlet第一被请求加载的过程中,服务器先初始化这个Servlet,创建一个Servlet对象,这个对象会调用init方法完成必要的初始化工作。

2)诞生的Servlet对象再次调用Service方法来响应客户端的请求。

3)当服务器关闭的时候,调用Destroy方法,消灭该Servlet对象。

Init方法只会被调用一次,即在Servlet第一次被请求加载的时候调用,当后续的客户请求Servlet服务器的时候,Web服务器将启动一个新的线程,在该线程中Servlet将会调用Service方法来响应请求。

Publicvoid init(ServletConfig config)throws ServletException

当Servlet第一杯请求加载的时候,服务器初始化一个Servlet,创建一个Servlet对象,这个对象调用init方法完成一些必要的初始化工作。Servlet引擎会把ServletConfig类型的对象传递给init方法,这个对象就被保存在Servlet对象中了,直到被消灭掉,这个ServletConfig负责向Servlet传递一些服务设置信息。

由于每个客户请求一个Servlet的时候,都是从唯一一个已经创建的Servlet对象来出启动一个单独的线程为客户端服务,所以该Servlet类的成员变量被所有线程所共享。

publicvoid service(HttpServletRequest request

HttpServletResponse  response) throw ServletException,IOException

当 servlet 成功创建和初始化之后,servlet就调用 service 方法来处理用户的请求并返回响应。Servlet 引擎将两个参数传递给该方法,一个HttpServletRequest类型的对象,该对象封装了用户的请求信息,此对象调用相应的方法可以获取封装的信息,即这个对象可以获取用户提交的信息。另外一个参数对象是HttpServletResponse类型的对象,该对象用来响应用户的请求。service 方法可能被多次的调用,当后续的客户请求 servlet 服务时,Servlet引擎将启动一个新的线程,在该线程中,servlet 调用 service 方法响应客户的请求,也就是说,每个客户的每次请求都导致 service方法被调用执行,调用过程运行在不同的线程中,互不干扰。

protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException, IOException

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException

HttpServlet 除了 init、service、destroy 方法外,该类还有两个很重要的方法:doGet和doPost,用来处理客户的请求并作出响应。当服务器引擎第一次接受到一个servlet请求时,会使用init方法初始化一个servlet,以后每当服务器再接受到一个servlet 请求时,就会产生一个新线程,并在这个线程中调用service 方法检查 HTTP 请求类型(Get 、Post 等),并在 service 方法中根据用户的请求方式,对应地再调用 doGet 或 doPost 方法。因此,在 servlet 类中,我们不必重写 service 方法来响应客户,直接继承 service 方法即可。我们可以在 servlet 类中重写doPost 或 doGet方法来响应用户的请求,这样可以增加响应的灵活性,并降低服务器的负担。

如果不论用户请求类型是 Post 还是 Get,服务器的处理过程完全相同,那么我们可以只在doPost 方法中编写处理过程,而在doGet 方法中再调用 doPost 方法即可,或只在doGet方法中编写处理过程,而在 doPost 方法中再调用doGet 方法。

2  Servlet的基本配置说明

一个HttpServlet需要有特定的部署描述符(web.xml指定其特征:其定义如下:
<servlet>

<servlet-name>Tst</servlet-name>

<servlet-class>test.TestServlet</servlet-class>

<init-param>

  <param-name>someKey</param-name>

  <param-value>someValue</param-value>

</init-param>

<load-on-startup>0</load-on-startup>

 </servlet>

<servlet-mapping>

<servlet-name>Tst</servlet-name>

<url-pattern>/test</url-pattern>

</servlet-mapping>

  1. <servlet-name>子元素指定Serlvet的名称,作为该Servlet的唯一标识。

  2. <servlet-class>子元素指定所对应的Servlet类。

  3. <init-param>子元素用 于定义所谓基于键-值对的初始化参数,Servlet对象可以通过调用ServletConfig对象的getInitParameter(String name)获取制定指定键的对应值。可以有多个元素,用于定义Servlet在工作时要获取的某些初始化信息(如:要读取的某些属性文件的路径等)。

  4. <load-on-startup>子元素用于指定在Servlet容器启动时即创建该Servlet对象, 还是在Serlvet容器接收到针对该Servlet的请求后再实例化该Servlet对象。它的值为负数时采取后一种策略,它的值为0或正数时采取前一种策略。web.xml中可能会定义多个为正数的Servlet,Servlet容器会根据其值得大小决定其实例化顺序,值小的先实例化,值大的后实例化。

  5. <url-pattern>元素用于把特定的Servlet映射到一个URI地址,当Servlet容器收到针对该地址发出的请求时,就会实例化相应的Servlet对象,并调用其方法。

访问这个配置文件中的Servlet的格式如下,当该servlet的所在项目名为MyTest,假如servlet容器为Tomcat,即http://localhost:8080/MyTest//test.

3  关于JSP与Servlet
准确的说,JSP就是Servlet,JSP是一个标准的文本文件,在第一次访问时,Servlet会将该文件“翻译”成Servlet,然后再实施调用。不同的应用服务器会有不同的翻译方式。

在Tomcat中全局的conf/Web.xml中定义了翻译JSP的配置,JspServlet负责翻译所有的JSP,其配置如下:

<servlet>

<servlet-name>jsp</servlet-name>

<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

<init-param>

<param-name>fork</param-name>

<param-value>false</param-value>

</init-param>

<init-param>

<param-name>xpoweredBy</param-name>

<param-value>false</param-value>

</init-param>

<load-on-startup>3</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>jsp</servlet-name>

<url-pattern>*.jsp</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>jsp</servlet-name>

<url-pattern>*.jspx</url-pattern>

</servlet-mapping>

通过该配置文件可以看出,Tomcat会拦截所有的以后缀名*.jsp或*.jspx的请求,然后将该JSP文件转换翻译为Servlet类。我们可以在Tomcat安装目录下的\work\Catalina下可以找到JSP经过“翻译”后的Java源文件和编译后类文件,假如一个JSP为:view.jsp,则经过“翻译”后的Servlet源文件为:\work\Catalina\localhost\tst\org\apache\jsp\view_jsp.java

通过查看该view.jsp所生成的类,该类名view_jsp,继承了org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase类又是HttpServlet的子类。HttpJspBase在其service方法中调用了_jspService方法,针对特定的jsp页面,Tomcat的JSP引擎将其“翻译”成 HttpJspBase的子类并重写其_jspService方法。该类的很多初始化内容有JSP引擎完成。在JSP中使用<%...%>所书写的Java代码被原样的置于_jspService方法中;另外在JSP中的HTML脚本通过流对象out原样输出。

在_jspService方法中,可以看到,JSP内建对象(request、reponse、application、session等),它们或是_jspService方法的参数变量,或是由JSP引擎在_jspService方法中预先定义好的变量,我们在JSP 的<%...%>中可以直接使用。因为我们编写的JSP最终都会翻译成Servlet类的。

本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1198587

Java中的Servlet基本概述的更多相关文章

  1. 译:Java 中的正则表达式性能概述

    原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...

  2. Java 中的 Servlet&Http&Request

    # 今日内容 : 1. Servlet 2. HTTP 协议 3. Request (就是 Servlet 中 service 方法的 形参. (有这个))     ## Servlet : 1. 概 ...

  3. java 中自定义类的概述

    作业: 描述商品类 Goods 4个属性 商品名字 大小 价格 库存 把商品类放进集合中 小米品牌 大小 价格 库存的数量 都存集合 华为..... 魅族 public class Goods{ St ...

  4. Java中关于Servlet中请求中文乱码及文件下载

    1,Servlet请求响应中文乱码问题 package com.demo.servlet; import java.io.PrintWriter; import java.io.IOException ...

  5. java中加密的方式概述

    加密是用一种特殊的算法改变原有的数据,使未经授权的用户即使获得了已经加密的信息,但不知其解密的方法,仍然无法了解信息的内容.     大体上分为单向加密和双向加密,双向加密又可分为对称加密和非对称加密 ...

  6. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  7. 从同步原语看非阻塞同步以及Java中的应用

    非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...

  8. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  9. Java中jsp和Servlet的区别

    1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务 ...

  10. MyEclipse13中修改Servlet.java源代码

    Servlet.java源代码想要修改的步骤,与低版本的不同废话少说,直接来步骤: 1,在myEclipse的安装目录中搜索com.genuitec.eclipse.wizards文件,如图:选择co ...

随机推荐

  1. jenkins动态切换环境

    一.代码层实现动态切换 1.首先在conftest.py下声明pytest_addoption钩子函数,写法如下 def pytest_addoption(parser): # 设置要接收的命令行参数 ...

  2. SQL Server 语句日期格式查找方法

    1. SQL Server中,处理日期格式和查找特定日期格式方法示例 在SQL Server中,处理日期格式和查找特定日期格式的记录是一个常见的需求.SQL Server提供了多种函数和格式选项来处理 ...

  3. 暑假集训SCP提高模拟10

    我(看着百度百科):我已经知道这场谁组的题了 CTH: 谁 我:你想想,能在模拟赛里塞四道数学题还玩邦的,还能有谁 CTH: 我不知道 我:我不知道 CTH: 我知道了 我:我知道了 我:我是 Bob ...

  4. Python实现多维傅里叶变换

    技术背景 在前面一篇文章中,我们介绍了一维离散傅里叶变换和快速傅里叶变换的基本原理和简单的代码实现.本文补充一个多维傅里叶变换的场景,以及简单的Python实现. 二维傅里叶变换 首先回顾一下上一篇文 ...

  5. SuperMap iServer数据动态更新刷新地图与数据服务

    更新:2022年6月27日 SuperMap iServer 11i 底层修改逻辑,增加智能指针.11i版本不需要以下操作即可实现 一.使用背景 有这么一个需求,后端也就通过SuperMap iDes ...

  6. Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

    在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用.我们来详细解释一下"方法值调用规则"和"方法表达式调用规则&quo ...

  7. ajax发送 put和delete请求

    AJAX发送 PUT和DELETE请求(转载)    转自:https://blog.csdn.net/liuyuanjiang109/article/details/78972644 ajax使用r ...

  8. Linux 进程调度之schdule主调度器

    考虑到文章篇幅,在这里我只讨论普通进程,其调度算法采用的是CFS(完全公平)调度算法. 至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行 一.调度单位简介 ...

  9. MobileNet V2中InvertedResidual实现

    1.为了方便理解其本身结构,找到源码理解一下. 2.论文地址:http://arxiv.org/pdf/1801.04381.pdf 3.V2相比较V1增加了倒残差结构和线性瓶颈层.整个结构按照维度来 ...

  10. 2024年8月中国数据库排行榜:OceanBase攀升再夺冠,达梦跃入三甲关

    在这个炽热的季节,随着巴黎奥运会的盛大开幕,全球将目光聚集在了体育的无限魅力和竞技的巅峰对决上.如同奥运赛场上的激烈角逐,中国数据库界也上演着一场技术与创新的较量,各个数据库产品正在中国乃至全球舞台上 ...