基于java的web服务器毕业论文

更新时间:2024-05-12 09:49:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于JAVA的web服务器

摘 要:应用服务器是当前基于Web的软件开发的重要的支撑平台。本文通过研究Web应用服务器的功能需求以及基于组件的软件开发模式,结合JAVA规范和超文本传输协议,设计并实现了基于JAVA的Web应用服务器—DM WAS,为Web客户部署Web应用程序提供支持,从而更加方便地使用DM的数据存储和访问服务。

关键字:JAVA;应用服务器;超文本传输协议;多线程

第一章 绪论

1.1课题背景

随着信息处理流程越来越复杂,需要存取的数据量越来越庞大,数据库逐渐成为存储和处理数据的主要工具,它是许多公司整体业务结构形成的基础。在传统的客户机/服务器两层体系结构中,应用程序的处理在前台的客户端和后台的数据库服务器之间分担,客户端发出数据请求,服务器响应并处理请求,把处理的结果再回送到发出请求的客户端。客户机/服务器结构因为其灵活性得到了较广泛的应用,但对于大型软件系统而言,这种结构在系统的部署、可扩展性和可维护性方面还存在着不足,典型的有胖客户机/瘦服务器和瘦客户机/胖服务器体系结构。Internet的发展给传统应用软件的开发带来了深刻的影响,基于Internet和Web的软件和应用系统无疑需要更为开放和灵活的体系结构。随着Internet/Intranet技术的普及、电子商务技术的发展等,数据库技术又面临着新的挑战,一种新的、更具生命力的体系结构被广泛采用,这就是所谓的三层和多层应用体系模型。一个典型的三层模型由前端客户层、中间服务器层和后端数据库层所组成,在这种模型中,业务逻辑被放到系统服务和用户接口之间的中间层,从而使业务逻辑与用户界面的表示层分开,同时与后端系统保持相对独立性,有利于系统扩展。三层模型具有更好的移植性,可以跨不同类型的平台工作,允许用户请求在多个服务器间进行负载平衡。

在三层和多层应用模型中,应用服务器是最核心的基础软件,国际上许多著名的计算机公司和开放源码组织纷纷推出了各自的产品和系统,如IBM Websphere、BEAWeblogic、Oracle9iAS、SUN iPlanet、开放源码JBoss和ENHYDRA等,这其中有很多是由数据库厂家开发的,以便为企业应用提供整体解决方案。

DM数据库管理系统是华中科技大学数据库与多媒体技术研究所研制的分布式多媒体数据库管理系统。为了满足DM数据库在分布式环境下,特别是多层应用软件体系结构中企业级应用的需求,抢占数据库管理系统前沿技术的制高点,研发支持可扩展标记语言(Extensible Markup Language,XML)的数据库管理系统XDM4和支持XML、符合Java规范的Web应用服务器已成为DM下一步的目标。正是在这一背景下,本课题提出开发支持JAVA标准的Web应用服务

器,为基于Java、XML和数据库的Web应用提供存储、查询、发布数据的能力,并提供部署、运行应用的环境。

1.2 Web应用服务器的定义及功能

1.2.1. Web基本概念

WWW采用Web页面的方式进行信息的存储与传递,Web信息存储在Web站点上,用户通过Web浏览器访问页面。Web页面是由HTML语言编写,并由浏览器翻译解释的。建立Web的愿望是通过易于使用的超文本接口,提供通过的文件共享。完整的Web结构应包括:HTTP协议、Web服务器、通用网关接口、Web应用程序接口、Web浏览器。Web体系结构如图2-1所示。

图2-1 Web体系结构

HTTP协议:HTTP(Hyptertext Transfer Protocol)就是超文本传输协议,是WWW服务的支撑协议,它实现了服务器和客户机间信息交流。Web以两个主要的协议为基础即HTTP及TCP/IP协议。HTTP用于Web浏览器与Web服务器之间的数据交换,浏览器使用超文本标记语言HTML;TCP/IP为网络传输控制协议。HTTP协议工作在TCP协议之上,在很多方面,理解HTTP协议是理解Web的关键。

Web服务器:是指驻留在因特网上某种类型计算机的程序。它是在网络中信息提供者基于HTTP的为实现信息发布、资料查询、数据处理等诸多应用搭建基本平台的服务器,其主要功能是提供网上信息浏览服务。

通用网关接口(CGI):Common Gateway Interface的简称,是在Web服务

器端的一个通用接口,用来调用外部程序进行计数、查询数据库、生成定制的图像,或完成其他任务。其主要的功能是在WWW环境下,从客户端传递一些讯息给Web服务器,再由Web服务器去启动所指定的程序来完成特定的工作。

Web应用程序接口:Web应用程序是运行在服务器端的可执行程序或动态连接库。它们可以响应用户要求,动态产生超文本页面,并将信息提供给客户浏览器。Web应用程序接口就是一组函数,可以帮助开发者借助服务器配置文件中的指令来创建自己的应用程序。这些指令就是服务器执行一个请求的步骤,包括访问授权、根据文件根目录的路径转换、存在性验证、文件类型判别以及服务器的正确执行。

Web浏览器:Web浏览器用于通过URL(Uniform Resource Locator,同一资源定位符)来获取并显示Web网页的一种软件工具。在Windows环境中较为流行的Web浏览器为Netscape Navigator和Internet Explorer。用户也可在AutoCAD等软件的系统内部直接调用Web浏览器进入Web网络世界。 1.2.2 Web的工作机制

Web系统的工作主要就是进行Web页面的交互,一个典型的Web页面有一个基础页面和内嵌的资源对象组成。基础页面一般按照标准的语法结构——超文本标记语言(HTML)书写,而内嵌资源(图象、声音等)的统一资源定位符(URL)则按一定格式包含在基础页面之内[1]。这里从用户的角度来描述Web页面的交互过程。为了显示用户所制定的一个页面,浏览器需要完成下列步骤:

1.浏览器首先需要对URL中所包含的服务器名进行域名解析;

2.服务器与浏览器建立一条到该IP地址的TCP连接,这段时间称为连接建 立时间;

3.浏览器在该TCP连接上向服务器发送HTTP请求,从浏览器发送请求到它收到第一个响应IP包的时间称为请求及响应时间;

4.如HTTP响应的消息多于一个包,从浏览器收到第一个IP包到它收到所有IP包之间的时间称为传送时间;

5.在浏览器得到完整的响应消息后,基础页面的传送就结束了,而浏览器需要分析所获得的页面,并提取出其中包含的资源对象的URL;

6.在得到所有的内嵌资源后,浏览器根据具体的格式(HTML、声音、图片、动画等)解释这些资源,并把它们传送给用户。

图2-2表示了获取一个Web页面的过程。

图2-2获取Web页面的过程

