Servlet、Tomcat、JSP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jcsyl_mshot/article/details/81632172

1.servlet的工作过程以及容器的作用

Web服务器习惯处理静态页面,所以需要一个程序来帮忙处理动态请求(如当前时间)。Web服务器程序会将动态请求转发给帮助程序,帮助程序处理后,返回处理后的静态结果给web服务器程序。这样就避免了web服务器程序处理动态页面。Servlet 的本质是一个帮助程序。
什么是servlet?
早期的web应用主要用于浏览新闻等静态页面,用户通过HTTP协议请求服务器上的静态页面,服务器上的web服务器软件接收到请求后,读取URI标示的资源,再加上消息报头发送给客户端浏览器,浏览器负责解析HTML,将结果呈现出来。

然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现服务器端软件增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。早期使用的web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。使用这种方法,用户单击某个链接或输入网址来访问CGI程序,web服务器收到请求后,运行该CGI程序 ,对用户请求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给web服务器,web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。

CGI程序在一定 程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,sun公司推出了servlet技术,作为java阵营的CGI解决方案。

Java servlet(java服务器小程序)是一个基于java技术的web组件,运行在服务器端,它由servlet容器所管理,用于生成动态的内容。Servlet是平台独立的java类,编写一个servlet,实际上就是按照servlet规范写一个java类。Servlet 被编译为平台独立的字节码,可以被动态地加载支持java技术的web服务器中运行。

Servlet容器也叫做servlet引擎,是web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应,Servlet没有main方法,不能独立运行,它必须被部署到servlet容器中,由容器来实例化和调用servlet的方法(如doGet()和doPost()),servlet容器在servlet的生命周期内包容和管理servlet。在jsp技术推出后,管理和运行servlet/JSP的容器也称为web容器。
有了servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问servlet,web服务器接收到该请求后,并不是将请求直接交给servlet,而是交给servlet容器。Servlet容器实例化servlet,调用servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由servlet容器返回给web服务器,web服务器包装这个响应,以HTTP响应的形式发送给web浏览器。

Servlet容器能提供什么?
A 、通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立servetsocket,监听某个端口,创建流等等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考虑如何在servlet中实现业务逻辑(如处理一个订单)。

B、生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。

C、多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
声明方式实现安全:利用sevlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。

D、JSP支持:servlet容器负责将jsp代码翻译为真正的java代码。

容器是如何处理用户请求的了?
1)用户点击一个链接,指向一个servlet而不是一个静态页面。

2)web服务器接到这个请求后转发给容器。容器接着创建两个对象:HttpServletRequest和HttpServletResponse。

3)容器根据请求中的URL找到相应的servlet,为这个请求创建一个线程,并把请求对象HtttpServletRequest和响应对象HttpServletResponse传递给这个servlet线程。

4)线程接下来调用service()方法,根据请求的不同,service()方法调用doGet()和doPost()方法。

5)doGet()方法生成动态页面,并把这个页面塞到响应对象里。

6)service()方法结束,随之线程结束,容器把响应对象装换为一个HTTP相应,发送给客户,然后删除请求和响应对象。

2.Servlet的生命周期

注意他的一生都是由容器控制的。servlet一生中只有一个实例出现,但是有多个线程出现。

  • 加载类 Servlet .class文件
  • 实例化 构造函数运行
  • 初始化 容器调用 init() 方法(一生只调一次)
  • service方法? servlet一生主要在这里度过
  • 销 毁? 销毁实例之前调用 destroy() 方法
  • 可回收? 等待垃圾回收等待垃圾回收

3.Servlet一生中的三大重要时刻
1)init()方法:在servlet实例被创建后调用,可以覆盖此方法做一些初始化的工作,比方说得到一个数据库连接。
2)service()方法:当客户请求到来时,容器会创建一个新的线程,调用servlet的service()方法
3)doGet或者doPost()方法:service方法根据请求的HTTP方法,来调用doGet()或者doPost()方法。我们在开发servlet时肯定要覆盖此方法。每次运行doGet()或者doPost()方法,它都在一个单独的线程中。

4.容器(tomcat)在启动时会做什么?

容器在启动时,会根据相应的部署文件去寻找servlet文件。

5.为什么要有init方法了?难道不能将init代码放在构造函数中么?

因为让一个普通的java类成为servlet文件时容器付出的代价也挺大,比如说内存分配。在没有调用init方法时他还是一个普普通通的java对象,只有在用户使用时才再让他称为servlet这样对资源的利用比较合理,注意:init方法是在第一个用户调用此servlet时被触发。

6.jsp和servlet的区别和联系:

1.jsp经编译后就变成了Servlet.
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.

3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.

Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

相同点:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

不同点:
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

参考文档:http://blog.51cto.com/12038281/2045967

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/81632172