文档库 最新最全的文档下载
当前位置:文档库 › 揭开J2EE集群的神秘面纱

揭开J2EE集群的神秘面纱

揭开J2EE集群的神秘面纱

2005年八月

转载自https://www.wendangku.net/doc/f410340560.html,/esoftwind

翻译自TSS的文章。-- Uncover the hood of J2EE Clustering

原文:https://www.wendangku.net/doc/f410340560.html,/tt/articles/article.tss?l=J2EEClustering

整理:枫远雅客https://www.wendangku.net/doc/f410340560.html,

1.序言

越来越多的关键应用运行在J2EE(Java 2, Enterprise Edition)中,这些诸如银行系统和账单处理系统需要高的可用性(High Availability, HA),同时像Google和Yahoo这种大系统需要大的伸缩性。高可用性和伸缩性在今天高速增长的互连接的世界的重要性已经证实了。eBay于1999年6月停机22小时的事故,中断了约230万的拍卖,使eBay的股票下降了9.2个百分点。

J2EE集群是用来提供高可用性和伸缩性服务,同时支持容错处理的一种流行的技术。但是,由于J2EE规范缺乏对集群的支持,J2EE供应商实现集群的方法也各异。这给J2EE架构师和开发人员带来了很多困难。以下是几个常见的问题:

z为什么带集群功能的商业J2EE服务器产品如此昂贵?(10倍于不带集群功能的产品)

z为什么基于单服务器环境构建的应用不能在集群中运行?

z为什么应用在集群环境中运行得很慢,但在非集群环境中却快得多?

z为什么集群的应用移植到其他服务器中失败?

理解这些限制和要素的最佳方法是学习他们的实现方式。

2.基本术语

在我们讨论不同的集群实现之前,先谈谈几个概念。这有助于理解不同的J2EE集群产品不同的设计结果和概念:

伸缩性(Scalability):

在一些大的系统中,预测最终用户的数量和行为是非常困难的,伸缩性是指系统适应不断增长的用户数的能力。提高这种并发会话能力的一种最直观的方式就增加资源(CPU,内存,硬盘等),集群是解决这个问题的另一种方式,它允许一组服务器组在一起,像单个服务器一样分担处理一个繁重的任务。

高可用性(High availability):

单一服务器的解决方案并不是一个健壮方式,因为容易出现单点失效。像银行、账单处理这样一些关键的应用程序是不能容忍哪怕是几分钟的死机。它们需要这样一些服务在任何时间都可以访问并在可预期的合理的时间周期内有响应。集群方案通过在集群中增加的冗余的服务器,使得在其中一台服务器失效后仍能提供服务,从而获得高的可用性。

负载均衡(Load balancing):

负载均衡是集群的一项关键技术,通过把请求分发给不同的服务器,从而获得高可用性和较好的性能。一个负载均衡器可以是从一个简单的Servlet或Plug-Ins(例如一个Linux box利

用ipchains来实现),到昂贵的内置SSL加速器的硬件。除此之外,负载均衡器还需执行一些其他的重要任务,如“会话胶粘”让一个用户会话始终存在一个服务器上,“健康检查”用于防止将请求分发到已失效的服务器上。有些负载均衡器也会参与我们下面将要谈到“失效转移”过程。

容错(Fault tolerance):

高可用性意味着对数据正确性的要求不那么高。在J2EE集群中,当一个服务器实例失效后,服务仍然是有效的,这是因为新的请求将被冗余服务器处理。但是,当一个请求在一个正在失效的服务器中处理时,可能得到不正确的结果。不管有多少个错误,容错的服务应当能确保有严格的正确的行为。

失效转移(Failover):

失效转移是集群中用来获取容错能力的另一项关键的技术。当一个结点失效后,通过选择集群中的另一个结点,处理将会继续而不会终止。转移到另一个结点可以被显式的编码,或是通过底层平台自动地透明地路由到另一个服务器。

等幂方法(Idempotent methods):

等幂方法是指这样一些方法:重复用相同的参数调用都能得到相同的结果。这些方法不会影响系统状态,可以重复调用而不用担心改变系统。例如:getUsername()就是等幂的,而deleteFile 就不是。当我们讨论HTTP Session失效转移和EJB失效转移时,它是一个重要的概念。

3.什么是J2EE集群

一个天真的问题,不是吗?但我仍要用几句话和图来回答它。通常,J2EE集群技术包括"负载均衡"和"失效转移"。

图 1 负载均衡

如图1所示,负载均衡意味着有许多客户端向目标对象同时发出请求。负载均衡器在调用者和被调用者之间,分发请求到与原始对象相同的冗余对象中。伸缩性和高可用性就是这样得到的。

图 2 失效转移

如图2所示,失效转移与负载均衡不同。有时客户端会连续发请求到目标对象,如果请求中间目标对象失效了,失效转移系统将检测到这次失败,并将请求重定向到另一个可用的对象。通过这种方式可以获得容错能力。

如果你想知道更多的有关J2EE集群的知识,你就会问到一个基本的问题,“什么对象可以集群?”和“在我的J2EE代码中哪里会发生负载均衡和失效转移呢?”。这些都是用来理解J2EE集群的非常好的问题。实际上,并不是所有的对象都能被集群的,并且负载均衡和失效转移并不是在J2EE代码所有地方都能发生。看看下面的例子代码:

图 3 例子代码

在Class A的bussiness()方法中,instance1可以负载均衡吗?或是当其失效,可以失效转移到其他B的实例上吗?我想是不行的!对负载均衡和失效转移来说,必须要有个拦截器在调用者和被调用者之间分发或重定向请求到不同的对象上。Class A和Class B的实例是运行在一个JVM中紧密耦合的,在方法调用间加入分发逻辑非常困难。

什么类型对象可以被集群?——只有那些可以被部署到分布式拓朴结构中的组件。

在我的J2EE代码中,什么地方会有负载均衡和失效转移?——只在你调用分布式组件的方法时。

图 4 分布式对象

在如图4所示的分布式环境中,调用者和被调用者被分离在有明显边界的不同的运行容器中,这个边界可以是JVM,进程和机器。

当目标对象被客户端调用时,目标对象的功能是在容器中运行的(这就是为什么我们说它是分布式的原因)。客户端和目标对象通过标准的网络协议通信。这些特性就为一些机制提供了机会可以介入到方法调用之间实现负载均衡和失效转移。

如图4,浏览器通过HTTP协议调用JSP对象,JSP运行在WEB服务器中,浏览器只需要返回结果而不关心它是怎么运行的。在上述场景中,一些东西就可以在浏览器与WEB服务器之间实现负载均衡和失效转移的功能。在J2EE平台,分布式技术包括:JSP(Servlet),JDBC,EJB,JNDI,JMS,WEB Service等。负载均衡和失效转移就发生在这些分布式方法被调用时。在后续部分我们将详细讨论这些技术。

4.WEB层集群实现

WEB层集群是J2EE集群的重要且基本的功能。WEB集群技术包括WEB负载均衡和HTTP Session失效转移。

4.1.WEB负载均衡

J2EE提供商实现WEB负载均衡有许多方式。基本上,都一个负载均衡器被插入到浏览器和WEB服务器之间,如下图所示。

图 5 WEB负载均衡

负载均衡器可以是一台硬件,如F5负载均衡器,或仅仅是另一台有负载均衡Plug-Ins的WEB服务器,一个简单的带ipchains的Linux box可以很好的实现负载均衡。不管采用哪种技术,负载均衡器都有以下特性:

z实现负载均衡算法

当客户请求到来时,负载均衡器需要决定将如何分发到后台服务器。流行的算法是Round-Robin、

Random和Weight Based。负载均衡器尽力使每台服务器实例都获得相同的负载,但是上述算法没

有一个可以获得理想的负载相同,因为它们仅仅是依据发送到特定服务器的请求的个数。一些精

密的负载均衡器实现了特殊的算法。它在分发请求之前将检测服务器的工作负载。

z健康检测

当一台服务器失效了,负载均衡器应当检测出失效并不再将请求分发到这台服务器上。同样,它

也要检测服务器是否恢复正常,并恢复分发请求。

z会话胶粘

几乎所有的WEB应用程序都有一些会话状态,可能是简单的记住用户是否登陆,或是包含你的购

物车信息。因为HTTP本身是无状态的,会话状态应当存在服务器的某个地方并与你当前浏览会

话相关联,这样当你下次再请求相同WEB应用程序的页面时可以很容易的重新获取。当负载均衡

时,最佳的选择就是将特定的浏览器会话分发到上次相同的服务器实例中,否则,应用程序可能

不能正确工作。

因为会话状态存储在特定WEB服务器的内存中,“会话胶粘”对于负荷均衡非常重要。但是,如果其中某台服务器实例因为某种原因失效了(比如关机),那么这台服务器的会话状态将要丢失。负载均衡器应当检测到这个失效并不再将请求分发给它,但这些请求的会话状态都因为存放在失效的服务器中而丢失了所有信息,这就将导致错误。会话的失效转移因此而生。

4.2.HTTP Session失效转移

