ServletJSP深入详解基于Tomcat的Web开发第1章.docx
《ServletJSP深入详解基于Tomcat的Web开发第1章.docx》由会员分享,可在线阅读,更多相关《ServletJSP深入详解基于Tomcat的Web开发第1章.docx(15页珍藏版)》请在冰豆网上搜索。
ServletJSP深入详解基于Tomcat的Web开发第1章
Servlet/JSP深入详解:
基于Tomcat的Web开发第一章01
要掌握JavaWeb开发,首先就要学会编写Servlet,而要运行Servlet,则需要一个Servlet容器,本书选用的是Tomcat。
下面让我们来了解一下Servlet和Tomcat。
1.1 Web技术的发展
随着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-4 Tomcat服务器接受客户请求并做出响应的过程
①客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。
②Web服务器接收到请求后,传递给Servlet容器。
③Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
④Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。
⑤Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。
Tomcat的安装与配置
安装Tomcat之前要先安装JDK,本书中,笔者所用的JDK版本为1.6.0_05。
JDK的下载地址是:
图1-5 JDK的下载页面
要下载Tomcat,首先访问Tomcat项目的网址:
http:
//tomcat.apache.org/,如图1-6所示。
图1-6 Tomcat项目的首页
在页面左边的下载链接中选择要下载的Tomcat版本,在这里,我们选择“Tomcat6.x”下载,单击这个链接,进入Tomcat6.x的下载页面,如图1-7所示。
本书使用的Tomcat版本是6.0.16。
对于Windows操作系统,Tomcat还提供了可执行的安装程序的下载,即“WindowsServiceInstaller”链接。
通过安装程序安装Tomcat,将把Tomcat安装为Windows的服务。
笔者建议读者下载zip压缩包,通过解压缩的方式来安装Tomcat,因为解压缩的方式也适用于其他的操作系统(如Linux系统),并且更容易与其他的开发环境集成。
对于初学者来说,也能更好地学习Tomcat的启动过程。
图1-7 Tomcat6.x的下载页面
单击“zip”链接,下载apache-tomcat-6.0.16.zip。
使用WinZip或WinRAR等解压缩工具将apache-tomcat-6.0.16.zip解压缩到指定的驱动器和目录中。
笔者是在D:
\OpenSource目录下直接解压,产生了目录apache-tomcat-6.0.16,解压后的文件夹和文件存放于D:
\OpenSource\apache-tomcat-6.0.16目录下。
Tomcat6.x需要的J2SE版本最低为5.0。
Tomcat6.x不再需要JDK的支持,只需要安装JRE就可以了,这是因为Tomcat6.x使用EclipseJDTJava编译器来编译JSP页面,而不再使用JDK中的编译器。
EclipseJDTJava编译器已经绑定到Tomcat的发行版中。
如果你使用Tomcat5.0.x或者Tomcat5.5.x,那么仍然需要安装JDK。
1.5.1 Tomcat的目录结构
Tomcat安装后的目录层次结构如图1-8所示。
图1-8 Tomcat6.0.16目录层次结构
各目录的用途如表1-1所示。
表1-1 Tomcat的目录结构及其用途
目 录
用 途
/bin
存放启动和关闭Tomcat的脚本文件
/conf
存放Tomcat服务器的各种配置文件,其中包括server.xml(Tomcat的主要配置文件)、tomcat-users.xml和web.xml等配置文件
/lib
存放Tomcat服务器和所有Web应用程序需要访问的JAR文件
/logs
存放Tomcat的日志文件
/temp
存放Tomcat运行时产生的临时文件
/webapps
当发布Web应用程序时,通常把Web应用程序的目录及文件放到这个目录下
/work
Tomcat将JSP生成的Servlet源文件和字节码文件放到这个目录下
从表1-1中可以看到,lib目录下存放的JAR文件可以被所有的Web应用程序所访问,如果多个Web应用程序需要访问相同的JAR文件,那么可以将这些JAR文件放到Tomcat的lib目录下。
此外,对于后面将要介绍的JavaWeb应用程序,在它的WEB-INF目录下,也可以建立lib子目录,在lib子目录下可以存放各种JAR文件,这些JAR文件只能被当前Web应用程序所访问。
Tomcat6.x修改了5.x版本的目录结构,删除了common、server和shared目录,将common/lib、server/lib和shared/lib中的JAR文件统一放到了lib目录下。
1.5.2 运行Tomcat
在Tomcat安装目录下的bin子目录中,有一些批处理文件(以.bat作为后缀名的文件),其中的startup.bat就是启动Tomcat的脚本文件,用鼠标双击这个文件,你将看到一个窗口一闪而过,之后就什么也没有了,这说明Tomcat的启动出错了。
单击Windows的【开始】菜单,选择【所有程序】→【附件】→【命令提示符】,打开“命令提示符”窗口,进入Tomcat的bin目录中,在“命令提示符”窗口中输入startup,你将看到如图1-9所示的画面。
图1-9 运行Tomcat提示出错信息
笔者以前碰到过很多学员,在初次运行Tomcat时,看到如图1-9所示的信息就不知所措了。
有的学员以前还配置过Tomcat,但是再次使用的时候,由于忘记了上次是如何配置的,同样感觉无从下手。
我们在学习软件开发时,一定要养成查看错误提示信息,进而根据错误提示解决问题的良好习惯。
笔者第一次配置Tomcat时,就是根据错误提示信息一步一步配置成功的。
当看到错误信息时,首先不要慌张和无所适从,要仔细看清楚错误提示,弄明白错误的原因。
图1-9中的错误提示信息,已经很明确地告诉你了错误的原因。
我们看图1-9中的错误信息,如下所示:
NeithertheJAVA_HOMEnortheJRE_HOMEenvironmentvariableisdefined
Atleastoneoftheseenvironmentvariableisneededtorunthisprogram
这个错误信息是告诉你要配置JAVA_HOME或者JRE_HOME环境变量,以便Tomcat能够找到JDK或JRE的安装目录。
从环境变量的名字,我们可以猜测到JAVA_HOME是配置JDK的安装目录,JRE_HOME是配置JRE的安装目录。
由于Tomcat6.x不再需要JDK的支持,所以才新增了JRE_HOME环境变量,对于6.0之前的Tomcat版本,没有JRE_HOME环境变量,只能配置JAVA_HOME环境变量。
下面,我们在WindowsXPServicePack2操作系统下设置JAVA_HOME环境变量,步骤如下。
①右键单击“我的电脑”,选择【属性】,出现如图1-10所示的画面。
②单击“高级”选项卡,选择“环境变量(N)”,如图1-11和图1-12所示。
③在“系统变量”下方单击“新建”按钮。
在“变量名”中输入“JAVA_HOME”,在变量值中输入JDK所在的目录“D:
\Java\jdk1.6.0_05”(读者可以根据自己机器上JDK的安装目录来修改这个值),然后单击“确定”按钮,如图1-13所示。
图1-10“我的电脑”属性 图1-11“高级”选项卡
④最后在“环境变量”对话框上单击“确定”按钮,结束JAVA_HOME环境变量的设置。
我们再一次转到Tomcat的bin目录下,用鼠标双击startup.bat文件,可以看到如图1-14所示的启动信息。
注意图1-14中圆角矩形框中的文本,可以看到启动的是Tomcat6.0.16。
图1-12“环境变量”对话框 图1-13 新建JAVA_HOME系统变量
图1-14 Tomcat启动信息
然后,打开浏览器,在地址栏中输入http:
//localhost:
8080/(localhost表示本地机器,8080是Tomcat默认监听的端口号),将出现如图1-15所示的Tomcat页面。
图1-15 Tomcat的默认主页
注意图1-15中鼠标(小手形状)指向的链接——“TomcatDocumentation”,单击这个链接将进入Tomcat的文档页面,有关Tomcat的帮助信息可以在文档页面中找到;读者也可以直接访问Tomcat的文档,文档首页的位置是Tomcat安装目录下的webapps\docs\index.html。
如果要关闭Tomcat服务器,可以用鼠标双击Tomcatbin目录下的shutdown.bat文件。
如果你机器上的Tomcat启动失败,有可能是因为TCP的8080端口被其他应用程序所占用,如果你知道是哪一个应用程序占用了8080端口,那么先关闭这个程序。
如果你不知道或者不想关闭占用8080端口的应用程序,那么你可以修改Tomcat默认监听的端口号。
前面介绍了,Tomcat安装目录下的conf子目录用于存放Tomcat服务器的各种配置文件,其中的server.xml是Tomcat的主要配置文件,这是一个格式良好的XML文档,在这个文件中可以修改Tomcat默认监听的端口号。
用UltraEdit(你可以用“记事本”程序或其他的文本编辑工具)打开server.xml,找到修改8080端口的地方。
读者也许要问了,“这个配置文件,我都不熟悉,怎么知道在哪里修改端口号呢?
”对于初次接触server.xml的读者,确实不了解这个文件的结构,但是我们应该有一种开放的思路,既然Tomcat的监听端口号是在server.xml中配置,那么只要我们在这个文件中查找“8080”这样的数字字符序列,不就能找到修改端口号的地方了吗!
在UltraEdit中,同时按下键盘上的“Ctrl”和“F”键,出现如图1-16所示的“查找”对话框。
图1-16 UltraEdit的查找对话框
然后在“查找”文本框中输入“8080”,单击“下一个”按钮。
重复这一过程,直到找到如图1-17所示的在server.xml中配置端口号位置。
图1-17 server.xml中配置端口号的位置
找到后,如果我们不能确定此处就是修改端口号的地方,也没有关系,可以先尝试着修改一下端口号,然后启动Tomcat。
如果启动成功并且能够在修改后的端口号上访问到Tomcat的默认主页,那就证明了我们修改的地方是正确的。
学习时,我们应该养成这种探索并不断实验的精神。
在这里,我们可以修改端口号为8000(读者可以根据自己机器的配置选择一个端口号),然后保存。
再次启动Tomcat,在Tomcat启动完毕后,打开浏览器,在地址栏中输入http:
//localhost:
8000/(读者根据自己设置的端口号做相应的修改),就可以看到Tomcat的默认主页了。
关闭Tomcat服务器时,执行bin目录下的shutdown.bat文件。
如果你想将Tomcat安装为Windows的服务,以便在Windows系统启动时即运行Tomcat,那么可以打开“命令提示符”窗口,进入Tomcat安装目录下的bin子目录,然后执行下面的命令:
service.batinstall
这样将会在Windows系统中安装一个Tomcat6服务,要启动这个服务,可以执行下面的命令:
netstartTomcat6
要停止Tomcat6服务,可以执行下面的命令:
netstopTomcat6
要删除Tomcat6服务,可以执行下面的命令:
service.batremove
要提醒读者的是:
net命令是Windows自带的命令,而service.bat是Tomcat提供的批处理文件。
1.5.3 Tomcat启动分析
在本节中我们将通过对Tomcat启动过程的分析,来帮助读者更好地理解和掌握Tomcat。
用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读。
在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值。
接着判断当前目录下是否存在bin\catalina.bat,如果文件不存在,将当前目录的父目录设为CATALINA_HOME的值。
根据笔者机器上Tomcat安装目录的层次结构,最后CATALINA_HOME的值被设为Tomcat的安装目录。
如果环境变量CATALINA_HOME已经存在,则通过这个环境变量调用bin目录下的“catalina.batstart”命令。
通过这段分析,我们了解到两个信息,一是Tomcat启动时,需要查找CATALINA_HOME这个环境变量,如果在Tomcat的bin目录下调用startup.bat,Tomcat会自动并正确设置CATALINA_HOME;二是执行startup.bat命令,实际上执行的是“catalina.batstart”命令。
如果我们不是在Tomcat的bin目录作为当前目录时调用startup.bat,就会出现如图1-18所示的错误信息