(本章是专门讲JavaSoft提供的Java Web服务器体系结构的,内容比较偏,比较专题)在本章中,我们将研究JavaSoft提供的Java Web服务器。Java Web服务器是JavaServer体系结构(它定义了一类服务器框架结构)的一个实现。在JavaServer体系结构中定义了一般的服务器和服务的框架结构。在研究Java Web服务器之前,让我们先来看看JavaServer体系结构及其定义的框架结构。
自从1996年夏天以来,JavaSoft就致力于定义一个能够将Java扩展到服务器领域的框架结构。这个框架就是JavaServer体系结构。它定义了服务、服务器进程以及Servlet API。Java Web服务器是这个框架的第一个实现,而且它还几乎完全是使用Java实现的。
服务框架定义了实现服务的一系列接口,通过这些接口服务,使多个服务线程(handler thread)与客户基于实现交互。服务被定义为某个协议(如HTTP、FTP)的一个实现。注意目前只定义了基于连接的协议,不过,不久将加入对基于数据报的协议的支持。JavaServer体系结构提供的核心服务类包括系统管理、线程管理、连接管理、会话管理以及安全保障。
在服务初始化时,要为它分配特定的服务器套接口(socket)。在取得一个服务器socket之后,服务将创建一个服务线程池(见图2.1)。池中的每一个服务线程都等待响应连接请求。一旦接到了连接请求,就会有一个服务线程在这个连接上实现全部协议交互。 服务线程池的大小是动态的,而且还有上下限的限制。
正如我们将要看到的,服务线程池的大小当然也可以通过系统管理工具来在服务运行中改变。
服务器是Java虚拟机的一个实例。一个服务器可以支持多个并发的服务,这些服务在服务器进程初始化过程中启动。如图2.2所示,一个服务器,例如Java Web服务器,它一般会启动系统管理服务、HTTP服务,很可能还要启动Web代理服务。在服务器运行中,仍然可以增加、删除或配置服务。
服务器 ┌─────────┐ socket│┌───────┐│ 〉─────┼┤系统管理服务 ││ │└───────┘│ │┌───────┐│ 〉─────┼┤HTTP服务 ││ │└───────┘│ │┌───────┐│ 〉─────┼┤Web代理服务││ │└───────┘│ └─────────┘ 服务器 图2.2 JavaServer的实例服务
servlet是符合由JavaServer体系结构定义的特殊接口的Java对象。
如图2.3所示。servlet由服务加载和调用,而一个服务同时可以使用多个servlet。无论是由服务器提供的内建servlet,还是用户编写的、作为附件servlet,你都可以将servlet认为是一种扩展服务器功能的简单方法。
在本章后面部分,我们还将仔细研究Java Web服务器所使用的内建servlet。和服务一样,servlet也可以在服务器运行的过程中被增加、删除或配置。
服务器 ┌────────────────────┐ socket│┌───────┐ ┌───────┐│ 〉─────┼┤系统管理服务 │┌→│servlet││ │└───────┘│ └───────┘│ │┌───────┐┘ ┌───────┐│ 〉─────┼┤HTTP服务 ┼─→│servlet││ │└───────┘┐ └───────┘│ │┌───────┐│ ┌───────┐│ 〉─────┼┤Web代理服务│└→│servlet││ │└───────┘ └───────┘│ └────────────────────┘ 服务器 图2.3 JavaServer中使用多个servlet的实例服务
如前所述,JavaServer体系结构的一个重要方面是定义服务器、服务器和servlet的系统管理接口。Java Web服务器系统管理工具用这些接口与服务器交互,是一个不错的Java Applet实例。
缺省地Java Web服务器的系统管理工具被安装在9090端口。通过这个系统管理工具,你也可以很容易地改变其配置选项。要调用系统管理工作,你要使用支持Java的Web浏览器访问管理工具的端口。在本书中,我将使用Microsoft Internet Explorer(version 4.0)和Netscape Navigator(version 4.0)。图2.4显示了通过缺省的9090端口访问服务器Iarrayboy上的Java Web服务器系统管理工具的登录界面(该图就是一个对话框图,有[User Name]和[Password]两个输入框,和[Login]、[Help]和[About]三个按钮,图略)。
缺省的用户名和口令都是admin。后面我们会看到,通过系统管理工具设置其他用户是一件非常简单的事情。图2.5显示了成功登录后的系统管理主界面。
这一屏幕被称为“服务和服务器管理”页,其中显示了Java Web服务器的当前状态以及已经安装的和正在运行的服务的当前状态。注意JavaServer(这里是Java Web服务器)是由一个服务器进程和若干服务构成的。“服务和服务器管理”页显示了构成该Java Web服务器的那些服务。
·Web Service——标准的HTTP协议服务,缺省安装在8080端口。
·Secure Web Service——Secure HTTP协议服务(也称为SHTTP),缺省安装在7070端口。只有授权的Java Web服务器拷贝才能使用SHTTP服务。
·Proxy Service——Web代理,缺省安装在6060端口。通过高速缓存,Web代理可以用来提高Web服务器的性能。
要管理一个服务,你既可能单击该服务,然后按下Manage按钮,也可以双击该服务。要启动或者停止一个服务,只要相应地按下Restart或是Stop按钮就可以了,所有Java Web服务器中的服务管理起来都十分类似,下面就让我们仔细看看Web服务的管理。
对Web服务的管理使你可以控制HTTP Web服务的行为。图2.6显示了管理HTTP Web服务的主要页面。
请注意图2.6顶部的那些图标,这些图标定义了该服务可用的管理控制。在页的左边是一个显示着当前控制的不同区域的树型结构。我们再来看看该HTTP Web服务可用的管理控制。它们是Setup(设置),Monitor(监视),Security(安全)和servlet。
Setup Control(设置控制)
通过设置功能,你可以对这个Web服务进行一般性配置。设置功能被分为一些不同的区域(如图2.6所示的屏幕左边的树型结构)。
Network Setup(网络设置)
网络设置区域允许你定义和修改基本的Web服务网络设置(见图2.7),这些选项如下:
·Port(端口)——定义了HTTP Web服务监听客户请求的端口号。缺省值是8080,你也可以指定1~65535的任何端口号。如果改变了端口号,你必须停止并重新启动该Web服务以使改动生效。
·Provide Service on(服务提供方式)——如果你的服务被设置为多连接主机,那么你将可以从多个网络地址上接收连接。
Site Setup(站点设置)
站点设置区域允许你定义和修改该Web服务的基本设置。站点设置被分为4个选项卡,它们是Contents(内容),Languages(语言),Character Sets(字符集)和Options(选项)。
如图2.8显示了Contents选项卡,这些选项如下所示:
·Document Root Directory(文档根目录)——HTML文件在服务器上所在目录的目录名,缺省值是public_html。比如,如果Java Web服务器在安装在目录/JavaWebServer中,那么HTML文件的缺省位置就是/JavaWebServer/public_html。
·CGI Script Directory()——存放CGI脚本的目录的相对目录名,也就是在Java Web服务器主目录中存放CGI脚本的目录的子目录名。
·Welcome Files(欢迎文件)——一组在用户进入你的Web站点时用来显示的欢迎文档的列表。当用户进入你的站点却没有指定打开的文档时,Web服务器将在该列表中查找第一个可用的文档并显示它。
站点设置的Languages选项卡定义了该Web站点中的文档所使用的语言。站点设置的Character Sets选项卡定义了该Web服务器所使用的字符集。
图2.9显示了站点设置的Options选项卡,这里你可以设置Web服务器的基本选项。选项如下所示:
·Security Checks(安全检查)——该设置选项决定了服务器是否在接受连接之前检查访问控制列表。缺省值是“Enabled”。
·Directory Access(目录访问)——该设置选项决定了当客户端试图访问服务器上的目录时,是否为客户端列出该目录中的文件。如果在一般设置选项卡中给出了index.html,那么当访问目录时总是打开它,否则,如果没有给出index.html而目录访问选项为“List Files”,该目录中的所有文件的列表将会返回给客户端;如果目录访问选项为“Do Not List Files”,则拒绝客户端的访问。缺省值是“Do Not List Files”。
·Servlet Chains(servlet链)——该设置选项决定servlet是否可以连锁执行。我们将在第5章中讨论servlet链。该设置的缺省值是“Disabled”。
Session Tracking Setup(会话跟踪设置)
如图2.10所示的会话跟踪设置使你可以控制是否让Web服务利用会话跟踪功能。会话跟踪可以将客户到Web服务的一次会话记录下来,并通过它来维护多个连接和请求所产生的状态信息。
Service Tuning Setup(服务性能调整设置)
服务性能调整区域使你可以调整Web服务的性能设置。服务性能调整区域分为3个选项卡:General(一般),Handler Threads(服务线程)和Connection Persistence(线程和连接持久性)。
图2.11显示了一般服务性能调整的各个域,如下所示:
·Capacity(容量)——决定同时连接到Web服务的客户的最大数量。缺省值是50。
·Memory Cache(内存高速缓存)——该域定义了服务器高速缓存的兆字节数。取值为0时,不进行高速缓存,否则其取值要在1~8之间。缺省值为1MB。
图2.12显示了Handler Threads选项卡中的各个选项。由于在JavaServer体系结构中服务线程池是在服务初始化过程中创建的。服务线程直至有客户请求连接到服务socket时才被激活,并为该客户请求进行服务。这些域是:
·Minimum(最小值)——服务线程池中线程的最小数量,缺省值是10。
·Maximum(最大值)——服务线程池中线程的最大数量,缺省值是50。
·Timeout(超时时间)——一个服务线程空闲的最多秒数。如果服务线程池中的线程数量大于指定的最小值,当某线程保持空闲的时间超过该秒数时,它就会被从服务线程池中清除。缺省值是300秒。
图2.13显示了Connection Persistence选项卡中的各个域,如下所示:
·Keep Alive(活动数量)——该域设置了一个TCP连接在连接终止之前所有发出的HTTP请求的数量。缺省值是5。
·Timeout(超时时间)——设置一个连接的超时时间。缺省值是30秒。
File Alias Setup(文件别名设置)
文件别名区域使你可以创建别名,通常文件别名被用来给一些很长的目录创建别名,通过这个别名,可以直接访问其中的文件。图2.14显示了这组设置的各个选项:
·Alias Pathname(别名路径名)——为路径名定义的别名。
·Full Pahtname(路径全名)——定义路径全名。
举例来说,你有一个叫做Stats.html的HTML文件保存在目录cars/ford/mustang/1965中,通常客户要访问服务器larryboy上的这个文件需要使用地址http://larryboy/cars/ford/mustang/1965/Stats.html,如果你使用65Stang作为目录cars/ford/mustang/1965的别名,那么客户只需要用地址http://larryboy/65Stang/Stats.html就可以访问这个文件了。
Servlet Alias Setup(Servlet 别名设置)
你可以用servlet别名来为常用的servlet设置别名,如果这些servlet的名字比较长,或者强制某种类型的文件由servlet处理。图2.15显示了这些设置选项:
·Alias(别名)——定义Servlet的别名,你也可以定义某种文件名格式,比如.shtml,这时server-side includes将会被调用,在第5章中我们将详细探讨这个问题。
·Servlet Invoked(调用的servlet)——Web服务通过servlet的名字来调用它们。你也可以指定多个servlet,此时它们会一个接着一个被调用(称为chained)。第4章中我们将深入探讨这个问题。
Virtual Host Setup(虚拟主机设置)
通过虚拟主机设置,你可以为你的服务指定多个主机名。你可能使用以下两种方式之一:
1.服务器只有一个网卡和一个IP地址——如果你为一个IP地址配置了多个DNS主机名,你只须在Web服务的虚拟主机设置中注册这些DNS名称。
2.服务器具有多块网卡,分别绑定不在不同的IP地址上——你只须在Web服务的虚拟主机设置中注册这些DNS名称就可以了。
图2.16显示了虚拟主机的各个域,这些域如下所示:
·Host(主机)——指出主机(或DNS)的名称。
·Documetn Root(文档根目录)——该目录将作为这个主机的根目录,所有访问都是对它的相对路径,比方说,如果Java Web服务器安装在/JavaWebServer目录中,其文档的根目录设置为public_html;而某个虚拟主机的文档根目录设置为Alfred_Root,那么这个主机上的HTML的缺省路径就是/JavaWebServer/public_html/Alfred_Root。
Mime Type Setup(Mime类型设置)
你可以通过设置Mime类型来管理Web服务所处理的文件后缀到Mime类型的映射。Mime类型是确定文件内容的一种方法。你可以将某种后缀的文件(如.wav)映射到特定的Mime类型上(如audio/x-wav),这样Web服务就知道如何处理这种类型的文件了。图2.17显示了Mime类型设置的选项:
·Extension(扩展名)——指出要映射的文件扩展名。
·Type/Subtype(类型/子类型)——特定扩展的文件所要映射到的Mime类型/子类型。类型定义了文件的一般分类(如audio)而子类型定义了该分类中的某一特定类型(如x-wav)。
log File Setup(记录文件设置)
在记录文件设置中,你可以设置Web服务甩使用的记录文件。记录文件又分为5种不同的类型:
1.Access log(访问记录)——记录了每一次客户请求的情况,包括远程用户名、远程主机名以及描述等信息。
2.Agent log(代理记录)——记录了访问Web服务器的客户所使用的浏览器类型。
3.Error log(错误记录)——记录了服务的错误信息。
4.Event log(事件记录)——记录了服务事件等信息,如启动、关闭以及servlet调用。
5.Referrer log(引用记录)——记录了服务器上文件的访问情况。
图2.18显示了记录文件设置的各个域,对每一种记录的配置都是类似的。
这些域如下所示:
·Log Name(记录名称)——该域是只读的,指出当前查看的记录文件类型。
·Description(描述)——是对选中的记录类型的简要描述。
·Which Messages(消息选择)——该组合框允许你选择你要记录的消息。
·Log to(记录方式)——该组合框允许你指定如何记录消息。表2.1显示了所有有效的选项。根据你选择的记录类型,你要要提供一些其他信息,如文件名称和记录大小。
表2.1 记录文件目标类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 描述
─────────────────────────────────
Rolling File(回滚文件) 收集消息直到预定义的文件大小上限,这时,
将现有文件改名保存并新建一个空的记录文件。
原来的文件被命名为logfile.1。如果
logfile.1文件已经存在,则改名为logfile.2,
如果logifle.2文件已经存在,就改名为
logfile.3,依次类推
Single File(单独的文件)收集消息直至预定义的文件大小上限,这时,
从文件头开始继续写入记录信息,覆盖以前的
数据
Standard Output(标准输出)将消息写到标准输出设备上,通常Web服务进
程要拥有屏幕
Standand Error(标准错误)将消息写到Web服务的标准错误记录中
─────────────────────────────────
Monitor Control(监视控制)
使你可以用多种方式监视、显示Web服务的记录数据或将其制成图表。你还可以按天、按周或按月地指定如何排序和过滤数据。
监视控制还帮助你观察Web服务的资源使用情况。图2.19就是显示资源利用情况的例子。
Security Control(安全控制)
安全控制帮助你管理Web服务的安全性,它被分为四个不同的方面:Users(用户)、Groups(组)、Access Control Lists(访问控制列表)和Resources(资源)。
Users Setup(用户设置)
通过用户设置你可以管理能够访问你的Web服务的用户以及他们所能访问的文件和servlet的权限控制。每一个用户账号包括用户名、口令和安全范围。安全范围可以控制用户对镜湖的访问权限。图2.20显示了用户设置的所有域。一旦用户被加到某一个安全范围之中,就可以将他(她)加到访问控制列表(Access Control List,ACL)中,授予他(她)对某些资源的访问权利。下面是这些选项:
·Realm(范围)——如前所述,范围被用来控制用户对资源的访问权限。
·Name(名字)——列出了属于该安全范围的所有用户的用户名。
为了修改某个用户的口令或用户名,请按下Password按钮,这时会显示一个对话框,在里边你可以修改这些域。
Groups Setup(组设置)
每一个安全范围都是由一系列安全组构成的。你可以通过安全组控制来管理每一个安全组。图2.21显示了组控制中的各个域。每一个用户在被加入到一个组之前,必须属于该组所在的安全范围。下面是组控制中的各个域:
·Realm(范围)——指出你正在管理的安全范围
·Group Name(组名)——一个列出了上述安全范围中的所有组的名称的列表。如果要加入一个新组,你可以按下“Add Group...”按钮。
·Members(组成员)——一个列出了当前属于选中组的所有用户的列表。
·Nonumbers(非组成员)——一个列表,其中列出的是所有属于该安全范围,但不属于当前选中组的所有的用户。
通过“Add”和“Remove”按钮,可以使用户在组成员和非组成员之间移动。
Access Control Lists Setup(访问控制表设置)
这里,你可以管理某一个安全范围的访问控制表(ACL)。访问控制表用来控制用户对文件及servlet之类的资源的访问。图2.22显示了访问控制表中的各个域:
·Realm(范围)——指出你正在配置的安全范围
·Access Control Lists(访问控制表)——一个列出上述安全范围中的访问控制表的列表。通过“Add ACL...”,你可以在其中增加新的访问控制表。
·Principal/Permissions(访问权限)——列出了当前选中的访问控制表中定义的用户、组和计算机对资源的访问权限。它是通过一个树型结构显示出来的,你可以打开或者关闭其中的各个节点来显示某一个用户、某一个组或者某一个计算机被授予的权限。
如果要增加对某一个用户、某一个组或者某一个计算机的权限设置,可以按下“Add Perimssion...”按钮,这时会显示如图2.23所显示的对话框,通过它,你可以指定对文件、文件夹以及servlet的权限。
表2.2和表2.3分别列出了可以对文件和文件夹,以及对servlet设置的权限。
表2.2 文件和文件夹的权限
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 描述
─────────────────────────────────
GET 允许从服务器获取信息
PUT 允许替换服务器上现有数据
POST 允许向服务器上放置新数据
DELETE 允许删除服务器上的数据
─────────────────────────────────
表2.3 servlet的权限
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 描述
─────────────────────────────────
Load Servlet 允许加载服务器上命名的servlet
Read Files 允许servlet在运行的过程中读取任何文件
Write Files 允许servlet在运行的过程中写入任何文件
Listen to Socket 允许servlet在运行的过程中使用服务器上的socket
Open Remote Socket 允许servlet在运行的过程中打开socket连接
Link Libraries 允许servlet在运行的过程中通过加载
System.loadLibrary()来使用库
Execute Programs 允许servlet在运行的过程中调用其他程序
Access System Properties 允许servlet在运行的过程中访问系统属性
─────────────────────────────────
Resources Setup(资源设置)
这里你可以通过设置服务器上某种资源如文件、文件夹以及servlet的访问控制的访问控制表,来控制对该资源的访问。图2.24显示了资源设置的各个域:
·Realm(范围)——指出你正在配置的安全范围。
·Resource(资源)——你要设置的资源的名称。它可能是某个文件名、某个目录名或者某个servlet。
·Type(类型)——定义了该资源的访问类型是文件(file)还是servlet。
·Scheme(方案)——定义了用来保护该资源的授权方法。表2.4列出了Web服务所使用的方案类型。
·ACL——控制使用资源权限的访问控制表的名称。
表2.4 授权方案
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 描述
─────────────────────────────────
Basic 在网上直接发送口令的明文
Digest 在网上发送口令的函数而非口令本身。不过,目前只有为数不多的
浏览器支持这种授权方案
─────────────────────────────────
Servlet Control(servlet控制)
通过servlet,可以控制servlet的加载信息。图2.25显示了servlet这一控制页的各个域:
·Name(名称)——赋予servlet的惟一名称。值得注意的是,你可以为servlet指定任意的外部名称,而无须与该servlet的类名相同。
·Description(描述)——servlet的简要描述。它只在Web服务内部使用。
·Class Name(类名)——servlet的Java类名,如果存在包名,也应包含包名。
·Arguments(参数)——传递给servlet的参数,参数设置的语法是“key=value”。
·Load at Startup(启动时加载)——控制Web服务是否在其启动时加载该servlet。
·Loaded Now(加载状态)——显示了该servlet当前是否已经被加载。你也可以通过改变这个域来加载卸载小应用程序。
·Load Remotely(远程加载)——控制Web服务是否远程加载该servlet。
·Class File URL(类文件URL)——如果该servlet需要远程加载,这里指出了包含该servlet类的URL。
JavaServer体系结构是被设计来帮助用户扩展其服务器的服务的,而这些扩展当然也是由servlet实现的。Java Web服务器通过实现各种内部servlet来实现JavaServer体系结构。
由JavaWeb服务器管理工具提交的请是由管理servlet来处理。
CGI Servlet可以直接代替公共网关接口(CGI)。CGI Servlet可以接受任何使用CGI 1.1来访问Java Web服务器的客户端的请求。
文件servlet负责Java Web服务器的文件处理功能。它包括一个精明的高速缓存算法,通过它可以减少对经常被访问的文件的响应时间。文件servlet还检查Server-Side Include的文档,并将它们交给Server-Side Include Servlet以进一步处理。
图像映射servlet处理整个服务器中的图像映射。
调用者servlet负责调用用户编写的servlet。
Server-Side Include Servlet处理Server-Side Include。通过Server-Side Include可以在文档中嵌入servlet。一旦文件servlet发现文档中含有Server-Side Include,该文档就会被发送给Server-Side Include(SSI)处理。SSI Servlet将分析文档中的servlet标记,一旦发现,就由调用者servlet调用相应的servlet。最后servlet产生的输出将会被合并到原始文档中。在第5章中,我们将深入探讨Server-Side Include。
在缺省情况下,Java Web服务器的HTTP Web服务被安装在8080端口。如前所述(参见图2.7),我们可以用管理applet很轻松地修改Web服务的端口号。图2.26显示了缺省的Index.html文件,它是由服务器“larryboy”的8080端口的Java Web服务器提供的。
本章介绍了Java Web服务器的基础:JavaServer体系结构。该体系结构定义和实现了一个可以由服务器构建的基础框架结构。我们还深入了解了构成Java Web服务器的几个服务——特别是HTTP服务、代理服务和系统管理服务——和多种用于特殊客户端请求的Web服务器内建servlet。我们还重点讲解了Java Web服务器系统管理applet以及HTTP服务中可以使用的许多配置和管理选项。
在下一章中,我们将要编写一个简单的servlet。相信你很快就会发现,在JavaServer体系结构中,你可以多么轻易地通过创建自己的servlet来扩展服务器的功能。