几乎所有流行的J2EE供应商都在他们的集群产品中实现了Http Session失效转移,用来保障当某台服务器失效后会话状态不会丢失,使客户端请求能被正确处理。如图6所示,当浏览器访问有状态的WEB应用程序(第1 ,2步),这个应用程序可能在内存创建了会话对象用于保存信息以供后面的请求使用,同时,发送给浏览器一个唯一的HTTP Session ID用于标识这个会话对象(第3步),浏览器将这个ID保存Cookie中,并当它下次再请求同一WEB应用

程序的页面时,会将Cookie发还给服务器。为了支持会话失效转移,WEB服务器将在一定的时候把会话对象备份到其他地方以防止服务器失效后丢失会话信息(第4步)。负载均衡器检测到这个失败(第5,6步),并将后续的请求分发到装有相同应用程序的服务器实例中(第7步),由于会话对象已经备份到其他地方了,这个新的服务器实例可以恢复会话(第8步)正确地处理请求。

图 6 HTTP Session失效转移

为了实现上述功能,HTTP Session失效转移将带来以下问题:

z全局HTTP Session ID

如上所述,HTTP Session ID用于在特定的服务器实例中标识唯一的内存会话对象,在J2EE平台,HTTP Session ID依赖于JVM实例,每个JVM实例拥有几个应用程序,每个应用程序都为不同的

用户管着许多会话,HTTP Session ID是在当前JVM实例用于访问相关会话的关键。在会话失效

转移的实现中,要求不同的JVM实例不能产生两个相同的HTTP Session ID,这是因为当失效转

移发生时,一个JVM的会话将要备份并恢复到另一个中,这样,必须建立全局HTTP Session ID

产生机制。

z如何备份会话状态

如何备份会话状态是区别J2EE服务器好坏的关键因素。不同的供应商有不同的实现,在后续部分

我再详细解释。

z备份的频率和粒度

会话的备份是消耗性能的,包括CPU,内存,网络带宽和写入磁盘和数据库的I/O,备份的频率和

备份对象的粒度将严重影响性能。

5.数据库备份方式

几乎所有的J2EE集群产品都允许选择将你的会话对象通过JDBC备份到关系数据库中。如图7所示,这种方式可以让服务器实例非常简单的在正确的时间序列化会话内容并写到数据库中。当发生会话转移时,另一台可用的服务器接过已失效的服务器工作,从数据库中恢复所有的会话状态。序列化对象是关键点,它使得内存会话数据可以持久化和传输。要了解更多有关Java对象序列化知识,请参考https://www.wendangku.net/doc/f410340560.html,/j2se/1.5.0/docs/guide/serialization/index.html。

图 7 备份会话数据到数据库

由于数据库交易是非常昂贵的,这种方法主要缺点是当在会话中保存大量的或大的对象时限制了伸缩性,大多数使用数据库会话持久化的服务器产品都提倡尽量减少用HTTP会话存储对象,但这限制了你的应用程序的架构和设计,特别是你要使用HTTP会话缓存用户数据时。

数据库的方式也有一些优点:

z简单,容易实现。分离的请求处理和会话备份处理使集群更好管理和健壮。

z会话可以失效转移到任何一台服务器,因为数据库是共享的。

z当整个集群失效时,会话数据依旧幸免。

6.内存复制方式

因为性能的原因,一些J2EE服务器(Tomcat,Jboss,WebLogic,WebSphere)提供了另一种实现:内存复制

图 8 对会话状态进行内存复制

基于内存的会话持久化将会话信息保存在一台或是多台备份服务器中,而不是保存数据库中(如图8)。这种方式因为性能高而非常流行。同数据库方式相比,直接在原服务器和备份服务器之间网络通信是非常轻量的。同时注意在使用方式中,数据库方式中的“恢复”阶段是不需要的,因为在备份后,所有会话数据都已经存在备份服务器的内存中了,已经可以处理请

求。

“Java Groups”是当前Tomcat和Jboss集群所使用的通信层。Java Groups是用于实现可靠组通信和管理的工具包。它提供了诸如“组成员协议”和“消息广播”等核心特性,这些都对集群的工作非常有用。有关Java Groups的信息,请参考:https://www.wendangku.net/doc/f410340560.html,/javagroupsnew/docs/index.html。

Tomcat方式:多服务器复制

内存复制也存在许多不同的方式,第一种方法就是将会话数据复制到集群中的所有结点,Tomcat5采用的就是这种方式。

图 9 多服务器复制

如图9所示,当一个服务器实例的会话改变后,将备份到其他所有的服务器上。当一台服务器失效后,负载均衡器可以选择其他任何一台可用的服务器实例。但这种方式限制了伸缩性,如果集群中有很多的服务器实例,那么网络通信的代价就不能被忽略,这将严重降低性能,并且网络也将成为系统的瓶颈。

WebLogic,Jboss和Websphere的方式:对等服务器复制

由于性能和伸缩性的原因,WebLogic,Jboss和Webshpere采用了其他方式实现内存复制。每台服务器任意选择一台服务器备份其内存中的会话信息。如图10所示。

在这种方式中,每台服务器都有一台自己的对等服务器,而不是其他所有的服务器,这种方式消除在集群中加入过多服务器实例的话影响伸缩性的问题。

图 10 对等服务器复制

尽管这种方式实现失效转移有很高的性能和伸缩性,但它仍有一些限制:

z它给负载均衡器带来了更多的复杂性。当一台服务失效后,负载均衡器必须知道那台服务是这台己失效服务器的对等备份服务器。这将缩小了负载均衡器的选择范围,同时有些硬件也不能满足这种要求。

z除了处理正常的请求外,服务器还将负责复制的任务。由于备份会话数据的任务也需要占用CPU的周期,所以每台服务器的请求处理能力也降低了。

z在没有发生失效转移的时候,备份服务器上大量用于备份的内存是个浪费。同时这也将增加了JVM GC的负担。

z集群中的服务器实例构成了复制对。这样,当会话所在主服务器失效后,负载均衡器将会话转移到备份服务器,使备份服务器处理两倍的请求,这将造成备份服务器的性能问题。

为了克服上面的4点问题,不同的软件供应商采用了不同的方法,WebLogic采用的复制对不是对每台服务器,而是对每个会话。当一台服务器实例失效后,会话数据己经分散备份到多个备份服务器上,使失效的负载均匀地分布。

IBM的方式:中央状态服务器

Websphere采用不同的方式实现内存复制:备份会话信息到中央的状态服务器,如图11所示:

图 11 中央状态服务器复制

这与数据库的解决方案非常类似,不同之处在于专用的“会话备份服务器”代替了数据库服务器,这种方式结合了数据库和内存复制两种方式的优点。

z将请求处理和会话备份处理分开使用集群更加健壮。

z所有的会话数据都备份到专用的服务器上,无需服务器浪费内存用于备份其他服务器的会话。

z因为会话备份服务器是在服务器之间共享的,所有失效后可以转移到任何一台服务器上,这样大多数据软硬件负载均衡器都可以使用,更重要的是当一台服务器失效后,负载将均匀的分布到所有实例上。

z与重量级的数据库连接相比,应用服务器与备份服务器之间Socket通信是轻量的。

这样就比数据库的解决方案有更好的性能和更好的伸缩性。

然而,由于有恢复失效服务器会话数据的这么一个阶段,因此其性能肯定不如两台服务器直接复制解决方案,另外,多出来一台备份服务器也增加了管理的复杂性。也可能由于单台备份服务器造成性能瓶颈。

Sun的方式:特殊数据库

图 12 特殊数据库复制

Sun JES应用服务器采用了别的方式实现会话失效转移,如图12所示,它看上去很像数据

库的方式,因为它采用关系数据库存储会话并通过JDBC访问所有会话数据。但是JES内部所使用的关系数据库称为HADB,已经为访问会话做了特别优化,并且将几乎所有的会话数据存在内存中。这样,你可以说它更像中央状态服务器的方式。

7.性能因素

考虑如下问题:一台WEB服务器中可能运行着许多WEB应用,它们中每一个都可能被成百的并发用户访问,而每个用户都会产生浏览器会话用于访问特定的应用。所有会话信息都将备份以便服务器失效后能转移到其他服务器实例中。更糟的是,会话会由于一次次的发生以下情况而变化,包括创建、失效、增加属性、删除属性、修改属性值。甚至是什么都没变,但由于有新的访问而使最后访问时间变了(由此判断什么时候失效会话)。因此,性能在会话失效转移的解决方案中是个很大的因素。供应商通常会提供一些可调的参数改变服务器行为,使之适应性能需求。

备份时机

当客户端的请求被处理后,会话随时改变。由于性能因素,实时备份会话是不明智的。选择备份频率需要平衡。如果备份动作发生得太频繁,性能将急剧下降。如果两次备份的间隔太长,那么在这间隔之间服务器失效后,很多会话信息将会丢失。不管所有的方式,包括数据库和内存复制,下面是决定备份频率的常用的选项。

z按WEB请求

在WEB请求处理结束后,发生响应之前保存数据。这种方式能够保证在失效后备份的会话数据是最新的。

z按固定的时间间隔

会话在后台按固定的时间间隔保存。这种方式不能保证备份的会话数据是最新的。但由于不需在每次请求之后备份数据,因而有更好的性能。

备份粒度

当备份会话的时候,你还需要决定多少会话状态需要保存。以下是不同产品所有采用的常用的策略。

z整个会话

每次都将保存所有会话。这种方式为正确保存分布式WEB应用的会话提供了最好保证。这种方式简单,内存复制和数据库存储方式都默认采用这种方式。