由Web的结构以及工作过程可以看出,Web服务器是整个Web系统的重要组成部分,在Web系统的页面交互的过程中也占有举足轻重的作用。因此,改善Web系统的性能,其中关键的一环就是提高Web服务器的性能,如何优化Web服务器的性能也就成了人们一直以来在提高Web性能方面共同关注的课题。 1.2.3 Web应用服务器

Web应用服务器是Web计算环境下产生的新型中间件,为创建、部署、运行、集成和管理事务性Web应用提供了一个跨平台的运行环境。

近年来,许多研究人员、组织机构对Web应用服务器分别提出了不同的定义,但到目前为止,Web应用服务器仍然没有一个完全统一的定义。

C.Mohan在文献中认为,应用服务器是传统事务处理监控器(transaction processing monitor)在Web环境下的现代等同物,是事务性服务在线应用的执行平台,将现代的应用环境与历史遗留数据源集成是应用服务器最重要的特征之一。

Ritter在文献中认为,应用服务器是位于以浏览器为基础的前端和历史遗留应用的后端之间的、基于组件的服务器端软件,它高速存取后端系统的信息,处

理业务逻辑,集成企业计算中的资源和应用,为安全、状态维护、数据访问、数据存取提供中间件服务。

文献认为应用服务器是为创建、部署、运行、集成和管理事务性Web应用提供一系列运行时服务(如消息、事务、安全、应用集成等)的可伸缩、高可用、高可靠、高效的中间件平台。应用服务器需满足Web计算的特定需求,所以,应用服务器通常同时具有Web服务器的功能,亦称为Web应用服务器。

每种定义有其侧重的方向,一般来说,Web应用服务器应具有几个大的功能。 1.业务逻辑处理3

业务逻辑是用户为完成某项功能所部署的应用程序组件。处理业务逻辑是应用服务器的主要功能。与应用程序相关的业务逻辑可以由可重用组件组成,而不需要每个开发者自己开发。一旦组件被创建,就可以被部署到应用服务器中运行。大多数应用服务器提供某种机制用于指定组件的持久性、事务处理和安全性等。

2.数据访问

应用服务器提供一整套数据访问机制,用于管理与关系型数据库(如Oracle,SQL Server)的连接。开发人员只需要提供必要的连接参数就可以透明地访问数据源而不需要知道访问具体是如何实现的。

3.事务管理

事务处理是企业计算中最重要的内容之一。过去,Web开发人员和应用程序开发人员习惯于自己完成数据库事务管理。对于没有经验的开发人员来说,自己控制事务既烦琐而且又容易出错。而在应用服务器环境中,开发人员所要关心的只是业务逻辑的实现,有关数据库的事务处理应交由应用服务器管理。应用服务器提供不同级别的事务控制,以满足开发人员的不同需求。

4.状态和会话管理

应用服务器必须在同一用户会话过程的多次请求之间维护有关的状态数据。在应用服务器环境中,应用服务器一般是通过会话对象来保持用户状态数据的。

会话对象的唯一功能就是保存服务器端的数据,它使那些存在安全风险的数据远离浏览器端,从而保证了系统的安全性。

5.安全服务

为了获得对资源的访问权,客户端必须通过服务器的认证,因此应用服务器

必须要有验证用户的安全设施。大多数服务器采用基于角色的访问控制机制。

此外,也有一些服务器提供对安全服务的验证(如操作系统,LDAP等),更高级的安全通过用户主机上数字认证的使用来实现。一旦用户身份被验证,服务器将允许或禁止该用户访问组件和服务器所管理的数据库连接等。

6.数据库连接池

基于Web应用服务器的应用开发不可避免地要访问数据库。当客户端在页面中请求数据或更新数据时,服务器必须连接数据库以完成工作。如果用户每次提交页面时都要执行数据库的连接和断开操作,系统的性能就会变得很差,因为在一个事务周期中建立到数据库的连接是一个费时而又浪费系统资源的操作。应用服务器通常采用数据库连接池技术来优化数据库连接,它不为每一个用户保持单独连接,而是维护了一个连接池来缓存已有的数据库连接。如果用户需要查询或更新数据,相应组件就会请求服务器从连接池中分配一个可用连接。当一个事务结束后,连接池收回该连接以待重用。

7.负载平衡和失败恢复

为了满足Web计算环境下大规模用户的并发访问,Web应用服务器需要提供可信赖性、高伸缩性等特性,提高系统整体性能和吞吐量,这就要求服务器需提供某种负载平衡和失败恢复机制。

负载平衡意味着一组服务器可以被集中成为一个服务器集群。发往服务器的 请求被一个代理服务器处理后委派给服务器集群中最空闲的服务器,此后发送该请求的客户端将直接与那台服务器通信。具有负载平衡机制的系统一般应具有良好的扩展性,以便当客户端请求负载的增加时,更多的服务器主机能够被加入到服务器集群中。

失败恢复机制增强了服务器的容错性。如果集群内某台服务器失效停机,新的请求将被重新分配给其它某台服务器。简单的失败恢复不能解决所有问题,如果在某项任务的执行过程中服务器停机,负载平衡机制将会发现这个问题并将该任务重新分配给其它服务器,但是请求该任务的用户的状态和会话数据将对新服务器不再可用。正因为这个缺陷,有的应用服务器提供会话级失败恢复,状态和会话数据将被复制给集群内其它服务器或是被存储在永久性存储介质(如数据库)中,使用户数据对每个服务器总是保持可用。

1.3 JAVA简介与技术

1.3.1 JAVA简介

Java的诞生需追溯到1991年。当时,在Sun公司内,有一个称为Green的项目,这个项目的工程师受命设计一种小型的计算机语言,用于机顶盒、家电控制芯片等消费类设备。但是1993年交互式电视及PDA市场开始滑坡,而Internet开始盛行,Sun公司将市场目标投向Internet。1994年,原来的项目组编写了一个HotJava浏览器,当时正是这个浏览器吸引了全世界的眼球,1995年秋,Netscape决定让其浏览器支持Java,并在1996年年初发布了支持Java的版本。这意味着Java语言开始流行起来。后来,IBM、Oracle、Symantec、BEA、Inprise等许多著名IT公司都注册了Java使用许可证,甚至心不甘、情不愿的Microsoft也开始支持Java,Java逐渐成为了一个工业标准。

Sun于1996年年初发布了Java的第一个版本,在1998年召开的JavaOne大会上,又发布了Java 1.2版,这就是常说的Java 2,它以功能全面、具有高度扩展能力的新版本换掉了原来的GUI界面和图形工具包。朝着“一次编写,到处运行”的宏伟目标又前进了一大步。

1999年,Sun宣布了以Java 2平台为核心的JAVA、J2SE和J2ME三大平台。今天,这三大平台迅速推进,满足着不断增长的市场需求。2002年2月,Sun发布了J2SE 1.4版,成为最具竞争优势的企业级应用与服务的快速开发平台。该产品已通过中文编码国家标准GB18030的检测,标志着Java开发将在中国提速。

