CoderBoy 2019-12-09
摘要:本文主要学习了什么是Servlet,以及如何使用Servlet进行开发。
随着互联网技术的发展,基于HTTP和HTML的web应用急速增长。早期的web应用主要用于浏览新闻等静态页面,用户通过HTTP协议请求服务器上的静态页面,服务器上的web服务器软件接收到请求后,读取URI标示的资源,再加上消息报头发送给客户端浏览器,浏览器负责解析HTML,将结果呈现出来。
然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现服务器端软件增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。早期使用的Web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。使用这种方法,用户单击某个链接或输入网址来访问CGI程序,web服务器收到请求后,运行该CGI程序,对用户请求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给web服务器,web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。
CGI程序在一定程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,SUN公司推出了Servlet技术,作为Java阵营的CGI解决方案。
Servlet是Server+Applet的拼接,它的本意是“服务器端的小程序”,指的是运行在Web应用服务器上的Java程序,与普通Java程序不同,它是运行在支持Java的应用服务器中的,可以对Web浏览器或其他HTTP客户端程序发送的请求进行处理。
从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案。而具体的Servlet容器负责提供标准的实现。
从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了Servlet接口的实现类。
简单来说,Servlet就是用来接收访问服务器的请求,根据请求进行处理,然后返回给客户端处理后的结果。如下图所示:
Servlet对象与普通的Java对象不同,它可以处理Web浏览器或其他HTTP客户端程序发送的HTTP请求,但前提是把Servlet对象布置到Servlet容器中,也就是说,其运行需要Servlet容器的支持。
Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于为请求和响应提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。
Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术推出后,管理和运行Servlet/JSP的容器也称为Web容器。
有了Servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问Servlet,Web服务器接收到该请求后,并不是将请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览器。
通信支持:利用容器提供的方法,可以轻松的让Servlet与Web服务器对话,而不需要自己建立ServerSocket、监听某个端口、创建流等等。容器知道自己与Web服务器之间的协议,所以Servlet不用担心Web服务器和Web代码之间的API,只需要考虑如何在Servlet中实现业务逻辑(如处理一个订单)。
生命周期管理:Servlet容器控制着Servlet的生与死,它负责加载类、实例化和初始化Servlet,调用Servlet方法,以及使Servlet实例被垃圾回收,有了Servlet容器就不需要太多的考虑资源管理。
多线程支持:容器会自动为它所接收的每个Servlet请求创建一个新的Java线程。针对用户的请求,如果Servlet已经运行完相应的HTTP服务方法,这个线程就会结束。这并不是说不需要考虑线程安全性,其实还会遇到同步问题,不过这样能少做很多工作。
声明方式实现安全:利用Servlet容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写到Servlet类代码中。
JSP支持:Servlet容器负责将Jsp代码翻译为真正的Java代码。
根据Servlet容器工作模式的不同,可以将Servlet容器分为以下三类:
1)独立的Servlet容器
当我们使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种Servlet容器的工作模式。
2)进程内的Servlet容器
Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个JVM(Java虚拟机),使得Java容器可以在此JVM中加载并运行Servlet。如有客户端调用Servlet的请求到来,插件取得对此请求的控制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。
3)进程外的Servlet容器
Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。
在Eclipse里面创建一个动态的Web项目:
修改创建的项目名称,然后在选择运行环境的下拉菜单中选择版本,如果没有就点击创建一个新的环境:
在弹出的页面中选择Tomcat的版本,然后点击下一步:
选择Tomcat在电脑上的路径,点击完成:
回到配置动态Web项目的页面,点击下一步:
继续点击下一步:
在页面上勾选创建web.xml文件,然后完成:
至此,动态的Web项目就创建好了,可以看下项目的结构:
未完待续