z修改过的会话

当会话被修改过后,则备份整个会话。当“session.setAttribute()”或 “session.removeAttribute()”被调用后,则认为会话被修改过。必须保证这些方法调用才修改会话属性,这并不是J2EE规范后要求的。但却是正确实现这种方法所需要的。备份修改过的会话减少了会话存储的数量,那些仅仅是读取会话属性的请求将不会触发会话备份的动作。这将带来比备份整个会话更好的性能。

z修改过的属性

仅仅是保存被修改过的会话属性而不是整个会话。这将最小化备份的会话数据。这种方式带来最好的性能及最小的网络通信。为了保证这种方式工作的正确性,必须依据以下的要点。首先,只能通过调用“setAttribute()”方法修改会话状态,并且会话数据要被序列化和备份。其次,确保属性之间没有交叉引用。每个唯一的属性键值下的对象图应当被独立地序列化和保存。如果两个独立的键值下的对象存在交叉引用,它们将不能够正确的序列化和反序列化。例如图13所示,在一

个内存复制的集群中,会话中存有“student”和“school”对象,同时“school”对象含有到“student”

对象的引用,某一个时候“school”被修改后备份到备份服务器中。在序列化和反序列化之后,在

备份服务器的被还原的“school”对象的版本将包含整个对象图,包括其引用的“student”对象。

但是“student”对象可以被独立的修改,当它被修改后,仅仅只有它自己被备份。在序列化和反

序列化之后,在备份服务器中还原“student”对象,但在此时,它将丢失与“school”对象的连接。

尽管这种方式有最好的性能,但上述限制将影响WEB应用程序的架构和设计。特别是需要用会话

保存缓存的复杂的用户数据。

图 13 会话复制中的交叉引用

8.其他失效转移的实现

如前面章节所提到的,当会话备份时粒度对于性能非常重要。然而,当前的一些实现,不管是数据库存储还是内存复制,都将使用Java对象序列化技术来传输Java对象。这就打了个大印子,影响系统的性能,并给WEB应用程序的架构和设计带来很多的限制。一些J2EE供应商便寻找一些特别的手段来更为轻量地,小印子地实现WEB集群,提供细粒度的分布式对象共享机制用于提高集群的性能。

Jrun的Jini技术

Jrun4将它的集群解决方案构在Jini技术之上。Jini为分布式计算而生,它允许在一个单一的分布式计算空间内创建“联合”的设备或组件。Jini提供查找,注册,租用等分布式系统服务,这对集群环境非常有用。另一种称为JavaSpace的技术构建于Jini之上,它提供了一些用于实现集群非常有价值的特性,如对象处理,共享,迁移等。要了解有关Jini和JavaSpace更多的信息,请参考https://www.wendangku.net/doc/f410340560.html,/products/jini/2_0index.html。

Tangosol的分布式缓存

Tangosol Coherence提供了一个分布式数据管理平台,它可以嵌入到大多数流行的J2EE服务器中用于实现集群环境。Tangosol Coherence同时也是提供了分布式缓存系统用于在不同的JVM之间有效地共享Java对象。要了解有关Tangosol更多的信息,请参考https://www.wendangku.net/doc/f410340560.html,。

9.JNDI集群实现

J2EE规范要求所有的J2EE容器必须提供JNDI规范的实现。JNDI在J2EE应用程序中的主要角色是用来提供一个间接层,这样资源可以很容易被找到,而不用关心细节。这使得J2EE 组件更加可复用。

拥用全特性的集群的JNDI对于J2EE集群是非常重要的。所有的EJB调用都开始于在JNDI 树上查找它的Home接口,J2EE供应商根据他们的集群结构采用不同的方式实现JNDI集群。

9.1.共享全局JNDI树

WebLogic和Jboss都有一个全局的,共享的,集群范围的JNDI Context供客户端查找和绑定对象,绑定的全局JNDI Context中对象将通过IP广播的方式在集群中复制,这样当一台服务器实例停机后,被绑定的对象仍然可供查找。

图 14 共享的全局JNDI

如图14所示,共享的全局JNDI树实际包括了所有本地JNDI结点上绑定的对象。集群上每个结点都拥有自己的名称服务器,它们与集群中其他服务器相互复制所有的东西。这样每个名称服务器上都拥有其他名称服务器对象树的拷贝。这种冗余结构使得全局JNDI树高可用。

实际上,集群的JNDI树可以被用做两个目的。可以被管理员用来部署对象和服务。在一台服务中部署完EJB模块或JDBC&JMS服务后,JNDI树上的所有对象都将复制到其他服务器实例中。在运行期,程序可以JNDI API访问JNDI树存储或者获取对象,这些对象也将被全局复制。

9.2.独立JNDI

Jboss和WebLogic都采用了共享全局JNDI树的方式,Sun JES和IBM WebSphere等采用了每个服务器都拥有独立的JNDI树的方式。在使用独立JNDI树的集群中,成员服务器不必知道或关心集群中其他服务器。这是否意味着不想把JNDI集群呢?所有EJB访问都开始于在

JNDI树上查找它们的Home接口,如果没有可集群的JNDI树,集群就根本无用。

实际上,如果J2EE应用程序是相似的,独立的JNDI树仍然可以获得高可用性。当集群中所有实例都有相同的设置以及都部署相同的应用程序集,我们说集群是“相似的”,这种情况下,一种被称为代理的特殊管理工具可以帮助我们获取高可用性,如图15所示:

图 15 独立JNDI

不管是Sun JES还是WebSphere都在集群的实例上安装了结点代理,当部署EJB模块或绑定其他JNDI服务,管理控制员可以向所有的代理发出命令,以此实现与共享全局JNDI相同的效果。

但是独立JNDI的方案不能支持复制在运行期绑定或获取的对象。有以下几个原因:JNDI 在J2EE应用程序中的主要角色是用来提供管理外部资源的间接层,并不是用来做数据存储。如果有这样的需求,可以采用具有HA(高可用性)特性的独立的LDAP服务器或数据库。Sun 和IBM自己都有这样拥有集群特性的独立的LDAP服务器产品。

9.3.中心JNDI

少数J2EE产品使用了中心JNDI方案,这种方案中名称服务器驻留在单一服务器中,所有的服务器实例都注册它们相同的EJB组件和管理对象到单一的服务器中。

名称服务器实现了高可用性,这对客户端是透明的。所有的客户端都在这台服务器中查找EJB组件,但是这种结构意味着复杂的安装和管理,慢慢被多数供应商抛弃。

9.4.初始化访问JNDI服务器

当然客户端要访问JNDI服务器的时候,它们需要知道远程JNDI服务器的主机名/IP地址和端口,在全局或是独立JNDI树的方案中,有多个JNDI服务器。客户端第一次访问时应该连

接哪个呢?如何获得负载均衡和失效转移呢?

从技术上说,一个软件或硬件负载均衡器可以设在远程客户端和所有的JNDI服务器之间执行负载均和失效转移。但是,很少有供应商实现这种方式,这里有些简单的方案:z Sun JES和Jboss 实现JNDI集群是在“java.naming.provider.url”属性中设置一列用逗号分隔的URL,如java.naming.provider.url=server1:1100,server2:1100:server3.1100:server4.1100客户端将挨个联系列表中的服务器,一旦其中一个响应了便中止。

z Jboss同时也实现了自动发现的特性,当设置属性串“java.naming.provider.url”为空时,客户端将试图通过网络广播来发现在一个JNDI服务器。

10.EJB集群实现

EJB是J2EE技术中重要的部分,并且EJB集群是实现J2EE集群最大的挑战。

EJB技术是为分布式计算而生。它们可以在独立的服务器中运行。Web服务器组件或富客户端可以从其他的机器通过标准协议(RMI/IIOP)来访问EJB。你可以象调用你本地Java对象的方法一样调用远程EJB的方法。实际上,RMI/IIOP完全掩盖了你正在调用的对象是本地的还是远程的,这被称作本地/远程透明性。

图 16 EJB调用机制

上图显示了远程EJB的调用机制。当客户端想使用EJB,它不能直接调用,相反,客户端只能调用一个被称为“stub”的本地对象,它扮演了到远程对象代理的角色,并且有远程对象相同的接口。这个对象负责接受本地方法调用,并且这些调用通过网络代理到远程EJB。这些对象在客户JVM中运行,并且知道如何通过RMI/IIOP跨过网络查找真正的对象。要了解有关EJB 更多的信息,请参考https://www.wendangku.net/doc/f410340560.html,/products/ejb。

为解释EJB集群的实现,我们先看看在J2EE代码中如何使用EJB的。为了调用EJB,我

们需要

z在JNDI服务器中查找EJBHome stub

z使用EJBHome stub查找或创建EJB对象,这样获得一个EJBObject stub

z在EJBObject stub上调用方法

负载均衡和失效转移可以在JNDI查找时发生,这我们已在上面阐述了。在EJB stub(包括EJBHome和EJBObject)的方法调用时,供应商采用以下三种方式实现EJB负载均衡和失效转移。

10.1.智能存根(Smart stub)

正如我们所知,客户端可以通过存根对象(stub)来访门远程的EJB,这个对象可以通过JNDI树获取,甚至客户端可能透明地从WEB服务器上下载存根类文件。