2002年9月,JAVA 1.4在日本JavaOne开发者大会上预演,并于2003年第一季度正式交付客户使用。而J2ME平台已被全球20多家顶尖的手机生产商在100多种不同类型的Java手机中采用。

2004年10月,Sun公司正式发布JDK 5.0版。作为通过JCP研发的最大规模的项目之一,有大约160位专家成员参与了JDK 5.0版本的研发。JDK 5.0提供了100多个新特性,从易用性和各个破记录的性能来看,JDK 5.0的推出被认

为是Java平台和编程语言近10年来最重大的升级。

现今Java联盟成员公司超过了400个,其中包括 Oracle、SAP、Sony、Motorola、Nokia、HP和Philips等。Java联盟的Java开发者超过300万。JAVA下载量超过100万,许可证接收方达35个。J2ME手机超过1 500万部,应用达5 000多个。 1.3.2 Java的特点

Java语言是一种优秀的编程语言。它最大的优点就是与平台无关,在Windo

ws 2000、Windows XP、Solaris、Linux、Mac OS及其他平台上,都可以使用相同的代码。“一次编写,到处运行”的特点,使得系统的移植、平台的迁移变得十分容易。

Java语言的设计者借鉴了C++的设计,Java语言是完全面向对象的语言,而C++至多只能算准“面向对象”的语言。Java语言的语法结构与C++语言的语法结构十分相似,这使得C++程序员学习Java语言相当容易。当然,如果仅仅是对C++改头换面,那么就不会有今天Java热闹的场面了,但这种借鉴是取其精华、去其糟粕的“拿来主义”的借鉴。Java语言提供的许多有用的新特性,使得Java语言比C++语言更易使用且不容易出错。简单地说,Java具有以下的特性:简洁性、面向对象、分布式运算、健壮性、安全性,跨平台、可移植。 1.3.3 JAVA技术

为了适应多层分布式体系结构的发展,人们相继开发了很多应用服务器产品。但不幸的是,大多数应用服务器还没有一个明确统一的标准,各个应用服务器都是按照自己的模式来提供服务。这就导致了开发人员不能够将为一种应用服务器开发的应用程序组件安全可靠地移植到另外一种应用服务器中。

基于上述原因,业界迫切需要一个服务器端组件体系机构的统一标准。这个统一标准需要明确定义出应用程序组件所必须遵循的统一的接口,让组件不再只能面向一种特定的应用服务器,而是能够在遵循相同标准的不同的应用服务器间安全可靠地移植。组件供应商因此不用再顾虑他们提供的组件与服务器的兼容性

问题以及诸如运行时所需要的安全、事务等服务和支持,从而可以专注于开发具体业务逻辑问题的解决方案。

正是基于这样的需求,JAVA应运而生。JAVA是一种利用Java2平台来简化诸多与多级企业解决方案的开发、部署和管理相关的复杂问题的体系结构。JAVA提供了多层分布式的应用系统模型、重用组件的能力、统一的安全模型和灵活的事务控制。基于组件的JAVA企业应用系统具有平台独立性,所以不受任何软件产品和任何软件厂商应用程序接口(Application Program Interface,API)的约束。JAVA具有如下一系列明显的优点:

1.JAVA是一个分布式应用系统的平台,几乎包括了企业级应用系统开发所需要的各种技术;

2. Java使得企业级应用真正实现“一次开发,到处运行”;

3.由于JAVA是一个规范,任何遵循该规范开发的应用程序组件都能够在实现了该规范的应用服务器上方便的移植并得到重用;

4.JAVA具有开放性和统一性,用户不必再受具体软硬件体系结构的约束; 5.JAVA提供了基于组件的开发技术,使得企业级应用程序的开发更加容易。 基于Java和Web的企业级分布式应用开发的标准,目前大多数主流应用服务器都已经支持JAVA。JAVA包含多项核心技术。

1.企业JavaBeans(Enterprise Java Beans,EJB)

EJB是JAVA中最重要、最核心的部分,它是一种服务器端的组件模型。一个EJB是一个运行在应用服务器端的非可视化的软件组件。EJB提供了一个框架来开发和实施分布式业务逻辑,简化了中间层的开发,它通过提供对中间层服务的支持,如数据库连接、事务、安全等,显著地简化了具有可伸缩性和高度复杂性的企业级应用的开发。

EJB规范定义了四种基本的Bean类型。

(1)无状态会话Bean(Stateless session bean):它提供某种单一的服务,不保存与特定客户的对话状态,在服务器发生故障时无法继续存在,其生命周期相对较短。

(2)有状态会话Bean(Stateful session bean):它提供了一种保持会话状态的服务,每个实例都与特定的客户机相关联,且只用于一个单一的线程,在与客户

机的方法调用之间维持对话状态。有状态会话Bean在服务器发生故障时无法继续生存,生命周期相对较短。

(3)实体Bean(Entity bean):它代表业务上的实体,包含与数据相关的逻辑。实体Bean一般与数据库形成一种对象/关系映射,一个实体Bean可以代表一个数据库中存储的对象。他们能够通过一个主关键字来识别并可以被不同的客户端所共享。EJB容器负责管理这些对象的持久性。实体Bean在服务器发生故障后能继续存在。

(4)消息驱动Bean(Message-Driver bean):它是EJB2.0新引入的一种Bean类型,用来监听消息的对象。消息驱动Bean在接收到Java消息服务(Java Message Service,JMS)的消息后执行,它们是事务可知的和无状态的,一般用来执行一些异步的方法调用。

2.Servlet

Servlet是一种独立于平台和协议的服务器端Java应用程序,用来拓展基于请求响应模式的服务器端的能力。Servlet位于Web服务器端,由Web服务器动态加载和卸载。Servlet具有多线程、持久性、灵活性及易于访问其它网络资源等特点,为创建基于Web的应用程序提供了基于组件的、平台独立性的方法。

3.Java服务器端页面(Java Server Pages,JSP)

JSP是Sun公司提出的一种基于Java的服务器端动态页面技术,是Servlet技术的扩展。与ASP相比,JSP更具有平台独立性。JSP页面由HTML代码和嵌入其中的Java代码以及JSP标记所组成。服务器在页面被客户端请求以后对这些Java代码和标记进行处理,然后将生成的HTML页面返回给客户端的浏览器。

4.Java数据库连接(Java Database Connectivity,JDBC)

JDBC API是一个标准的数据库访问接口,以一种统一的方式来对各种各样的关系数据库进行存取。与ODBC一样,JDBC为开发人员隐藏了不同数据库的不同特性。

另外,由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。

5.Java事务API(Java Transaction API,JTA)和Java事务服务(JavaTrans

action Service,JTS)

