Java中的Servlet基本概述
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>
<servlet-name>子元素指定Serlvet的名称,作为该Servlet的唯一标识。
<servlet-class>子元素指定所对应的Servlet类。
<init-param>子元素用 于定义所谓基于键-值对的初始化参数,Servlet对象可以通过调用ServletConfig对象的getInitParameter(String name)获取制定指定键的对应值。可以有多个元素,用于定义Servlet在工作时要获取的某些初始化信息(如:要读取的某些属性文件的路径等)。
<load-on-startup>子元素用于指定在Servlet容器启动时即创建该Servlet对象, 还是在Serlvet容器接收到针对该Servlet的请求后再实例化该Servlet对象。它的值为负数时采取后一种策略,它的值为0或正数时采取前一种策略。web.xml中可能会定义多个为正数的Servlet,Servlet容器会根据其值得大小决定其实例化顺序,值小的先实例化,值大的后实例化。
<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基本概述的更多相关文章
- 译:Java 中的正则表达式性能概述
原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...
- Java 中的 Servlet&Http&Request
# 今日内容 : 1. Servlet 2. HTTP 协议 3. Request (就是 Servlet 中 service 方法的 形参. (有这个)) ## Servlet : 1. 概 ...
- java 中自定义类的概述
作业: 描述商品类 Goods 4个属性 商品名字 大小 价格 库存 把商品类放进集合中 小米品牌 大小 价格 库存的数量 都存集合 华为..... 魅族 public class Goods{ St ...
- Java中关于Servlet中请求中文乱码及文件下载
1,Servlet请求响应中文乱码问题 package com.demo.servlet; import java.io.PrintWriter; import java.io.IOException ...
- java中加密的方式概述
加密是用一种特殊的算法改变原有的数据,使未经授权的用户即使获得了已经加密的信息,但不知其解密的方法,仍然无法了解信息的内容. 大体上分为单向加密和双向加密,双向加密又可分为对称加密和非对称加密 ...
- Java中的集合框架(上)
Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...
- 从同步原语看非阻塞同步以及Java中的应用
非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- Java中jsp和Servlet的区别
1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务 ...
- MyEclipse13中修改Servlet.java源代码
Servlet.java源代码想要修改的步骤,与低版本的不同废话少说,直接来步骤: 1,在myEclipse的安装目录中搜索com.genuitec.eclipse.wizards文件,如图:选择co ...
随机推荐
- ERROR: Could not determine java version from 'JavaVersion.VERSION_1_8'.
写法原为: compileOptions { sourceCompatibility 'JavaVersion.VERSION_1_8' targetCompatibility 'JavaVersio ...
- Electron32-ViteOS桌面版os系统|vue3+electron+arco客户端OS管理模板
基于electron32+vue3 setup+pinia2桌面端os管理解决方案ElectronVue3OS. vue3-electron32-os全新原创Electron32+Vite5+Vue3 ...
- Angular Material 18+ 高级教程 – Material Form Field
介绍 Form Field 或 Text Field 是 Material Design 独有的设计风格 .它长这样 注:Material Design 管它叫 Text Field,Angular ...
- JavaScript – Modular
前言 我几乎闪过了那几年的 Modular 混乱时代. CommonJS 火的时候, 我没有用 Node.js AMD, CMD 火的时候, 我的项目还小, 加上用了 AngularJS 自带模块功能 ...
- Apache-Shiro <=1.2.4 反序列化漏洞 (代码审计)
一.Apache Shiro 简介: Apache Shiro提供了认证.授权.加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码.并且在实现此目 ...
- 深度DFS 和 广度BFS搜索算法学习
目录 广度优先的动态图 深度优先的动态图 广度和深度的具体步骤 深度和广度的应用场景 图的两种遍历方式: 深度优先遍历(DFS--Depth First Search) 广度优先遍历(BFS--Bre ...
- LeetCode 1397. Find All Good Strings 找到所有好字符串 (数位DP+KMP)
好题- 就是比平时的 hard 难了一些-- 虽然猜出是数位DP了-不过比我之前做的题,好像多了一维,印象中都是一维记录之前状态就够了--然后就没做出-- 至于 KMP 的应用更是神奇,虽然掌握的 k ...
- 47.vue-router的钩子函数
钩子函数就是路由导航守卫 : 有 7 个守卫,分为 3 类 : 全局守卫:在全部的组件生效: beforeEach 全局前置守卫 afterEach 全局后置守卫 解析守卫 组件守卫:在某个组件生效 ...
- C#轻松实现Modbus通信
1.前言 大家好!我是付工.前面给大家介绍了一系列关于RS485与Modbus的知识. 终于有人把RS485说清楚了终于有人把Modbus说明白了通透!终于把ModbusRTU弄明白了这样看来,Mod ...
- 查找大量时序遥感文件缺失、不连贯的成像日期:Python代码
本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计.列出未下载影像所对应的时相的方法. 批量下载 ...