这样存根就可以在运行期动态地用程序生成,而其类文件也不必在客户端环境的classpath 或库中。(因为它是可以被下载的)

图 17 智能存根

如图17所示,BEA WebLogic和Jboss通过在存根代码中组合几种行为来实现EJB集群,而这些都是在客户端透明运行的(客户端不需要了解这些代码)。这种技术叫做智能存根。

智能存根确实很聪明,它包含一组它可以访问的目标实例,可以检测这些实例的任何失效,它也包含了复杂的负载均衡和失效转移的逻辑,用来分发请求到目标实例。而且,如果集群拓朴改变了的话(比如新增或删除了服务器实例),存根可以更新它的目标实例清单来反映新的拓朴,而不需要手工重新配置。

使用智能存根实现集群有以下优点:

z因为EJB存根运行在客户端,所以它可以节省许多服务器资源。

z负载均衡是在客户端代码中,并且与客户端的生命周期相关。这样就消除了负载均衡

器的单点失效。如果负载均衡器失效了,就意味着客户端也失效了,这种情况是能接受的。

z存根可动态的自动下载更新,这意味着零维护。

10.2.IIOP运行期库

Sun JES Application Server使用了另一种方法实现EJB集群。负载均衡和失效转移逻辑是在IIOP运行库中实现的。比如,JES修改了“ORBSocketFactory”的实现,使它能支持集群。如图18所示。

图 18 IIOP运行期

“ORBSocketFactory”的修改版有实现负载均衡和失效转移的所有逻辑和算法,这样就保持了存根干净和小。因为是在运行库中实现的,这样就比存根的方式更容易获得系统资源。但这种方式需要在客户端运行一个特殊的运行库,这样就给与其他J2EE产品进行互操作时带来了麻烦。

10.3.拦截器代理

IBM Webshpere采用了定位服务精灵(Location Service Daemon-LSD),它对EJB客户端扮演了拦截器代理的角色,如图19所示。

图 19 拦截器代理

在这种方式中,客户端通过JNDI查找获取存根,这个存根将信息路由到LSD,而不是运行了EJB的应用程序服务器。这样LSD接收到所有进来的请求,根据负载均衡和失效转移的策略来判断应该将它发送到哪个服务器实例。这种方式增加的安装和维护集群的额外的管理工作。

10.4.EJB的集群支持

要调用EJB的方法,要涉及到两种存根对象,一是EJBHome接口,另一个是EJBObject 接口。这意味着EJB潜在的需要在两层上实现在负载均衡和失效转移。

z当客户端使用EJBHome存根创建或查找EJB对象时

z当客户端调用EJB对象上的方法时。

EJBHome存根支持集群

EJBHome接口用于在EJB容器中创建和查找EJB实例,而EJBHome存根是EJBHome接口的客户端代理。EJBHome接口不需维持任何客户端的状态信息。这样,来自不同EJB容器中的相同EJBHome接口对于客户端来说是一致的。当客户端执行create()或find()调用的时候,home存根根据负载均衡和失效转移算法从多个相同的服务器实例中选择一个,并将调用发送到该服务器的home接口上。

EJBObject存根支持集群

当EJBHome接口创建一个EJB实例,它将返回EJBObject的存根给客户端,并让用户调用EJB的业务方法。集群中已有一组可用的服务器实例,并在上面的部署了bean,但是不能将EJBObject存根对象向EJBObject接口发出调用转发到任意一个服务器实例上,这取决于EJB 的类型。

无状态会话Bean是最简单的情况,因为不涉及到状态,所有的实例都可以认为是一样的,这样对EJBObject的方法调用可负载均衡和失效转移到任意一个服务器实例上。

集群的有状态会话Bean与无状态会话Bean有一点不同,正如我们所知,有状态会话Bean 对于客户端连续的请求会持有状态信息。从技术上来说,集群有状态会话Bean与集群HTTP Session是一样的。在常规时间,EJBObject存根将不会把请求负载均衡到不同的服务器实例。相反,它将胶粘到最初创建的服务器实例上,我们称这个实例为“主实例”。在执行过程中,

会话状态会从主实例备份到其他服务上去。如果主实例失效了,备份服务器将接管它。

实体Bean本质上是无状态的,尽管它可以处理有状态的请求。所有的信息都将通过实体Bean本身的机制备份到数据库中。这样看起来实体Bean可以象无状态会话Bean一样很容易获取负载均衡和失效转移。但实际,实体Bean多数情况下是不负载均衡和失效转移的。根据设计模式的建议,实体Bean被会话外观包装。这样,多数对实体Bean的访问都是进程内会话Bean 通过本地接口完成的,而不是远程客户端。这使得负载均衡和失效转移没有意义。

11.JMS和数据库连接的集群支持

除JSP,Servlet,JNDI和EJB之外,在J2EE中还有其他的分布式对象。这些对象在集群的实现中可能支持,可能不支持。

当前,一些数据库产品,如Oracle RAC,支持集群环境并可以部署到多复制,同步的数据库实例中。然而,JDBC是一个高度状态化的协议并且它的事务状态直接与客户端和服务器的Socket连接绑定,所以很难获取集群能力。如果一个JDBC连接失效了,与该失效连接相关的所有JDBC对象也就失效了。客户端代码需要进行重连的动作。BEA WebLogic使用JDBC多池(multipool)技术来简化这种重连过程。

JMS被多数J2EE服务器所支持,但支持得并不完全,负载均衡和失效转移仅仅被JMS代理所实现,很少有产品在JMS Destination中的消息有失效转移的功能。

12.J2EE集群的神话

12.1.失效转移可以完全避免错误——否定

在Jboss的文档中,整个章节都在警告你“你真的需要HTTP会话的复制吗?”。是的,有时没有失效转移的高可用性的解决方案也是可接受并且是廉价的。失效转移并不是你想象的那么强壮。

那么失效转移到底给你带来了什么?你可能想失效转移可以避免错误。你看,没有会话的失效转移,当一个服务器实例失效后,会话数据将丢失而导致错误。通过失效转移,会话可以从备份中恢复,而请求可以被其他服务器实例所处理,用户根本意识不到失效。这是事实,但这是有条件的!

回想一样我们定义的“失效转移”,我们定义了一个条件是失效转移是在“两个方法调用之间”发生的。这是说如果你有两个连续的对远程对象的方法调用,失效转移只会在第一调用成功后并且第二调用的请求发出前才能发生。

这样,当远程服务器在处理请求的过程中失效了会发生什么呢?答案是:多数情况处理将会停止而客户端将会看到错误信息。除非这个方法是等幂的(Idempotent),只有这个方法是等幂的,一些负载均衡器更智能,它会重试这些方法并将它失效转移到其他实例上。

为什么“等幂”重要呢,因为客户端不知道当失效发生的时候请求被执行到什么地方。是才刚刚初始化还是差不多就要完成了?客户端没法判断!如果方法不是等幂的,在相同方法上的两次调用可能会两次修改系统的状态,而使得系统出现不一致的情形。

你可能想所有在事务中的方法都是等幂的,毕竟,如果错误发生,事务将被回滚,事务状态的改变都将被复位。但事实上事务的边界可能不包括所有的远程方法调用过程。如果事务已经在服务器上提交了而返回给客户端时网络崩溃怎么办呢?客户端不知道服务器的事务是否是成功了。

在一些应用程序中,将所有的方法都做成等幂的是不可能的。这样,你只能通过失效转移减少错误,而不是避免它们。拿在线商店为例,假设每台服务器可以同时处理100个在线用户的请求,当一台服务器失效了,没有失效转移的解决方案将丢失100个用户的会话数据并激怒这些用户。而有失效转移的解决方案中,当失效发生的时候有20个用户正在处理请求,这样20个用户将被失效激怒。而其他80个用户正处于思考时间或在两个方法调用之间,这些用户可以透明地获得失效转移。这样,你就需做以下的考虑:

z激怒20个用户和激怒100个用户造成影响的区别。

z采用失效转移和不采用失效转移产品成本的区别

12.2.独立应用可以透明的迁移到集群结构中——否定

尽管一些供应商宣称他们的J2EE产品有这样的灵活性。不要相信他们!事实你要在开始系统设计时就要准备集群,而这将影响开发和测试的所有阶段。

Http Session

在集群环境中,如我前面提到的,使用HTTP Session有很多限制,这取决于你的应用程序服务器采用了那种会话失效转移的机制。第一个重要的限制就是所有保存的HTTP Session中的对象必须是可序列化的,这将限制设计和应用程序结构。一些设计模式和MVC框架会用HTTP Session保存一些不序列化的对象(如ServletContext,EJB本地接口和WEB服务引用),这样的设计不能在集群中工作。第二,对象的序列的反序列化对性能的影响很大,特别是数据库保存的方式。在这样的环境中,应该避免在会话中保存大的或是众多的对象。如果你采用了内存复制的方式,如前所述你必须小心在会话中属性的交叉引用。其他在集群环境中的主要区别是在会话不管任何属性修改,你必须调用“setAttribute()”方法。这个方法调用在独立的系统中是可选的。这个方法的目的是区别已修改的属性和那些没用到属性,这样系统可以只为失效转移备份必要的数据,从而提高性能。

缓存