事务处理是企业计算中最主要的内容之一。JTA和JTS为JAVA平台提供了分布式事务服务。一个分布式的事务涉及一个事务管理器和一个或者多个资源管理器。一个资源管理器是任何类型的持久性的数据存储。事务管理器负责协调所有事务参与者之间的通信。JTA事务比JDBC事务功能更强,JDBC事务局限于一个数据库连接,而JTA事务可以有多个参与者。

6.Java名字和目录接口(Java Naming and Directory Interface,JNDI) JNDI API被用于执行名字和目录服务。由于JAVA应用程序组件一般分布在不同的机器上,所以需要一种机制以便于组件客户使用者查找和引用组件及资源。在JAVA体系中,使用JNDI定位各种对象,这些对象包括EJB、JDBC数据源及消息连接等。JNDI为企业应用中的多种命名和目录服务提供统一接口,使应用程序组件可以统一访问这些命名和目录服务。

7.JMS

JMS被用来支持开发面向消息的分布式计算系统,它提供创建、发送、接收、 读取消息的服务。JMS的目的是提供给消息系统中的客户一个固定的接口,而且与底层的消息提供者无关。它提供了通用的消息模型以支持不同的异步和同步通讯机制,按处理机制的不同,可分为发布/订阅(PUB/SUB)模型和点到点(P2P)排队模型。

第二章 系统总体设计

2.1 Web应用服务器DM WAS功能需求

Web应用服务器是多层体系结构中的关键部件,Web应用服务器有其共有的功能特性,包括客户端连接管理、状态和会话管理、业务逻辑处理、数据库连接、安全管理和事务管理等。

具体到JAVA中,一个符合JAVA规范的Web应用服务器需要提供的服务除了要满足一般需求外,还有其特殊之处,主要表现在如下几个方面。

1.Web容器服务

Web容器负责加载和执行Web应用程序,接受Web请求,返回动态的Web页面。Web容器中的组件可使用EJB容器中的组件完成复杂的业务逻辑。

2.EJB容器服务

负责管理EJB组件的生存期和EJB组件的状态,调度EJB实例池以及池中的EJB组件,管理执行EJB规范的Java类和EJB组件服务的接口插入类。

3.命名服务

服务器要提供JNDI的实现以便实现相关资源的绑定和查找。 4.事务服务

负责处理分布式事务,提供对EJB组件的事务管理。在JAVA中,一个事务资源可能是JDBC连接、JMS会话或者是JCA资源适配器的连接。事务之间的联系是隐含的分布式请求传递。该服务要实现JTA规范,允许从客户端的应用软件中明确的开始和结束事务。

5.数据库服务

负责处理数据源对象。数据源是为了处理数据库连接的标准JDBC管理对象。数据库服务在服务器中创建、加载数据源,同时负责管理连接池。

6.安全服务

执行JAVA规范指定的访问服务器组件和应用程序的授权机制。

2.2系统架构分析

软件架构的设计是决定软件系统的性能和可扩展性等质量指标的重要因素。在基于JAVA的Web应用服务器的实现产品中,开源的Tomcat应用服务器在系统架构方面给了我们很多有益的启迪。 2.2.1 Tomcat体系结构分析

Tomcat是Sun公司官方推荐的Servlet和JSP容器。Tomcat从4.0版本开始,在体系结构上进行了调整,与4.0之前所采用的基于模块的链式控制结构相比,Tomcat在4.0之后采用了面向组件的设计方式,各部分功能都是由组件提供的,控制流程通过组件之间的通讯完成。

设计组件时应该从不同的问题领域,站在不同的观点上分析,把每一种属性分别考虑。例如Tomcat中的FileLogger组件,它用于把系统日志信息保存到文件系统中。按照这种模式分析,我们从不同的角度看待它:它如何启动服务、停止服务和进行通讯?它的具体的功能有哪些?别的组件可以发给它哪些消息?基于这些考虑,FileLogger组件实现了两种接口:Lifecycle(生存期接口)和LoggerBase(基本功能接口)。Tomcat中使用了Inversion of Control(IOC)模式,其意思是组件总是通过外部进行管理的。组件需要的信息总是来源于外部,实际上组件在生存期的各个阶段都是被创建它的组件管理的。在Tomcat4.0中就是通过这种组件之间的相互控制和调用实现各个功能的。

Tomcat的基本流程是首先通过解析XML格式的配置文件(server.xml和web.xml),获得系统的配置和应用信息,然后加载定制的组件模块提供各种系统服务。Tomcat的常用组件包括:Server、Service、Connector、Engine、Host、Context。

Server代表整个Tomcat的Catalina Servlet容器,它包含一个或多个Service;Service由一个或者多个连接器(Connector)以及一个共享的处理引擎(Engine)组成,Engine负责处理所有Connector所获得的客户请求;Connector在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得响应结果,并返回给客户端;Engine代表一个Service所属的请求处理机,它接受所有Connector传递过来的客户端请求,将处理结果返回给Connector,由

Connector将最终响应返回给客户端,Engine必须配置在Service组件下;Engine下可以配置多个Host,每个Host都有一个域名,当Engine获得一个请求时,它把该请求匹配到某个Host上,把请求交给该Host来处理;Host代表一个虚拟主机,每个虚拟主机和某个网络域名相匹配。每个虚拟主机下都可以部署一个或者多个Web应用程序,每个Web应用程序对应于一个Context,有一个Context路径;一个Context对应于一个Web应用程序,一个Web应用程序由一个或者多个Servlet组成。Tomcat整个系统的功能都是通过组件实现的,组件之间的通讯构成了系统的运行控制机制,具有很高的复用性和可扩展性。 2.2.2组件技术

组件技术越来越广泛地应用于软件系统设计中,它是为提高软件的可重用性而提出的,其思想是将软件按一定的标准封装成组件,对外提供一组访问接口,指明组件与容器或与其它组件交互的机制。面向组件的技术(Component-Oriented,CO)是比面向对象的技术更高一层的抽象,它融合了面向对象的优点,加入了安全性和可扩展的模块设计,可以更好的映射问题域空间。采用面向组件的设计会带来很多好处,可以提高复用性、降低耦合度和通过组装构成系统等。

应用服务器系统吸取了组件技术所提供的优点,采用开放的层次组件式结构,系统的各种资源均以服务的形式提供,服务按功能划分层次,形成不同组件,服务与系统核心之间定义公共接口标准,所有服务采用标准接口实现与底层通讯。采用这种层次式组件结构,组件通过核心层定义的公共标准接口实现与底层通讯,系统功能作为组件式服务部署和管理,整个系统可以在不影响现有应用的基础上,实现对组件的修改和扩展。

JAVA是一个基于组件的多层网络应用体系结构,它定义了一套标准化的组件,并为这些组件提供了完整的服务,这意味着应用程序的不同部分可以运行在不同的设备和系统上。其核心是容器,容器提供了组件服务的运行环境和对企业信息系统的标准访问,还提供了配置和部署应用程序行为的机制。

2.3 DM WAS体系结构

