Servlet/JSP深入详解:基于Tomcat的Web开发第一章01要掌握JavaWeb开发,首先就要学会编写Servlet,而要运行Servlet,则需要一个Servlet容器,本书选用的是Tomcat。下面让我们来了解一下Servlet和Tomcat。1.1Web技术的发展随着Internet的发展,基于HTTP协议和HTML标准的Web应用呈几何数量级的增长,人们的生活在不知不觉中已经被网络悄悄地改变了。在网络普及之前,我们购买图书要去书店,给亲人汇钱要去邮局或者银行……而现在,一切都是这么便捷,你可以在网上购买图书、汇款、缴纳电话费,你甚至可以为远在他乡的女朋友订购一束玫瑰。各种各样的网上业务丰富了我们的生活,节省了我们的时间,提高了我们的工作效率,改善了我们的生活品质。支撑这些网上业务的就是各种各样的Web应用,而这些Web应用又是用各种Web技术开发的。早期的Web应用主要是静态页面的浏览(如新闻的浏览),这些静态页面使用HTML语言来编写,放在服务器上;用户使用浏览器通过HTTP协议请求服务器上的Web页面,服务器上的Web服务器软件接收到用户发送的请求后,读取请求URI所标识的资源,加上消息报头发送给客户端的浏览器;浏览器解析响应中的HTML数据,向用户呈现多姿多彩的HTML页面。整个过程如图1-1所示。图1-1浏览器请求静态页面随着网络的发展,很多线下业务开始向网上发展,基于Internet的Web应用也变得越来越复杂,用户所访问的资源已不仅仅局限于在服务器硬盘上存放的静态网页,更多的应用需要根据用户的请求动态生成页面信息,复杂一些的还需要从数据库中提取数据,经过一定的运算,生成一个页面返回给客户。例如,笔者通过Web浏览器想要查询本公司一年的销售报表,这个销售报表是根据一年的销售数据得出的,而这一年的销售数据非常多,通常都是存储在数据库中,当Web服务器端软件接收到客户端的请求,就需要从数据库中提取一年的数据,然后按照一定的统计规则,通过计算生成报表页面,发送到请求者的Web浏览器端。类似于上述的应用还有很多,要为用户提供各种各样的增强功能,就需要我们在Web服务端通过软件来实现。可是这种实现,如何才能完成呢?了解HTTP协议的读者,可能会想到,可以遵循HTTP协议实现一个服务器端软件,提供增强功能。想法本身没有错误,但是由于HTTP协议服务器端的实现较为复杂,需要考虑很多方面,而且由于应用的广泛性,不可能针对每一种应用都去实现这样的一个HTTP服务器,所以这种方法在现实中不太可行。还有一种方法,就是利用已经实现HTTP协议的服务器端软件,而这些软件预先为我们留出了扩展的接口,我们只需要按照一定的规则去提供相应的扩展功能。当这类Web服务器接收到客户请求后,判断请求是否是访问我们提供的扩展功能,如果是,就将请求交由我们所编写的程序去处理。当处理完成后,程序将处理结果交回Web服务器软件,Web服务器软件拿到结果信息后,再将结果作为响应信息返回给客户端。第二种方式的好处在于,我们不需要对HTTP协议有过多的了解,HTTP协议服务器端的实现已经由Web服务器软件完成了,我们只需要根据我们的应用去开发相应的功能模块,然后将这些功能模块按照你所采用的Web服务器软件的要求,部署到Web服务器中进行集成。在用户看来,Web服务器端就是一个整体,在为他/她提供服务。早期使用的Web服务器扩展机制是CGI,它允许用户调用Web服务器上的CGI程序。CGI的全称是CommonGatewayInterface,即公共网关接口。大多数的CGI程序使用Perl来编写,也有使用C、Python或PHP来编写的。用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问CGI程序,Web服务器接收到请求后,发现这个请求是给CGI程序的,于是就启动并运行这个CGI程序,对用户请求进行处理。CGI程序解析请求中的CGI数据,处理数据,并产生一个响应(通常是HTML页面)。这个响应被返回给Web服务器,Web服务器包装这个响应(例如添加消息报头),以HTTP响应的形式发送给Web浏览器。整个过程如图1-2所示。图1-2用户访问CGI程序然而CGI程序存在着一些缺点,主要是CGI程序编写困难、对用户请求的响应时间较长、以进程方式运行导致性能受限等。由于CGI程序的这些缺点,开发人员需要其他的CGI方案。1997年,SUN公司推出了Servlet技术,作为Java阵营的CGI解决方案。作为对微软ASP技术(1996年推出)的回应,SUN公司于1998年推出了JSP技术,允许在HTML页面中嵌入Java脚本代码,从而实现动态网页功能。与ASP、JSP类似的服务器端页面编写技术还有RasmusLerdorf于1994年发明的PHP技术。Servlet与Servlet容器JavaServlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。目前Servlet规范最新的版本是2.5。在上文中,出现了一个概念“Servlet容器”。那么什么是Servlet容器呢?Servlet容器有时候也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。Servlet不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术推出后,管理和运行Servlet/JSP的容器也称为Web容器。在本书中,Servlet容器、JSP容器,以及Web容器是同义的。用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问Servlet,Web服务器接收到该请求后,并不是将请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览器。整个过程如图1-3所示。图1-3用户访问Servlet与CGI程序相比,Servlet具有以下优点:—Servlet是单实例多线程的运行方式,每个请求在一个独立的线程中运行,而提供服务的Servlet实例只有一个。—Servlet具有可升级性,能响应更多的请求,因为Servlet容器使用一个线程而不是操作系统进程,而线程仅占用有限的系统资源。—Servlet使用标准的API,被更多的Web服务器所支持。—Servlet使用Java语言编写,因此拥有Java程序语言的所有优点,包括容易开发和平台独立性。—Servlet可以访问Java平台丰富的类库,使得各种应用的开发更为容易。—Servlet容器给Servlet提供额外的功能,如错误处理和安全。Servlet容器的分类根据Servlet容器工作模式的不同,可以将Servlet容器分为以下三类:Ø独立的Servlet容器当我们使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种Servlet容器的工作模式。Ø进程内的Servlet容器Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个JVM(Java虚拟机),使得Java容器可以在此JVM中加载并运行Servlet。如有客户端调用Servlet的请求到来,插件取得对此请求的控制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。Ø进程外的Servlet容器Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。Tomcat简介学习Servlet技术,首先需要有一个Servlet运行环境,也就是需要有一个Servlet容器,本书采用的是Tomcat。Tomcat是一个免费的开放源代码的Servlet容器,它是Apache软件基金会(ApacheSoftwareFoundation)的一个顶级项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat6支持最新的Servlet2.5和JSP2.1规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱,并得到了部分软件开发商的认可,成为目前比较流行的Web服务器。Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache,我们可以将Apache和Tomcat集成在一起使用,Apache作为HTTPWeb服务器,Tomcat作为Web容器。下面给出Tomcat服务器接受客户请求并做出响应的图例,如图1-4所示。图1-4Tomcat服务器接受客户请求并做出响应的过程①客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。②Web服务器接收到请求后,传递给Servlet容器。③Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。④Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。⑤Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。Tomcat的安装与配置安装Tomcat之前要先安装JDK,本书中,笔者所用的JDK版本为1.6.0_05。JDK的下载地址是:=1281,下载页面如图1-5所示。图1-5JDK的下载页面要下载Tomcat,首先访问Tomcat项目的网址:,如图1-6所示。图1-6Tomcat项目的首页在页面左边的下载链接中选择要下载的Tomcat版本,在这里,我们选择“Tomcat6.x”下载,单击这个链接,进入Tomcat6.x的下载页面,如图1-7所示。本书使用的Tomcat版本是6.0.16。对于Windows操作系统,Tomcat还提供了可执行的安装程序的下载,即“WindowsServiceInstaller”链接。通过安装程序安装Tomcat,将把Tomcat安装为Windows的服务。笔者建议读者下载zip压缩包,通过解压缩的方式来安装Tomcat,因为解压缩的方式也适用于其他的操作系统(如Linux系统),并且更容易与其他的开发环境集成。对于初学者来说,也能更好地学习Tomcat的启动过程。图1-7Tomcat6.x的下载页面单击“zip”链接,下载apache-tomcat-6.0.16.zip。使用WinZip