我经历过的大多数J2EE项目都用了缓存来提高性能,同时流行的应用程序服务器也都提供了不同程度的缓存用来加快应用程序的速度。但这些缓存都是为那些典型的独立环境设计的,只能在单JVM实例中工作。我们需要缓存是因为一些对象很“重”,创建它需花费大量的时间和资源。因此我们维护了对象池用于重用这些对象,而不需要在后面创建。我们只有当维护缓存比创建对象更廉价时才能获得性能的提高。在集群环境,每个JVM实例都要维护一份缓存的拷贝,这些拷贝必须同步以维持所有服务器实例状态的一致性。有时这种类型的同步会比没有缓存带来更糟的性能。

Static变量

当我们设计J2EE应用程序时,在架构上经常会使用一些设计模式。这些如“Singleton”的设计模式会用到静态变量来在多对象之间共享状态。这种方式在单服务中工作得很好,但在集群环境将失效。集群中的每个实例都会在它的JVM实例中维护一份静态变量的拷贝,这样就破坏了模式的机制。一个使用静态变量的例子就是用它来保持在线用户数。用静态变量来保存在线用户数是一个很简单的办法,当用户进入或离开时就增加和减少它。这种方式在单服务器

基于J2EE的图书管理系统的设计与实现

第31卷第8期湖南科技学院学报V ol.31 No.8 2010年8月Journal of Hunan University of Science and Engineering Aug.2010 基于J2EE的图书管理系统的设计与实现 章素晶张毅 (重庆大学 软件学院,重庆 400030) 摘 要:本系统是基于J2EE的设计方案,使用表示层,逻辑层和数据层三层模式。使用B/S模式,大大减低了服务端的数据处理任务。提供了高性能的处理速度,降低数据库的运行时的开销。使用MS SQL Server 2000作为数据库,Tomcat 作为JSP容器。数据库层使用JDBC与底层数据库进行交互,逻辑层封装在Java类中,表示层由JSP实现。 关键词:B/S模式;JSP;Enterprise JavaBean;三层模式;JDBC 中图分类号:TP311文献标识码:A 文章编号:1673-2219(2010)08-0064-04 0. 引 言 管理信息系统(Management Information System)简称MIS,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存储、加工、维护和使用的系统,是一门新兴的科学,其主要任务是最大限度地利用现代计算机及网络通信技术加强企业的信息管理,通过对企业拥有的人力、物力、财力、设备、技术等资源的调查了解、建立正确的数据,加工处理并编制成各种信息资料及时提供给管理人员,以便进行正确的决策,不断提高企业的管理水平和经济效益。目前,企业的计算机网络已成为企业进行技术改造及提高企业管理水平的重要手段。随着我国与世界信息高速公路的接轨,企业通过计算机网络获得信息必将为企业带来巨大的经济效益和社会效益,企业的办公及管理都将朝着高效、快速、无纸化的方向发展。MIS系统通常用于系统决策,例如,可以利用MIS系统找出目前迫切需要解决的问题,并将信息及时反馈给上层管理人员,使他们了解当前工作发展的进展或不足。换句话说,MIS系统的最终目的是使管理人员及时了解公司现状,把握将来的发展路径。 传统的MIS系统的核心是C/S(Client/Server——客户端/服务器)架构,而基于Internet的MIS系统的核心是B/S (Browser/Server——浏览器/服务器)架构。B/S架构比起C/S架构有着很大的优越性,传统的MIS系统依赖于专门的操作环境,这意味着操作者的活动空间受到极大限制;而B/S架构则不需要专门的操作环境,在任何地方,只要能上网,就能够操作MIS系统,这其中的优劣差别是不言而喻的。基于Internet上的MIS系统是对传统MIS系统概念上 收稿日期:2010-03-12 作者简介:章素晶(1976-),女,汉族,浙江永嘉人,研究方向科技业务管理、知识产权管理。的扩展,它不仅可以用于高层决策,而且可以用于进行普通的商务管理。通过用户的具名登录(或匿名登录),以及相应的权限控制,可以实现在远端对系统的浏览、查询、控制和审阅。随着Internet的扩展,现有的公司和学校不再局限于物理的有形的真实的地域,网络本身成为事实上发展的空间。基于Internet上的MIS系统,弥补了传统MIS系统的不足,充分体现了现代网络时代的特点。随着Internet技术的高速发展,因特网必将成为人类新社会的技术基石。基于Internet的MIS系统必将成为网络时代的新一代管理信息系统,前景极为乐观[1]。 1. J2EE概述 JSP技术是由Servlet技术发展起来的,自从有了JSP 后,在Java服务器端编程中普遍采用的就是JSP,而不是Servlet。因为JSP在编写表示页面时远远比Servlet简单,并且不需要手工编译,目前Servlet主要用于做视图控制器,处理后台应用等。由于JSP构建在Servlet上。所以它有Servlet所有强大的功能[2]。 在传统的网页HTML文件(*.htm,*.html)中加入Java 程序片段(Scriptlet)和JSP标记,就构成了JSP网页(*.jsp)。 JSP基于强大的Java语言,具有良好的伸缩性,与Java Enterprise API紧密地集成在一起,在网络数据库应用开发领域具有得天独厚的优势,基于Java平台构建网络程序已经被越来越多的人认为是未来最有发展前途的技术[3]。 从JSP这几年的发展来看,JSP已经获得了巨大的成功,它通过和EJB等J2EE组件进行集成,可以编写出处理具有大的伸缩性,高负载的企业级应用。JSP技术在多个方面加速了动态Web页面的开发。 通过分析和总结,列出了以下几点说明JSP的特点。

【精品实验报告】软件体系结构设计模式实验报告

【精品实验报告】软件体系结构设计模式实验报告软件体系结构 设计模式实验报告 学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期: 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。 二、实验内容 使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。 (1) 组合模式 使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。绘制类图并编程模拟实现。 (2) 组合模式 某教育机构组织结构如下图所示: 北京总部 教务办公室湖南分校行政办公室 教务办公室长沙教学点湘潭教学点行政办公室

教务办公室行政办公室教务办公室行政办公室 在该教育机构的OA系统中可以给各级办公室下发公文,现采用 组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。) (3) 外观模式 某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。参考类图如下: reader = new FileReader();EncryptFacadecipher = new CipherMachine();writer = new FileWriter();-reader: FileReader-cipher: CipherMachine-writer: FileWriter +EncryptFacade () +fileEncrypt (String fileNameSrc,: voidString plainStr=reader.read(fileNameSrc); String fileNameDes)String

java实验报告完整版

实验报告 (计算机与信息工程学院实验中心) 学期: 2014-2015 课程名称:《Java程序设计实验》 班级:信息1202 姓名:方逸梅 学号: 31 指导老师:费玉莲

《Java程序设计》 独立实验教学安排 一、实验的教学方式、安排及实验环境 (一)教学方式 对照本课程的实验教材,实验一至实验十一,由教师提示实验原理、方法、步骤等内容,在教师的指导下,学生独立完成程序设计及调试工作。实验十二的内容由学生自行设计完成。 (二)教学安排 学时数:30课时 学时安排:每次实验3学时,从学期第五周开始,共十次上机实验。 (三)实验环境 实验环境为JDK 。 (四)具体安排 地点:信息大楼实验室。 辅导:每个班次一名辅导老师,原则上由任课老师担任。 登记:实验完成,由辅导老师登记实验纪录。 学生:实验做完,完成实验报告内容,并在学期末上交实验册。 老师:批改实验,成绩与平时成绩一起占期末的30%。 二、实验的具体内容和要求 见实验报告。

浙江工商大学 计算机与信息工程学院实验报告(1)日期:地点:成绩: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 实验目的、实验原理和内容: 一、实验目的:熟悉Java开发环境及简单程序Java设计。 二、实验原理:SDK 的下载与安装,设置环境变量,安装java 虚拟机,使用Eclipse,编译Java 源程序,运行Java 程序。 三、实验内容及要求: 1.下载、安装并设置Java SDK 软件包。 2.熟悉Eclipse 编辑软件。 3.掌握运行Java 程序的步骤。 4.分别编写Application和Applet程序,显示字符串”Hello Java!欢迎使用!”。 要求:请同学把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。 程序一 public class hello { public static void main(String[] args) { for(int i=0;i<=4;i++) { "Hello java! 欢迎使用!"); } }

基于J2EE的开发技术 (本科)2

1. 实体 Bean 是由什么组成的
作业提交 2
(A) EntityManager 对象。
(B) persistence.xml 的简单的 XML 部署描述文件。
(C) 实体
(D) 纯粹的 Java 对象(POJO)。
(E) 以上都是。
[参考答案:BC] 分值:5
0
得分:

系统自动批改于 2018 年 7 月 2 日 17 点 52 分
2. 下列说法正确的是 (A) JSP 充当 MVC 模式的视图
(B) Servlet 充当 MVC 模式的模型
(C) Servlet 充当 MVC 模式的控制器
(D) JavaBean 充当 MVC 模式的控制器
(E) EJB 充当 MVC 模式的模型 [参考答案:ACE] 分值:5

0
得分:

系统自动批改于 2018 年 7 月 2 日 17 点 52 分
3. 当我们要在 JSP 页面中使用自定义标记时需要 (A) 在 tld 文件中定义标记
(B) 在 JSP 页面中使用 page 指令
(C) 创建一个标记处理器
(D) 引入这个标记的标记库,并指定前缀名
(E) 在 JSP 页面中使用 taglib 指令
[参考答案:ACDE] 分值:5
0
得分:

系统自动批改于 2018 年 7 月 2 日 17 点 52 分
4. 下面关于 Tag 接口说法中正确的是 (A) setPageContext()方法为初始化方法 doEndTag 方法,EVAL_PAGE 或者 SKIP_PAGE,当返回值为 EVAL_PAGE, (B) jsp 容器将继续执行 jsp 页面的内容,否则不执行 doStartTag()方法返回 EVAL_BODY_INCLUDE 和 SKIP_BODY,返回 (C) EVAL_BODY_INCLUDE 计算正文内容,返回 SKIP_BODY 不计算 body。 (D) setParent()方法用来设置标记的上一级标记
(E) release()方法用来释放标签程序占用的任何资源

通用权限管理系统java权限处理及其实现思路

关键字: 用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。因此B/S业务系统都需要有一个或多个权限系统来实现访问权限检测,让经过授权的用户可以正常合法的使用已授权功能,而对那些未经授权的“非法用户”将会将他们彻底的“拒之门外”。下面就让我们一起了解一下如何设计可以满足大部分B/S系统中对用户功能权限控制的权限系统。 需求陈述 ?不同职责的人员,对于系统操作的权限应该是不同的。优秀的业务系统,这是最基本的功能。 ?可以对“组”进行权限分配。对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的 事情。所以,系统中就提出了对“组”进行操作的概念,将权限一致的 人员编入同一组,然后对该组进行权限分配。 ?权限管理系统应该是可扩展的。它应该可以加入到任何带有权限管理功能的系统中。就像是组件一样的可以被不断的重用,而不是每开发一套管 理系统,就要针对权限管理部分进行重新开发。 ?满足业务系统中的功能权限。传统业务系统中,存在着两种权限管理,其一是功能权限的管理,而另外一种则是资源权限的管理,在不同系统之 间,功能权限是可以重用的,而资源权限则不能。 关于设计 借助NoahWeb的动作编程理念,在设计阶段,系统设计人员无须考虑程序结构的设计,而是从程序流程以及数据库结构开始入手。为了实现需求,数据库的设计可谓及其重要,无论是“组”操作的概念,还是整套权限管理系统的重用性,都在于数据库的设计。 我们先来分析一下数据库结构:

设计模式实验报告

实验一单例模式的应用 1 实验目的 1) 掌握单例模式(Singleton)的特点 2) 分析具体问题,使用单例模式进行设计。 2 实验内容和要求 很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。 通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。 事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎么实现呢?用C#控制台应用程序实现该单例模式。绘制该模式的UML 图。 3 实验代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AppConfig { publicclass Singleton { privatestatic Singleton instance; private Singleton() {

} publicstatic Singleton GetInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } class Program { staticvoid Main(string[] args) { Singleton singletonOne = Singleton.GetInstance(); Singleton singletonTwo = Singleton.GetInstance(); if (singletonOne.Equals(singletonTwo)) { Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一个实例"); } else { Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同实例"); } Console.ReadKey(); } } } 4 实验结果

java设计模式结课论文

论文 2012 — 2013学年第 2 学期 论文题目备忘录模式 学生姓名 学号 专业班级 指导教师 2013 年7 月 1 日

备忘录模式 1.备忘录模式概述 对象的状态依赖于它的变量的取值情况,对象在程序运行期间的各个时刻可能具有不同的状态。在某些应用中,程序可能需要使用一种合理的方式来保存对象在某一时刻的状态,以便在需要时,对象能恢复原先保存的状态。在备忘录模式中,称需要保存状态的对象为“原发者”,称负责保存原发者可以访问备忘录中的细节,即可以访问备忘录中的数据,以便恢复原发者的状态,而负责人只能保存和得到备忘录,但访问备忘录中的数据收到一定的限制。备忘录模式使原发者可以将自己的状态暴露内部数据的同时,又保证了数据的封装性。另外,经过精心设计的备忘录通过保存原发者状态中最本质的数据,就能使原发者根据此备忘录中的数据恢复原始状态。 2.备忘录模式的定义 备忘录模式是关于怎样保存对象状态的成熟模式,其关键是提供一个备忘录对象,该备忘录负责存储一个对象的状态,程序可以在磁盘或内存中保存这个备忘录,这样以后就可将该对象恢复到原先保存的状态。 3. 备忘录模式的结构和使用 3.1备忘录模式包括三种角色:

原发者(Originator):需要在某个时刻保存其状态的对象。原发者负责创建备忘录,比如使用createMemento()方法创建一个备忘录,然后原发者该备忘录记录自己的状态。当原发者需要恢复某个时刻的状态是,它通过获得相应的备忘录中的数据来恢复那个时刻的状态,比如原发者调用restoreFromMemento(Memento mem)方法,并通过参数men制定的备忘录恢复状态。 备忘录(Memento):负责存储原发者状态的对象,创建备忘录的类和创建原发者的类在同一个包中,该类提供的访问数据的方法都是友好方法,是的只有和原发者在同一个包中的类的实例才可以访问备忘录中的数据。 负责人(Caretaker):负责管理保存备忘录的对象。负责人如果不和原发者在同一个包中,就不能对备忘录中的内容进行修改或读取。如果需要将备忘录保存到磁盘,负责人可以使用对象流将备忘录写入文件。 3.2备忘录模式的UML类图 备忘录模式的类图如图所示,备忘录模式中原发者角色,Recoder 类的实例是备忘录(Menmento)角色,SaveRecoder类的实例是负责人(Caretaker)角色。

毕业论文-基于J2EE的人事管理系统

毕业论文 题目: 英文题目: 学生姓名:申请学位门类:学士学位 学号: 专业: 学院: 指导教师:职称: 二0一五年06月12日

作者声明 本人以信誉郑重声明:所呈交的学位毕业设计(论文),是本人在指导教师指导下由本人独立撰写完成的,没有剽窃、抄袭、造假等违反道德、学术规范和其他侵权行为。文中引用他人的文献、数据、图件、资料均已明确标注出,不包含他人成果及为获得东华理工大学或其他教育机构的学位或证书而使用过的材料。对本设计(论文)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本毕业设计(论文)引起的法律结果完全由本人承担。 本毕业设计(论文)成果归东华理工大学所有。 特此声明。 毕业设计(论文)作者(签字): 签字日期:年月日 本人声明:该学位论文是本人指导学生完成的研究成果,已经审阅过论文的全部内容,并能够保证题目、关键词、摘要部分中英文内容的一致性和准确性。 学位论文指导教师签名: 签字日期:年月日

摘要 在现代管理学中,信息管理是其中一项非常重要的内容。其中,人力资源管理是一个非常重要的领域,通过人力资源管理能够对企业员工进行有效的管理。 本文根据实际企业需求,整理出了企业人力资源管理的基本功能需求,按照软件工程的相关理论,进行了详细的系统分析、设计和实现。系统采用MyEclipse 6.0.1开发工具,运用了J2EE和MVC框架技术,以及MySQL数据库和MySQL-Front 数据库可视化工具,最终开发了一个基于Web浏览器端的企业人力资源管理系统。 文章首先对选题背景和发展状况进行了阐述,结合实际情况,进行了需求分析,并给出了算法思想和总体功能设计,之后根据分析,设计出了各个子模块的基本结构及应当实现的功能。接下来在系统功能实现部分,给出了用户登陆、人员信息管理、招聘管理、奖惩信息管理,薪金管理和部门信息查看功能模块的详细设计,再附上了部分重要模块实现的关键代码;最后,为了保证系统的正确和高效,对系统进行了测试和分析。 关键词:J2EE; MyEclipse;人力资源管理系统; Struts+Hibernate框架

一种通用的应用系统权限管理的实现方法