2.3.1服务器总体设计框架

JAVA平台从功能上大体可以划分为两个大的组成部分:Web服务器和EJB服务器。Web服务器主要是为JSP和Servlet提供运行平台,实现企业应用程序的Web表示层;EJB服务器主要是提供EJB组件的运行环境,为业务逻辑事务层服务。各个厂商一般会根据需要有选择地实现全部或部分JAVA规范,如OpenEJB是一个实现了EJB规范的纯EJB容器,Tomcat是一个主要提供Servlet和JSP服务的Web容器,当然它也实现了JNDI、连接池、事务处理等相关服务。

在总结国内外Web应用服务器研究的基础之上,结合具体的需求分析,我们提出如下系统总体框架,如图2.1所示。

图2.1 DM WAS总体框架图

由图中可以看出,整个Web应用服务器的功能是由一个个的组件提供的。采用组件技术,能够提高系统的可扩展性。整个系统由11种组件组成。

1.服务器启停组件

服务器启停组件实现服务器的启动与停止。服务器启动时,完成如下一些工作:

初始化类装载器,初始化JNDI服务,读入服务器配置文件server.xml(由XML组件中的xml解析器完成解析),根据配置文件的内容配置相应的资源服务(如数据源的初始化),启动“停止服务器”监听线程并注册虚拟机停止钩子(hook),初始化Web应用程序上下文,初始化并启动Http连接管理组件,初始化其它内置服务(如内置的数据库等)。

2.Http连接管理组件

Http连接管理组件负责建立一个或多个ServerSocket并监听来自客户端的连接请求。它在初始化过程中获取服务器启停组件读入的服务器配置信息,如服务器绑定的IP地址和端口号、线程池能够允许的最大线程数和最小线程数等,建立ServerSocket,并循环地接收客户端的连接。当某个客户端发出连接请求时,它建立一个Socket对象并将该对象包装成request和response对象赋给请求处理任务的实例,交由线程池处理。

3.静态资源处理器

静态资源处理器完成对静态页面html、图片等静态资源的请求处理。如果用户请求的是一个目录,它可根据服务器的配置决定是否显示欢迎页面、显示目录内容或给出出错信息。

4.Servlet容器

Servlet容器是服务器的核心,它实现并扩展了Servlet2.3规范中的绝大多数接口。Servlet容器在系统启动过程中完成初始化,包括Web应用程序上下文的配置、Web描述符的解析以及根据Web描述符的配置决定是否预先装入某些Servlet。

它实现了基于Session和Cookie的会话管理机制,能够有效地对用户会话进行跟踪。

Servlet实例池能够对用户的请求做出快速响应。根据Web描述符能够处理任何匿名或非匿名的Servlet请求。

5.JSP引擎

JSP引擎是服务器的另一个核心组件,用来处理对JSP页面的请求。当Servlet容器监听到客户端请求的是一个JSP页面时,它将请求转发给JSP引擎。JSP引擎将对JSP文件进行解析并生成相应的Servlet代码,随后对生成的Servlet进行

编译并加载到内存中,然后将该Servlet交给Servlet容器进行处理。上述过程会随时因发生错误(如JSP文件写法不规范,找不到引用类等)而终止。对于所有的随后而来的对该JSP文件的请求,JSP引擎将检查该JSP文件自最后一次被存取后是否经过修改。如果没有修改则请求将交给还在内存中的Servlet以一种同时发生的方式加以处理。由于Servlet始终驻于内存,所以响应是非常快的。如果JSP文件被修改了,JSP引擎将自动地对该文件重新编译,并将结果取代内存中的Servlet,并继续上述处理过程。

6.数据库连接管理组件

数据库连接管理组件管理数据库的连接操作,它包括一个事务管理器和一个数据库连接池。事务管理器采用JTA和JTS为开发者提供数据库的事务支持,开发人员可以有选择地通过JNDI访问事务管理器控制事务或自己使用JDBC接口控制事务。

数据库连接池实现了javax.sql.DataSource接口并对开发人员屏蔽了引用的细节,开发人员只需要通过JDNI查找DataSource的逻辑名称就可以获得数据库连接从而操纵数据库。

7.XML组件

XML组件包括XML解析器、XSL转换器、XMLJDBC组件等。它负责系统中所有XML文件的解析工作,能够完成XML文件与关系数据库之间数据的存取与转换,以及与XML数据库的连接。

8.JNDI组件

JNDI组件为用户访问Java名字和目录服务提供了便利,任何有关JNDI的查找和绑定工作都由该组件完成。

9.安全管理组件

安全管理组件采用基于安全域(security realm)的方式实现服务器中用户的认证和授权。在身份认证方面,使用基于HTTP基本验证方式和基于表单(FORM)的认证方式;在授权方面,使用基于角色的访问控制。所有安全操作由服务器管理,用户只需在Web应用描述符中进行配置。

10.日志管理组件

日志管理组件负责系统的日志记录工作。我们采用了优秀的日志记录软件

Log4j并对其进行了扩展以满足本地化需求。日志管理组件提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别,用户可根据需要进行定制,以捕捉有关应用程序运行时行为的细节。

11.服务器接口组件

服务器接口组件负责与DM EJB服务器的连接工作。它通过JNDI与DM EJB服务器进行通信,从而实现DM WAS和DM EJB服务器的互连,形成一个完整的JAVA应用服务器。

2.3.2服务器总体方案的特点

基于JAVA的DM WAS处于Web浏览器/DM WAS/DM数据库服务器三层体系结构的中间层,该服务器具有6个基本特点。

1.规范性

DM WAS严格遵循JAVA规范,任何符合JAVA规范的Web应用程序都能够在我们的服务器中正确地配置和运行。

2.适应性

DM WAS严格来说是一个Web容器,但我们提供与DM EJB服务器的整合,从而可以给用户提供完整的JAVA开发环境。

3.安全性

在服务器中可以配置各种组件的安全性,只有被授权的用户才能访问系统资源。每一个客户隶属于一个特定的角色,而每个角色只能访问特定的资源。开发人员可以在应用部署描述符中声明角色和可被访问的资源,而不必在应用程序中硬编码安全规则。

4.可配置性

用户可以通过服务器配置文件方便地对各项参数进行修改,从而达到最佳运行效果。

5.可管理性

我们提供良好的操作管理界面帮助服务器管理人员管理服务器以及部署在服务器中的Web应用程序。

6.易用性

服务器应用程序目录结构规范,Web应用程序部署方便简单,具有对WAR

文件的自动解压,简单的批处理文件使得启停服务器变得异常方便。

2.4 DM WAS的运行过程

DM WAS基于HTTP/1.1协议,支持JAVA中Servlet、JSP、JDBC、JNDI等相关规范,能够部署大多数基于Web的Java应用。DM WAS由服务器核心类、Java核心类库、第三方软件包、一组配置文件和多个Web应用程序组成。

