什么是Servlet
Servlet是与JSP—样在服务器端运行的Java应用程序的一种。Servlet与JSP或者CGI一样,当浏览器端有请求则将其结果传递给浏览器。实际上执行JSP文件的时候,首先JSP Container会将其转译为Servlet(*.java)文件,并自动编译解释执行。JSP中使用到的所有对象都将被转换为Servlet或者非Servlet的Java对象,然后被执行,所以执行JSP实际上与执行Servlet是一样的。从JSP的角度去看的话,Servlet实际上是JSP被解释执行的中间过程,即JSP实际上是为了让Servlet的开发显得相对容易而采取的脚本语言形式。简单来说,Servlet就是运行在服务器端的应用程序,Servlet接收来自客户端的请求,将处理结果返回给客户端。
Servlet的优点
功能强大。在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
执行效率高。在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个次要的Java线程处理。而不需要反复启动。这也叫“一次加载多次使用”。在传统CGI中,如果有N个并发的进程对同一CGI程序发出请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需加载一次Servlet类代码。从而可以提高处理速度。
开发难度低。相对于传统的CGI,Servlet有很多例程,可以完成许多功能,如网络缓存、Cookies、还有会话跟踪,自动读取Http表头等功能。开发者在这些功能完备的例程的基础上,轻松地开发功能复杂的Web应用程序。
可移植性好。Servlet是使用Java编写的,所以很好地继承了Java的跨平台性特点。由于ServletAPI的规范很完备,所以几乎所有的主流Web服务器,如Apache、MicrosoftIIS或者WebStar等,都直接或者通过插件支持Servlet。
性能更强。Servlet比CGI有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动等等。
Servlet的用途
一个简单的Servlet可以处理使用HTML FORM在HTTPS上使用POST传递的数据,复杂的Servlet(可能还会使用RMI技术)可以用于实现定单输入和处理系统、生产及库存数据库以及一个可能的联机支付系统。
一个Servlet能并发处理多个请求;他们可以使用在诸如在线会议这样的同步请求支持系统。
Servlet可以转送请求给其他的服务器和Servlet,按照任务类型或组织范围,可以允许被用来在几个服务器中划分逻辑上的服务器。
Servlet编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个Servlet,而且代理者能够在它们之间传送数据。
Servlet与JSP的区别
Servlet是一种在服务器端运行的Java程序,从某种意义上说,它就是服务器端的Applet。所以Servlet可以像Applet一样作为一种插件(Plugin)嵌入到Web Server中去,提供诸如HTTP、FTP等协议服务甚至用户自已定制的协议服务。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的。Servlet与JSP相比有以下几点区别:
编程方式不同
Servlet必须在编译以后才能执行
运行速度不同
Servlet的方法
Servlet一般从Javax包的HttpServlet类扩展而来,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP基本请求的HttpServlet类中的方法service自动地调用。这些方法有: doGet、doPost、doPut、doDelete 、doHead 、doOptions 、doTrace 。
doGet用来处理HTTP的GET请求。这个GET操作仅仅允许客户从HTTP server上取得GET资源。重载此方法的用户自动允许支持方法HEAD。这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。
doPost用来处理HTTP的POST请求。这个POST操作包含了在必须通过此Servlet执行的请求中的数据。由于它不能立即取得资源,所以对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。
doPut用来处理HTTP的PUT请求。此PUT操作模拟通过FTP发送一个文件。对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副作用。
doDelete用来处理HTTP的DELETE请求。此操作允许客户端请求一个从server移出的URL。对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。
doHead用来处理HTTP的HEAD请求。缺省地,它会在无条件的GET方法执行时运行,但是不返回任何数据到客户端。只返回包含内容信息的长度的header。由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。
doOptions用来处理HTTP的OPTIONS请求。此操作自动地决定支持什么HTTP方法。比如说,如果读者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:GET、HEAD、TRACE和OPTIONS。
doTrace用来处理HTTP的TRACE请求。此方法的缺省实现产生一个包含所有在trace请求中的header的信息的应答(response)。在开发Servlet时,多数情况下需要重载此方法。