收稿日期:2000-10-09 基金项目:国家863/CIMS 并行工程主题资助项目(863-511-930-009) 一种通用的应用系统权限管理的实现方法! 朱建江,王宁生 (南京航空航天大学CIMS 工程研究中心,江苏南京210016) 摘要:从数据库访问权限和应用层各个子系统访问权限两个方面,介绍了一种用于管理信息系统的通用权限管理 方法,并给出了相应的功能模型(DFD ) 和信息模型(ER 图)及部分程序设计代码。关键词:系统权限管理;管理信息系统 中图分类号:TP309.2文献标识码:A 文章编号:1001-3695(2001)07-0062-02 A General Method for the Right Management of Application System ZHU Jian-jiang ,WANG Ning-sheng (CIMS Research Center ,Nanjing Uniuersity of Aeronautics and Astro nautics ,Nanjing Jiangsu 210016,China ) Abstract :From the two aspect of the accessing right of database and sub-system ,a generaI right management method for management information sys-tem is presented ,and the correspondent function modeI (DFD ),information modeI (ER diagram )and a part of program code are aIso given .Key words :System right management ;Management information system !前言一套管理信息系统设计、开发的最后一个步骤就是应用系统的权限管理。所谓权限管理就是应用系统的不同用户,拥有与其角色相配的对特定几个应用子系统(或模块)的不同的操作权限,如对于某模块,系统超级用户拥有“插入、修改、删除、查询”等权限,而对于普通用户仅拥有“查询”权限。应用系统的权限管理从功能模型和信息模型的角度可分为两个层次,即功能层的访问权限管理和数据库访问层的权限管理。目前多数管理软件仅做到应用系统功能层上的权限控制,而没有做到数据库访问层的权限控制。功能层上的权限管理主要有两种,一种是仅控制到应用子系统,即不同的用户可以访问不同的应用子系统的“窗体”,而没有控制到“窗体”上的各个功能菜单。这种做法比较简单,仅在管理信息系统技术发展的初期或非常简单的应用系统中采用,目前多数已经弃之不用。另一种是控制到应用子系统“窗体”上的菜单层,即拥有不同角色的不同用户可以访问不同的应用子系统“窗体”,而且对于窗体上的不同功能菜单拥有不同的权限。这种处理方式是当前系统权限管理技术的主流。然而这种处理方式并没有控制到后台数据库基本表;即什么角色的用户可以对哪些基本表拥有哪几种操作权限。由于仅控制到功能层,并没有给软件用户的系统管理员来说提供一个分配数据库基本表的访问控制界面,系统管理员设置角色权限,给系统用户分配 角色等操作不得不通过手工写SOL 语句来实现, 因此对于系统管理员来说很不方便,尤其是当系统管理员需要分配多个角色、用户时。本文提出一种通用的管理到应用系统功能层和数据库访问层的权限管理方法,对于功能层管理到“窗体”的菜单层,对于数据库访问层管理到基本表和基本表的“增加、删除、修改、查询”等基本操作权限。 " 应用系统权限管理的功能模型设计 [1] 功能模型的表达采用数据流程图—Data FIow Diagram (DFD )。应用系统的权限管理从功能上可分为权限管理基本信息维护、角色管理和用户管理三个处理过程,其相关的数据流、数据存储以及输入、输出关系如图1 所示。 图1应用系统权限管理功能模型(DFD 图) #应用系统权限管理的信息模型设计 信息模型的表达采用“实体—关系图(ER 图)”。在工程 领域,信息模型的设计应满足“三范式”,即非键属性既不函数 依赖于主键,也不传递依赖于主键[2]。在权限管理的信息模 型设计之前首先进行实体的标识。对应用系统功能层和数据库访问层进行权限管理的信息模型应包含以下实体:用户、角色、数据库访问权限、基本表、应用子系统、功能模块访问权限、模块菜单。 系统权限管理信息模型分为两个部分(见图2):对数据库访问权限的管理和对应用系统功能层的访问权限管理。数据库访问权限的管理包括用户表、角色表、数据库访问权限表、数据库基本表。其中用户表用于存储应用系统的所有用户;角色表用于存储所有角色;数据库基本表用于存储应用系统中的所有数据库基本表;对于一个特定的角色可访问多个应用系统的数据库基本表;一个数据库基本表可被多个角色访问,即角色与数据库基本表之间是“多对多”的关系。在数据库设计中这种“多对多”关系是“非确定的”,必须 予以消除,因此引入“中间实体”、“数据库访问权限表”进行处理。给一个角色分配了权限后,就可将这个角色分配给多个用户,角色表和用户表之间是“一对多”的关系。

基于J2EE的博客系统的设计与实现毕业设计

基于J2EE的博客系统的设计与实现毕业设计 目录 前言 (1) 第1章技术背景 (3) 1.1方案分析 (3) 1.2开发工具 (3) 1.2.1JSP简介 (3) 1.2.2MySQL简介 (4) 1.2.3Tomcat简介 (4) 1.2.4MyEclipse简介 (4) 1.2.5MVC简介 (5) 1.2.6Struts 2简介 (6) 1.2.7Hibernate简介 (7) 第2章需求分析 (8) 2.1功能分析 (8) 2.1.1系统概述 (8) 2.1.2基本功能要求 (8) 2.1.3用户分析 (8) 2.1.4功能详细说明 (9)

2.2性能要求 (11) 2.3运行环境要求 (11) 2.3.1硬件环境 (12) 2.3.2软件环境 (12) 第3章总体设计 (13) 3.1功能模块划分 (13) 3.2数据库设计 (13) 3.2.1person用户表 (14) 3.2.2space空间信息表 (15) 3.2.3post日志表 (15) 3.2.4category分类表 (16) 3.2.5reply日志评论表 (16) 3.2.6comment留言表 (16) 3.2.7link超表 (17) 3.3系统架构 (17) 3.4系统运行机制 (18) 第4章系统详细设计与实现 (20) 4.1类的设计与实现 (20) 4.1.1Java Bean类的设计 (20) 4.1.2通用类的设计 (21) 4.2数据库与Hibernate配置 (22) 4.3Struts 2配置 (22) 4.4模块详细设计与实现 (23)

4.4.1登录与注册模块 (23) 4.4.2日志管理模块 (24) 4.4.3日志评论模块 (30) 4.4.4分类模块 (31) 4.4.5留言模块 (33) 4.5系统配置 (34) 第5章结论 (36) 参考文献 38 致谢 (39) 前言 随着互联网技术的高速发展和日益的普及,互联网用户迅速增加,用户对互联网的寄托也发生了翻天覆地的变化,用户不甘于只单单的被动的接受互联网提供的容,更希望能够加入到容制造的大家庭中,这时传统的Web应用已经显得力不从心,而Web 2.0的出现,极大的改变了这一局面。所谓Web 2.0其核心就是用户不只是容的被动浏览者,同时也是容的制造者。正是因为整个互联网产品设计理念的重大变化,具有代表性的Web 2.0时代的互联网产品也就相继出现,如:论坛,博客、威客,社区、RSS和SNS等。 博客也称为网络日志,是blog的谐音,由很多经常更新的帖子(也叫日志或者个人文章)顺序倒序排列,最新的帖子在最上面,这些帖子的容不一定要长篇大论,具体容格式也没有任何要求,它以个人纯粹的个人想法和心得,包括你对时事新闻、国家大事的个人看法,或者一日三餐、服饰打扮的精心料理等,也可以是在基于某一主题的情况下或者是在某一共同领域由一群人集体创作的容。类似于传统的“网络日志”,但又不同于传统的“网络日志“,传统的”网络日志“是带有显示的私人性质的,而博客则是私人性和公共性的有效结合,绝不仅仅是纯粹个人思想的表达和日常琐事的记录,它所提供的容可以用来进行交流和为他人提供帮助,是可以包容事个互联网的,具有极高的共享精神和价值。博客还有个最大的特点是可以图文并茂的描述一件事,在文字、图片和视频等的共同描述

软件设计模式与软件体系结构实验报告

《软件体系结构》大作业(1) 学院:软件学院 课程名称:软件体系结构 专业班级: 学生姓名:学号: 学生姓名:学号: 指导教师: 完成时间:年月日 评分表 1、叙述各小组成员完成本题目的分工协作情况。 小组中的每个成员都先理解题目要求及涉及的设计模式,并一起完成代码编写。另外,组长负责文档制作。 2、评分表 序号姓名评分是否组长 1 2 作业正文需要包括以下内容: 1、作业题目内容的详细描述。 2、完成本题目所采用的软件设计模式名称及画出相应的类图,或者是所采用的 软件体系结构名称及画出相应的体系结构图。

3、画出完成本题目所设计程序的设计类图;如还有其他图,也一并画出。 4、完成本题目所设计的程序代码。 5、程序运行的典型界面截图

1、作业题目内容的详细描述。 【作业2.1-1】例2.3为使用工厂方法模式设计的汽车保险管理应用程序实例。现在需要 扩展例2.3的设计图,添加一个名为LuxuryCarInsurance的类,并且需要编写此类和其他需要添加的类的代码,详细要求参见光盘的相应作业部分。 【作业2.1-1】在例2.4中,设计并且实现了豪华(Super)和中等(Medium)别墅(House)与公寓(Condo)的查询。要求在该设计的基础上,增加一个新的类SemiDetacher(半独立式楼宇),并且编写代码,实现相应的查询功能,详细要求参见光盘的相应作业部分。 2、完成本题目所采用的软件设计模式名称及画出相应的类图,或者是所采用的软件体系结构名称及画出相应的体系结构图。 【作业2.1-1】采用的是工厂方法模式 【作业2.1-2】采用的是抽象方法模式

基于J2EE框架的个人博客系统项目毕业设计论文

第一章绪论 1.1.选题背景 这几年,许多新名词涌入我们的视野:博客、圈子、播客、WAP等。这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部应用的革命[10]。这个阶段发展迅速,互联网应用趋于多样化,其中变化最大的是由web 1.0网站创造内容的时代变为由用户创造内容的web 2.0时代。 在web 2.0应用中,博客(Blog)是web 2.0核心应用中最典型、最流行的代表之一,也是web 2.0技术应用的最直观的表现,是web 2.0精神和理念的具体体现。 1.2.问题的提出 Blog记载了日常发生的事情和自己的兴趣爱好,把自己的思想和知识和他人分享、交流,同时又通过“六度空间”结识了更多志趣相投的朋友;而越来越多专业知识的 Blog 的出现,让我们看到了 Blog 更多所蕴涵的巨大的信息价值:不同的 Blog 选择不同的内容,收集和整理成为很多人关注的专业 Blog ——目前越来越多的人获取信息的来源是一些固定的 Blog 。随着博客人数的增加,Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一的思想和群体的智慧结合变的更加有效,个人出版变成人人都可以实现的梦想—— Blog 正在影响和改变着我们的生活。 1.3.系统的开发目标 管理员通过前台页面进入后台管理模块后,可对注册的博客用户进行维护,