服务器在启动时读入并解析服务器配置文件,并初始化一系列服务,包括类装载器、数据库连接池、JNDI、数据源等资源在JNDI上的绑定、线程池、Web应用程序的上下文等,最后建立ServerSocket,等待客户端连接。

第三章 系统技术实现

3.1 Http连接管理组件

一个客户机与一个服务器要进行有效的通信,他们之间必然要遵守某种共同的协议,当前,浏览器和Web服务器之间大多采用超文本传输协议HTTP进行通信。HTTP协议是基于TCP/IP协议之上的应用层协议,具有无连接、无状态、面向对象等几个特点。HTTP协议基于请求/响应机制,其工作原理包括四个步骤。

1.连接:浏览器与服务器建立连接,打开一个称为套接字(socket)的虚拟文件,此文件的建立标志着连接建立成功。

2.请求:浏览器通过socket向服务器提交请求。

3.应答:服务器接收到该请求后,进行相应的事务处理,然后将处理结果通过HTTP传回给浏览器。

4.关闭连接:当应答结束后,服务器断开与浏览器的连接,以保证更多的浏览器能够与服务器建立连接。

Http连接管理组件位于DM WAS的最前端,它在服务器启动过程中获取服务器配置参数并初始化,负责监听端口,接收请求消息,并且将处理后的回复反馈给客户端。 3.1.1组件实现

Http连接管理组件基于HTTP协议,负责建立一个或多个服务器Socket并监听来自客户端的连接请求。当某个客户端发出连接请求时,它建立一个Socket对象,读出Socket输入输出流,将输入流进行解析并提取相关信息,然后实例化一个请求处理任务,并将输入输出流分别包装成request和response对象赋给该任务,交由线程池处理。流程图如图3.1所示。

图3.1 Http连接管理组件流程图

Http连接管理组件由LifeCycle、Server、HttpServer、ConnectionHandler、RequestHandler、Request、Response等类和接口以及实现线程池的相关类组成。

下面详细介绍一下相关的数据结构。 interface LifeCycle{

void start()throws LifeCycleException; void stop()throws LifeCycleException; boolean isStarted(); }

LifeCycle代表组件的生命周期接口,其目的是以一种一致的方式来管理组件的启动与停止。服务器中所有具有生命周期的组件如服务器类、应用程序上下文类都必须实现该接口。

interface Server extends LifeCycle{ String getServerInfo();

String getServerName(); int getServerPort(); String getAppBase();

URLClassLoader getWebappParentClassLoader(); }

Server代表整个服务器,它包含服务器的相关属性信息,负责服务器的启动与停止。

它由服务器启停组件调用。HttpServer类是对Server接口的实现,并扩展了对Servlet容器的接口。

class ConnectionHandler implements LifeCycle{ ServerSocket openSocket()throws LifeCycleException; void accept();

void handleConnection(Socket socket)throws IOException; }

ConnectionHandler实现了生命周期接口,它根据Server中的相关信息建立 ServerSocket,循环地接收客户端的连接请求。它获取客户端的Socket连接对象,读取输入输出流,然后交给RequestHandler任务处理。

class RequestHandler implements LifeCycle,Task{ void parseRequest(InputStream inputstream) void execute(Request request,Response response) }

RequestHandler同时实现了生命周期接口和Task接口,从而可以交给线程池处理。

RequestHandler解析输入流,读取HTTP请求头,将输入输出流包装成Request和Response对象,然后被ConnectionHandler放入线程池中,交由线程池执行。

interface Request extends javax.servlet.http.HttpServletRequest{ void setResponse(Response response); void setSocketInputStream(InputStream is); void addCookie(Cookie cookie);

void addHeader(String headerName,String headerValue); }

interface Response extends javax.servlet.http.HttpServletResponse{ void setRequest(Request request);

void setSocketOutputStream(OutputStream os); void writeHeaders()throws IOException; void flush()throws IOException; }

Request和Response是对Socket输入输出流的包装并实现了相关的Servlet接口,以一种对象的形式屏蔽了HTTP底层操作的细节。 3.1.2多线程

Web服务器应用程序常常要处理来自远程的大量而短小的任务,其特点是单个任务处理的时间很短而请求的数目却很大且很多请求是同时进行的。

显然单线程的处理机制无法满足我们的需求。在服务器程序中,使用多线程是提高服务器性能的捷径。实践证明,采用多线程设计可以极大地改善系统的响应性能,提高程序的并行性。

多线程,顾名思义就是在应用程序中使用多个线程。在服务器应用程序中 使用多线程的意思是对于接收的每一个请求我们使用一个单独的线程进行处理。构建多线程应用程序时,一个简单的方法是:每当一个请求到达时就创建一个新线程,然后在新建的这个线程中对该请求进行处理。实际应用中,这种方法的缺点是很明显的:为每个请求创建一个新线程的开销是很大的;创建过多的线程可能会导致系统由于内存消耗过度而导致系统资源不足。

资源不足是多线程应用中需要注意的一个问题。为了防止资源不足,服务器应对创建和销毁线程的次数进行合理的调整,尽量重用已有的线程。

池化技术被广泛的应用于服务器端软件的开发上。池化技术简单来说就是对已创建的对象放在一个池中进行缓存,将来需要某对象时,就从池中获取,从而达到重用对象的目的。线程池技术是池化技术的一种,当需要完成某项任务时,直接从线程池中取出线程来对任务进行处理,任务处理完后,将线程返回线程池,

其优点是:任务到达时,由于不需要新建线程,而是直接使用已有线程,提高了应用程序的响应速度。而且,通过适当地调整线程池中的最大线程数目和最小线程数目,可以防止系统资源不足问题。

3.1.2.1实现

在DM WAS中我们使用了多线程机制,对于单个的请求都交给线程池模块进行处理。我们使用事件驱动处理的方法实现线程之间的调度。在事件驱动处理的情况下,需要一种发信机制来控制某一特定线程何时应该运行。在Java中,可以使用wait()、notify()和notifyAll()方法向线程发送信号。这些方法允许线程在一个对象上阻塞,直到所需的条件得到满足为止,然后再次开始运行。这种设计减少了CPU占用,因为线程在阻塞时不消耗执行时间,并且可在notify()方法被调用时立即唤醒。与其它方法相比,事件驱动方法可以提供更短的响应时间。

线程池模块包括线程池、工作线程、任务队列、任务接口等几个部分。 class ThreadPool implements LifeCycle{ void initPool();//初始化线程池 void createWorker();//创建工作线程

void execute(Task task);//执行指定任务/*将工作线程返回到池中*/

void returnWorker(WorkerThread worker);/*通知线程池该任务发生异常,从而线程池可以结束该任务并回收该任务所占用的工作线程*/

void errorOccur(Task task); }

ThreadPool代表线程池,其作用是创建、销毁并管理线程,将工作线程放入线程池中,调用工作线程执行任务,销毁异常任务。