包括对注册用户的添加、查找、修改和删除。 管理员进入登录后,可对帐户进行管理,包括添加管理员帐户、修改管理员帐户、删除管理员帐户和对帐户进行权限设置。 博客用户通过前台登录后,可对自己的博客空间进行管理,包括发布自己的网络日志、收藏个人图片、和相关人员进行交流和沟通以及删除访问者发表的评论等。 因此,在具体设计实现该博客网站时,主要考虑了主流博客网站的几个主要功能:(1)博客的注册、登录验证功能(2)网络用户通过关键字搜索博文功能(3)最热门博客页面推荐浏览(4)文章详细内容及相关评论显示(5)博客页面访问量统计(6)博客个人文章管理维护功能(7)博客个人文章分类管理维护功能(8)博客个人友情链接维护功能(9)博客个人基本信息管理维护功能(10)博客图片上传及个人相册管理(11)网络用户写留言,博主查看留言。 第二章系统设计 2.1.系统分析 在整个blog进行开发之前,要确定出整个项目的整体架构,包括系统的选型、运行环境的确定及系统结构设计。下面对这进行详细介绍。 在进行软件系统开发的最初环节,一般都需要进行系统的选型,即根据系统功能的实际需求,选择合适的开发工具及软件架构。 blog对系统的可靠性、稳定性有比较高的要求。本系统设计时,比较主流的B/S设计有基于JSP、ASP、PHP、CGI及J2EE等模式。相比较而言PHP的功能相对简单,不适合做大程序;而CGI效率相对较低,所以也不考虑。由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选

通用数据权限管理系统设计

通用数据权限管理系统设计 作者:逸云来源:网络 前言: 本文提供一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是RBAC(基于角色的访问控制方法)的进一步扩展和延伸,即在功能权限的基础上增加数据权限的管理,实现数据权限和功能权限的集中处理。 解释: 功能权限:能做什么的问题,如增加销售订单; 数据权限:能在哪里干什么的问题,如察看北京分公司海淀销售部张三的销售订单; 术语: 资源:系统中的资源,主要是各种业务对象,如销售单、付款单等; 操作类型:对资源可能的访问方法,如增加、删除、修改等; 功能:对资源的操作,是资源与操作类型的二元组,如增加销售单、修改销售单等; 数据类型:业务系统中常用的数据权限类型,如公司、部门、项目、个人等; 数据对象:具体的业务对象,如甲公司、乙部门等等,包括所有涉及到数据权限的对象值; 权限:角色可使用的功能,分角色的功能权限和角色的数据权限; 角色:特定权限的集合; 用户:参与系统活动的主体,如人,系统等。 通用数据权限管理系统设计(二) 方法说明: 在实际应用中,数据权限的控制点一般相对固定,如针对公司、部门、个人、客户、供应商等,也就是说数据权限一般针对指定数据类型下的一些数据对象。 本方法中,数据权限的依赖于功能权限,是对功能权限的进一步描述,说明角色在指定的功能点上的数据控制权限。 本方法中采用“没有明确规定即视为有效”的原则,如果没有定义功能的数据权限,则说明该角色具有该功能的全部的权限。如果定义了功能的某种类型的数据权限,则该用户只具有该类型下指定数据的数据权限。 这段话比较绕口,下面举个例子实际例子。 某公司有北京销售部、上海销售部和广州销售部三个销售部,现在需要定义几种角色: ?销售总监-- 能察看所有销售部的销售订单; ?北京销售经理-- 只能察看北京销售部的所有销售订单; ?上海销售经理-- 只能察看上海销售部的所有销售订单;

设计模式实验报告

计算机科学与技术学院 实验报告 课程名称:软件设计模式 专业:计算机科学与技术班级:班 学号: 姓名:

实验一单例模式的应用 1 实验目的 1) 掌握单例模式(Singleton)的特点 2) 分析具体问题,使用单例模式进行设计。 2 实验内容和要求 很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。 通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。 事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎么实现呢?用C#控制台应用程序实现该单例模式。绘制该模式的UML图。 [代码截图]: namespace实验一_单例模式_ { class Program { static void Main(string[] args) { AppConfig appc1 = AppConfig.GetAppConfig(); AppConfig appc2 = AppConfig.GetAppConfig(); appc1.SetParameterA("hello"); appc2.SetParameterA("hi"); if (appc1.Equals(appc2)){ Console.WriteLine("appc1 和 appc2 代表的是同一个实例"); } else{ Console.WriteLine("appc1 和 appc2 代表的是不同实例"); } Console.WriteLine(appc1.GetParameterA()); Console.WriteLine(appc2.GetParameterA()); Console.ReadKey();

java课程设计实验报告

一实验目的 加深学生对课堂讲授内容的理解,从计算机语言的基本概念、程序设计的基本方法、语法规则等方面加深理解,打好程序设计、开发软件的良好基础。在上机实验中,提高学生对Java语言各部分内容的综合使用能力,逐步掌握Java语言程序设计的规律与技巧。在对Java 程序的调试过程中,提高学生分析程序中出现的错误和排除这些错误的能力。通过上机实践,加深学生对计算机软件运行环境,以及对操作系统与计算机语言支持系统相互关系的了解。 二、实验要求 (1)问题描述准确、规范; (2)程序结构合理,调试数据准确、有代表性; (3)界面布局整齐,人机交互方便; (4)输出结果正确; (5)正确撰写实验报告。 三、设计内容 1、计算器 计算器要有GUI界面,用户可以输入所需计算的数值,可以进行加、减、乘、除四种最基本的运算和混合运算,可以求一个数值的平方及倒数,可以进行阶乘运算,要能运算小数,并且不会产生精度损失,在必要情况下,可以进行四舍五入的运算。允许正负数间的运算。要求使用Applet实现该计算器,当用浏览器运行程序时,点击网页中的按钮,则计算器弹出,浮在网页上,再次点击按钮时,计算器消失。 2、文本编辑器 可以设置文本的字体、大小、颜色等基本参数,可以读取计算机中TXT文件,可以生成一个新的TXT文件。其他功能参照windows的文本编辑器。

四.实验步骤 (1)上机实验之前,为课程设计的内容作好充分准备。对每次上机需要完成的任务进行认真的分析,画出程序流程图,手工写出符合任务要求的程序清单,准备出调试程序使用的数据,以便提高上机实验的效率。 (2)按照实验目的和实验内容进行上机操作。录入程序,编译调试,反复修改,直到使程序正常运行,得出正确的输出结果为止。 (3)根据实验结果,写出实验报告。 五. 源代码及运行结果 1.计算器源代码 import .*; import .*; import .*; public class jisuanqi extends WindowAdapter { , "=", "+","n!" ,"关闭" }; static double a, sum=1; static String s, str ;rame(); } public void frame() { etBackground; txt = new TextField(""); (false);ddActionListener(new buttonlistener());ddActionListener(new close()); (this); (new BorderLayout());.计算器运行界面(1)计算器主界面

基于J2EE的考试系统的设计与实现

龙源期刊网 https://www.wendangku.net/doc/f410340560.html, 基于J2EE的考试系统的设计与实现 作者:胡中夏 来源:《软件》2012年第01期 摘要:分析了J2EE体系架构及其在考试系统中的应用,综合应用B/s和c/s模式相结合的方式来进行设计,并结合实际,详细介绍相关功能模块的实现,论述了自动组卷实现的关键技术。 关键词:J2EE;在线考试系统;模块;自动组卷 中图分类号TP319 文献标识码:A DOI:10.3969,/j.issn.1003-6970.2012.01.026 引言 随着计算机的广泛普及以及计算机网络的飞速发展,各大院校通过应用Internet进行相关课程的在线考试也日趋普遍。相比传统的纸质考试方式,网上在线考试具有明显的优势,比如,可以在教考分离、教学质量的提高以及整合教学资源共享等方面具有极好的促进作用。同时,在线考试系统可以对考试信息进行动态管理,在题库容量足够大的情况下实现自动组卷。而且考试的时间和地点不受限制,考生只要在可以上网的电脑上就可以完成相应的考试。在线考试系统的一个最大的优势是其自动阅卷评分功能,这不仅减轻了教师的大量阅卷工作,而且对考生来讲也是最公平的。本文研究了在基于J2EE技术的基础上来进行网络在线考试系统的设计与实现,该系统的前台采用目前流程的B/S架构,后台管理采用C/S架构。 1J2旺架构及其在考试系统中的应用 J2EE是SUN公司提出的一套面向企业应用的体系结构,它通过提供中间层集成框架来满足高可用性、高可靠性、高可扩展性以及低成本等需求,提供统一的开发平台,降低了开发多层系统的复杂性,并且对现有应用程序提供了强有力的支持。这些支持具体表现有:对EJB的完全支持、对打包和部署应用的良好支持、对添加目录的支持以及对安全机制的支持等。 J2EE是一个多层次的、端到端的架构体系。该体系架构包括四个部分,即客户层、Web 层、业务层、数据层。它清晰地将一个企业应用程序划分为客户层、Web层、业务层和数据层。将这些层映射到J2EE体系结构实现中可分为4个不同的功能层次,如下图1所示:

相关文档
相关文档 最新文档