class WorkerThread implements Runnable{ void run();//运行工作线程 boolean overtime();//线程是否超时 }

WorkerThread代表一个工作线程,它是一个独立的可以循环执行任务的线程对象,在没有任务时进行等待(wait),在任务到达时被唤醒(notify)执行。

class TaskQueue{

void pushTask(Task task);//将任务放入任务队列的队尾

Task popTask();//从任务队列的队头取出任务执//行并从队列中删除该任务 void RemoveTask(Task task);//从任务队列中移走任务 }

TaskQueue代表一个任务队列,其作用是提供一种缓冲机制,将没有处理的任务放在任务队列中,等到有工作线程可用时依次执行队列中的任务。

interface Task{

void start();//任务开始执行 void reject();//丢弃该任务 }

Task是一个接口,它是每个任务必须实现的接口,线程池只执行实现了该接口的类,它提供一组方法用来规定执行任务的入口、任务的执行状态、任务执行完后的收尾工作等,从而保证线程逻辑和应用逻辑的分离,工作线程通过该接口调度任务的执行。

3.1.2.2流程图

线程池处理任务的过程如图3.2所示。 3.2.2.3存在的问题

线程池为我们构建多线程的服务器应用程序提供了强大的机制,但使用它可能会出现一些问题。

1.资源不足问题

这里的资源包括线程自身所使用的资源、线程处理任务时可能需要的其它资源,例如数据库连接、Socket套接字或文件输入输出流等。资源不足问题的本质原因就是过多创建线程从而消耗包括内存和其它系统资源在内的大量资源。

为解决资源不足问题,我们在线程池中提供了几个参数供用户根据实际情况优化线程池。

(1)maxThreads:线程池中最大线程数,默认为无限大。通常我们期望 maxThreads应该是服务器能够接受的最大并发访问数。如果有多于maxThreads的并发请求,多余的请求将被任务队列进行缓存。

图3.2线程池处理任务的流程图

(2)minTreads:线程池中最小线程数,默认为1。服务器启动时,会初始化值为minTreads的线程数。

(3)maxQueueCount:任务队列中能够缓存的最大请求数,默认为10。当任务队列已满时,多余的请求将被服务器拒绝。

(4)keepAliveTime:线程池中空闲线程能够保持的最大时间,默认为-1(表示永不过期)。KeepAliveTime保证了当并发访问数较低时,一些空闲的线程能够被服务器终止,从而被垃圾回收器回收。

2.线程泄漏问题

线程池中可能出现的另一个问题是线程泄漏问题。所谓线程泄漏,是指当从线程池中取出一个线程以执行一项任务,而在任务完成后该线程却没有返回池中。一个任务在长时间运行后不可避免会产生一些诸如连接超时或中断的情况,从而抛出一个运行时的异常或错误。如果线程池没有捕捉到它们,那么这样的线程就会直接退出,从而线程池中线程的数目将会永久减少一个。当这种情况发生的次数越来越多时,线程池最终就会为空,从而服务器无法为后续请求提供服务,因为池中已经没有可用的线程来处理任务。

对于线程泄漏问题,我们在工作线程中监视任务对象的运行状况,如果发生错误,通过errorOccur()方法通知线程池进行相应的处理,从而保证所有的工作线程运行正常。

3.2 JSP引擎

JSP给开发者提供了两个重要的能力:(1)它提供了访问远程数据的机制如EJB、JDBC、远程方法调用(Remote Method Invocation,RMI);(2)它让开发者从表现中封装和分离程序逻辑而达到最大程度的代码重用和灵活性。逻辑与表现的分离是它超越其它Web应用结构的一个主要优势。

JSP引擎主要功能是处理JSP文件。当Servlet容器发现用户请求的是一个JSP页面时,它将该请求交给JSP引擎进行处理。因此,可以说在响应请求的过程中JSP引擎是由Servlet容器调用的。我们将JSP引擎的入口程序设计成一个Servlet,该Servlet是JSP引擎的主导程序,包括对JSP引擎的初始化以及调用其它相关类对JSP页面进行处理。

JSP引擎处理JSP文件包括三个大的步骤:

(1)判断该JSP文件对应的Servlet实例是否存在并有效,如果条件满足,直接返回原实例,否则,进行下一步,该过程称为JSP的预处理;

(2)解析JSP文件生成Java文件;

(3)将Java文件编译成Java类,生成的Java文件必须实现

javax.servlet.jsp.HttpJspPage接口,HttpJspPage继承自Servlet接口,因此最终生成的Java类实际上就是一个Servlet。

上述过程如图3.3所示。

图3.3 JSP引擎处理JSP的过程

3.2.1 JSP的预处理

JSP的预处理的作用是判断请求的JSP文件是否已经编译成了Servlet且该Servlet是否是一个有效的Servlet。如果是第一次请求该JSP,则请求JSP解析器对JSP进行解析;如果该JSP曾经被解析过,按照如下规则决定是否需要对该JSP进行重新解析和编译:

1.JSP源代码改变时,重新解析和编译页面;

2.JSP页面中包含的其它页面的源代码改变时,重新解析和编译页面; 3.内存中代表该JSP的Servlet对象不存在时,重新解析和编译页面; 4.原来生成的Servlet类不再存在时,重新解析和编译页面; 5.除去以上四种情况,不再重新解析和编译页面。

对JSP的进行预处理对于提高服务器的响应性能具有重要意义。因为如果一个JSP从未改变,如果每次请求该JSP时,JSP引擎均重新解析和编译该JSP,不仅浪费系统资源,而且延长了对客户端的响应时间。 3.2.2解析JSP

JSP文件的解析是JSP引擎工作的核心。一个JSP页面由静态数据和动态数据组成,动态数据已经是Java代码,所以它们不必修改就可以使用,动态数据被顺序放进生成的Servlet的_jspService方法中。静态数据嵌入到_jspService方法中的javax.servlet.jsp.JspWriter实例的write方法中。

解析JSP的过程实际上就是对JSP源代码解析后,按照JSP规范组合成一个Servlet源文件的过程。

JSP引擎使用JspReader、JspParser、ServletWriter等几个类来实现对JSP文件的解析。

class JspReader{

int read(); void unread(int c);

void setLineNumber(int lineNumber); int getLineNumber(); }

JspReader是对java.io包中的PushbackReader和LineNumberReader的封装,具有读出(read)或回退(unread)单个字符和字符数组以及定位当前JSP文件行数的功能。

class JspParser{ Document parse(); Node addTag();

Node addIncludeDirective(); Node addScriptlet(); Node addExpression(); Node addText(); }

JspParser预先定义一组JSP的标准标签,并调用JspReader来读取JSP文件内容,根据JSP的标准标签,将读出的文件内容封装成一个XML Document对象。

class ServletWriter{ void writePageBegin(); void writeDeclaration(); void writeJspServiceBegin(); void writeImplicitObjects(); void writeMainSection(); void writeJspServiceEnd(); void writePageEnd(); }

ServletWriter根据生成的XML Document对象并结合JSP规范生成一个Servlet源文件。

3.3.3 Servlet过滤器

Servlet2.3规范增加了一个很重要的新功能—Servlet过滤器(Servlet Filter),其主要作用是在客户端请求到达被请求的服务之前,或者服务响应离开服务器到达客户端之前,根据需要对请求或响应进行预处理。

与Servlet一样,一个Filter也有三个方法表示它的生命周期:init、doFilter和destroy。容器处理Filter的生命周期与处理Servlet类似,这里不再重述。

容器实现过滤器的机制关键是要处理好过滤链(FilerChain)。DMFilerChain实现了FilerChain接口,用以表示一个或多个Filter的集合。DMFilerChain内部采用一个队列用来存储所有该过滤链上的所有过滤器。过滤链上的过滤器执行时具有先后顺序,它们按照击鼓传花的方式逐个执行。

DM Servlet容器按照如下方法处理过滤器:当容器接收到一个请求时,它获取请求的requestURL,找出所有在Web描述符中定义的与该requestURL匹配的Filter,按照Web描述符中配置的Filter映射的先后循序逐个将这些Filter加到DMFilerChain过滤链上。DMFilerChain对象通过Filter的doFilter方法传给该过滤链上的每个Filter。过滤链提供doFilter方法用以激活过滤链上下一个Filter。

是否调用过滤链的doFilter方法完全由应用程序决定,容器只保证在请求到达时激活过滤链上的第一个Filter。如果过滤器在过滤链的尾部,没有后继过滤器,容器将处理客户端所请求的服务。

全文总结

JAVA是Sun公司提出的一种新的多层分布式计算体系结构的技术框架,是一整套技术的总称,包括建立企业应用系统的各个方面。Java语言的服务器端应用的框架,支持平台独立、可移植、多用户、安全和标准的企业级应用。使用JAVA技术能够快速建立可伸缩性的企业应用系统。目前市场上出现了很多成熟的应用服务器产品,多数数据库厂商也针对自己的数据库系统推出了应用服务器中间件,以便为企业应用提供整体解决方案。本课题就是在这一背景下提出的。

DM WAS实现了三层体系结构中的应用逻辑层,以DM关系数据库系统为数据管理层、标准Web浏览器为应用表现层,构成了完整的基于Web的三层结构的应用系统平台。

本课题在研究HTTP协议和JAVA规范白皮书的基础上,开发出一种基于JAVA的DM WAS,本文的研究工作主要体现在下面几个方面:

1.设计并实现了基于JAVA规范的Web应用服务器,它能够处理静态资源、动态JSP页面、Servlet等大部分服务器端Web资源,任何符合JAVA规范的Web应用程序都能够在DM WAS中配置运行;

2.实现了服务器的多层类装载体系,以支持热部署和控制Web应用程序对类和资源文件的访问权限;

3.为满足服务器端多线程体系结构的需求,设计并实现了线程池,并对运行过程中可能出现的资源不足、内存泄露等问题给出了解决方法;

4.参照JDBC2.0扩展标准,在服务器中实现了数据库连接缓冲池技术,对物理连接和逻辑连接进行两级缓存,提高数据库物理连接的利用率,改善连接请求的响应性能;

5.采用基于域的方式实现服务器端的安全管理功能,实现了基于HTTP基本验证和基于表单的身份认证以及基于角色的访问控制。

参考文献

[1]樊银亭,何鸿云.基于客户机/服务器体系的二层与三层结构研究.计算机应用研究,2001,18(12):23~24

[2]徐琨,刘志镜,来琳涵.Web数据库访问的中间件技术分析与研究.计算机工程与科学,2002,24(4):54~56

[3]齐勇,赵季中,侯迪等.基于Web的中间件系统集成框架—应用服务器的研究.计算机研究与发展,2001,38(4):430~437

[4]范国闯,钟华,黄涛等.Web应用服务器研究综述.软件学报,2003,14(10):1728~1739

[5]齐勇,赵季中,侯迪等.中间应用服务器中分布对象事务服务管理技术研究.西安交通大学学报,2001,35(2):133~136

[6]赵仲孟,沈海斌,王瑞等.JAVA应用服务器安全服务体系的分析与实现.计算机工程与应用,2003,21(3):175~177

[7]桂艳峰,林作铨.一个基于角色的Web安全访问控制系统.计算机研究与发展,2003,40(8):1186~1194

[8]唐建平.与应用服务器平台无关的Web认证和授权方法.计算机应用,2003,23(8):70~72 [9]范国闯,朱寰,黄涛等.Web应用服务器自适应负载平衡服务.软件学报,2003,14(6):1134~1141

[10]邓丽.基于JAVA规范的网络平台应用服务器的研究:西安建筑科技大学图书馆.2002

[11]张震,张曾科,秦颖.用Java开发Web服务器组件的方法.计算机工程与应用,2001,37(8):45~46

[12]阮彤,李京,冯东雷.基于Java的应用服务器的设计与实现.计算机研究与发展,2001,38(8):939~946

[13]姚念民,郑名扬,鞠九滨.基于流水线的高性能Web服务器.软件学报,2003,14(6):1127~1133

[14]万江平,何思遥,吴越等.用Java开发HTTP服务器.计算机应用研究,2000,17(2):60~62 [15]Claire Cloutier,Molly Shangraw,Joan McGaw,et al.Java Network

[46]宋维维,陈淑珍,孙晓安.Java语言中的多线程和双缓冲技术.计算机工程,1998,24(12):30~31

[16]陈泽斌,张凌.新型Web服务器Jigsaw结构与功能分析.见:全国第一届JAVA技术及应用研讨会论文集.北京.1998.北京:中国计算机学会,1998.114~119 [17]门志勇.Servlet过滤器研究.微型机与应用,2002,21(3):7~8

[18]左华,袁太文,谢寄石.Java中的名字目录服务及其管理实现.微型机与应用,2002,21(5):13~14

[19]R.Fielding,J.Gettys,J.C.Mogul,et al.RFC 2616,Hypertext Transfer

Protocol—HTTP/1.1.Massachusetts:The World Wide Web Consortium,1999.13~92

[20]Edith Cohen,Haim Kaplan,Jeffrey Oldham.Managing TCP connection under persistent HTTP.in:Proceeding of the eighth international conference on World Wide Web.Toronto,Canada. 1999.New York,NY USA:Elsevier North-Holland,Inc.,1999.1709~1723

[21]Thiemo Voigt,Per Gunningberg.Kernel-based control of persistent web server connections. ACM SIGMETRICS Performance Evaluation Review, 2001,29(2):20~25

本文来源:https://www.bwwdw.com/article/8s3g.html

Top