SMART系统-系统框架设计与开发——毕业论文_第1页
SMART系统-系统框架设计与开发——毕业论文_第2页
SMART系统-系统框架设计与开发——毕业论文_第3页
SMART系统-系统框架设计与开发——毕业论文_第4页
SMART系统-系统框架设计与开发——毕业论文_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成成 都都 信信 息息 工工 程程 学学 院院 学学 位位 论论 文文 SMARTSMART 系统系统- -系统框架设计与开发系统框架设计与开发 SMARTSMART 系统系统- -系统框架设计与开发系统框架设计与开发 摘摘 要要 SMART 系统是一个新型智能在线考试信息管理系统,该系统主要实现了学 生在线考试与评估以及教师对学生在线考试信息的管理和维护。本文按照 SMART 系统的非功能性需求,基于 Struts、Spring、Hibernate 三种开源技术, 构建了一个具有良好的可扩展性、可维护性、可靠性的系统框架。整个系统的 框架分为三层,分别为表现层、业务层和持久层。 本系统的表现层是基于 Struts 作扩展设计,结合本系统的需求完成了自定义标签的封装,基本 action 接口的编写。在业务层则是采用单例模式设计与 Spring 的 IoC 模式相结合,实 现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采 用基于现有持久层框架的实现模式,实现了对产生 Session 实例的封装,对常 用数据库操作的封装。这样设计减少了耦合性且避免了生成大量的临时对象。 该系统框架能达到良好的可拓展性和维护性。它不仅仅适用这个系统的开 发,可以应用于 J2EE 领域中基于 SSH 来架构的大部分 B/S 系统。 关键词关键词:设计模式;开源;领域建模;系统框架 SMART System The Design and Development of The Framework Abstract The SMART system is a new type of intelligent information management system for online examination. The system has mostly realized the function that the students can do the online exam and the teachers can manage and maintain the exam information of students on SMART System. In this paper, how to construct a system framework of good expansibility, maintainability, and reliability is discussing in detail according to the non-functionality need of the Smart system, which is based on Struts, Spring, and Hibernate. The system framework is divided into three layers, and they are view layer, business layer, and persistent layer. We can do expansion-designing of Struts in the process of the framework designing which bases on the view layer, also the encapsulation of the custom tag and the compiled language for the basic interface of action are finished according to the request of the system. In this system, the business layer is a combo of single-example mode and IoC mode, so the compiled language for the common deputize and the encapsulation of the business logic interface have been realized. The realized mode that is applied to the framework design of the persistent layer is based on the framework of the persistent layer in existence, also the encapsulation of creating example for Session and the encapsulation of database for common use are realized. As a result, it will reduce the coupling, and a lot of temporary objects created in this process will be avoided. Favorable expansibility and maintainability can be achieved in this system framework. This frame is not only applied to the systemic development but also can be applied to the most B/S system which bases on the frame of SSH in the field of J2EE. Key words: Design Pattern; OpenSource; Domain Modeling; The framework of System 目目 录录 论文总页数:25 页 1引言1 1.1课题背景1 1.2国内外研究现状1 1.3本课题研究的意义1 2系统需求分析2 2.1可扩展性要求2 2.2可维护性要求2 2.3可伸缩性要求2 2.4可靠性要求2 3系统开发环境及实现关键技术3 3.1硬件环境3 3.2软件环境3 3.3系统实现的关键技术3 4系统总体框架设计7 4.1总体结构说明7 4.2总体结构设计与建模.10 5系统总体框架具体实现.18 5.1各层具体实现.18 6测试与分析.21 6.1测试环境.21 6.2测试结果.21 6.3结果分析.22 结 论.22 参考文献.23 致 谢.24 声 明.25 第 1 页 共 24 页 1 1 引言引言 1.11.1 课题背景课题背景 随着计算机技术的发展及计算机的日益普及,基于 Web 的在线考试与无纸 化办公已成为大势所趋。特别是在大兴数字化校园建立的今天,基于 WEB 在线 考试系统也已经成为学校信息化建设中不可缺少的一部分,它的优势不但体现 在人力上也体现在物力上,基于 WEB 的在线考试系统的自动评阅、计分、成绩 存档功能将有效地避免资源的浪费,有利于环保,减少人员投入,大大的提高 了效率。 相比传统的考试方式,基于 WEB 的在线考试系统的主要好处是一方面可以 动态地管理各种考试信息,只要准备好足够大的题库,就可以按照要求自动生 成各种试卷;另一方面,考试时间灵活,可以在规定的时间段内的任意时间参 加考试;另外计算机化的考试的最大特点是阅卷快,系统可以在考试结束时当 场给出客观题考试成绩,计算机阅卷给了考生最大的公平感。 本文中研究了基于 Web 的在线考试系统系统框架设计与开发设计与实现, 包括系统需求分析和系统框架功能设计与实现。 1.21.2 国内外研究现状国内外研究现状 网络考试系统极大地提高了教学的灵活性,现在在许多领域已经有了广泛 的应用。在国外最有影响的案例就是 ETS(美国教育考试中心)举办的 GRE(美 国研究生入学考试)的计算机化考试,它使考试由原来的每年只能有两次参加 考试的机会变成了每个工作日都可以参加的考试,大大提高了工作的效率。 在我国,经过这么多年在 IT 业的发展及经验的积累,虽然数字化教育已经 蓬勃地发展起来,但是目前学校与社会上的各种考试大都采用传统的考试方式, 在此方式下,组织一次考试至少要经过五个步骤,即人工出题、考生考试、人 工阅卷、成绩评估和试卷分析。然而在这个过程中人工手动出题和试题的选择 是最为复杂的,显然,随着考试类型的不断增加及考试要求的不断提高,教师 的工作量将会越来越大,并且其工作将是一件十分烦琐和非常容易出错的事情, 可以说传统的考试方式已经不能适应现代考试的需要。因此在国内也出现了比 较适合自己本国特色的在线考试系统如:杰佛通用在线考试系统,新为在线考 试系统等。 1.31.3 本课题研究的意义本课题研究的意义 本系统主要用来缓解传统考试所需要的繁琐工作流程,组织试题、印刷试 卷、组织考试、监考防作弊、收卷判分、统计结果等,通过本系统,可以将以 上考试的全部流程,完全借助计算机系统来实现,从而减轻教师的工作负担及 第 2 页 共 24 页 提高工作效率,与此同时也提高了考试的质量,使考试更趋于公证、客观、科 学性进一步的激发了学生的学习兴趣。 2 2 系统需求分析系统需求分析 SMART 系统框架在实现上要求采用在 J2EE 领域中比较流行的 SSH 框架组合 方式,并结合系统自身的一些特点来实现适合于本系统框架设计,该系统的一 些非功能性的需求如下: 2.12.1 可扩展性要求可扩展性要求 一般来说,软件的可扩展性决定着其适应变更能力的大小。事后我们总是 可以很容易地评价某个程序是可扩展的还是不可扩展的,但是要想使这个系统 在今后真正派上用场,我们必须事先就对它有个判断。一个系统一般都是要在 不断升级的过程中去结合用户的需求来完善自身功能,因此该系统要求采用清 晰的接口把对象的实现与它的交互分离开来,特定的实现就可以独立于应用的 其他部分,各个实现也可以在将来很方便地修改、升级甚至彻底替换。这时的 应用不再是一个单独的东西,而是一个系统中半独立的组件。多个开发者可以 在相互不破坏彼此成果或者甚至在不了解全局场景的情况下协同开发。组件提 供了特定的功能,允许独立地测试,也可以重用于多个应用中。如果组件之间 工作分配及接口是很清晰的,这样的软件就很容易扩展。 2.22.2 可维护性要求可维护性要求 系统在开发完成以后,后期的维护也是一个项目中重要的一环,包括为了 满足用户的使用体验对代码所作的修改;对上线后长时间运行过程中所出现的 BUG 所作的修改等等这些需求,都是要求一个系统是具有可维护性的特性的。 2.32.3 可伸缩性要求可伸缩性要求 可伸缩性和性能是紧密相关的,但是它们并不完全相同。可伸缩性可以广 义地定义为应用在请求数目增长时维护性能的能力。在 SMART 系统中要求达到 一个地市州级地区教育系统内的全体学生提供在线考试服务,并发数应在 10000 人以上。在本系统架构的中是采用分层的技术,这将可以很好的满足可 扩展性与可维护性的要求,但是各层之间的通信又反过来制约了伸缩性。因此, 就要求我们在架构设计的时候使用有成效的实践经验来连接这些层次。 2.42.4 可靠性要求可靠性要求 可靠的软件在所有时刻都会按照预期的那样执行。与可伸缩性类似,一个 可靠的系统取决于对其底层组件的可预测性。从一个用户的角度来看,可靠性 是对整个系统的判断,包括硬件、软件和网络元素。如果一个单独的组件发生 故障了,并且用户无法访问应用或者应用工作不正确了,那么整个系统就是不 第 3 页 共 24 页 可靠的。在 SMART 系统中的需求中,可靠性是首当其冲的,特别体现在考试的 过程中。如果在考试的过程中系统出问题了,或者在考试后的阅卷中系统算错 分了,这都将是灾难性的错误,从而导致严重的后果。因此,保证 SMART 系统 的可靠性的至关重要的。 3 3 系统开发环境及实现关键技术系统开发环境及实现关键技术 3.13.1 硬件环境硬件环境 CPU: AMD Sempron(tm) 2500+ 内存:1 G 硬盘:80 G 3.23.2 软件环境软件环境 操作系统:Microsoft Windows Server 2003 显示设置:SAMSUNG SyncMaster 795MB 应用软件:SQL Server 2000 + Eclipse3.1.2 + JDK1.5 + Apache Tomcat5.5.15 3.33.3 系统实现的关键技术系统实现的关键技术 .1AJAXAJAX 技术技术 AJAX 全称为“Asynchronous JavaScript and XML” (异步 JavaScript 和 XML) ,该技术并不是一种新的技术,实际上是多种技术的综合,包括 JavaScript、XHML 和 CSS、DOM、XMLXSL 和 XMLHttpRequest。其中使用 XHML 和 CSS 作为标准化的呈现,使用 XMLHttpRequest 作为异步数据的读取,使用 JavaScript 绑定和处理所有数据。 在 AJAX 提出之前,业界对于上述技术都只是单独的使用,没有综合使用, 也是由于之前的技术需求所决定的。与传统的 Web 应用不同,AJAX 采用异步交 互过程。AJAX 在用户与服务器之间引入一个中间媒介,从而消除了网络交互过 程中的处理-等待-处理-等待缺点。用户的浏览器在执行任务时即装载了 AJAX 引擎。AJAX 引擎用 JavaScript 语言编写,通常藏在一个隐藏的框架中。它负 责编译用户界面及与服务器之间的交互。AJAX 引擎允许用与应用软件之间的交 互过程异步进行,独立于用户与网络服务器间的交流。现在,可以用 JavaScript 调用 AJAX 引擎来代替产生一个 HTTP 的用户动作,内存中的数据编 辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给 AJAX 来 执行。 第 4 页 共 24 页 图 1 Ajax 的 web 应用模型 .2单例模式单例模式 单例模式作为设计模式中的创建模式类型中的一种,从其名字可以看出该 模式确保了一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 这类称为单例类。单例模式具有以下的特点: 1.单例类只可有一个实例。 2.单例类必须自己创建自己这惟一的实例。 3.单例类必须给所有其他对象提供这一实例。 在 Java 中单例模式一般有三种实现其分别为:饿汉式单例类;懒汉式单例 类;登记式单例类。 1. 饿汉式单例类: 饿汉式单例类是在 Java 语言里实现得最为简便的单例类,下面所示的类 图描述了一个饿汉式单例类的典型实现。 图 2 饿汉式单例类类图 第 5 页 共 24 页 从类图中可以看出,在这个类被加载时,静态变量 m_instance 会被初始 化,此时类的私有构造子会被调用。这时候,单例类的惟一实例就被创建出来 了。Java 语言中单例类的一个最重要的特点是类的构造子是私有的,从而避免 外界利用构造子直接创建出任意多的实例。值得指出的是,由于构造子是私有 的,因此,此类不能被继承。 2. 懒汉式单例类: 与饿汉式单例类相同之处是,类的构造子是私有的。与饿汉式单例类不同 的是,懒汉式单例类在第一次被引用时将自己实例化。如果加载器是静态的, 那么在懒汉式单例类被加载时不会将自己实例化。如图 3 所示,类图中给出了 一个典型的懒汉式单例类实现。 图 3 懒汉式单例类类图 3. 登记式单例类: 登记式单例类是 GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的 缺点而设计的。在本例中把他们的例子翻译为 Java 语言,并将它自己实例化 的方式从懒汉式改为饿汉式。只是它的子类实例化的方式只能是懒汉式的,这 是无法改变的。如图 4 所示是登记式单例类的一个例子,图中的关系线表明, 此类已将自己实例化。 图 4 登记式单例类 第 6 页 共 24 页 .3IoCIoC 模式模式 IoC (Inversion of Control)模式又称 DI(依赖注入) ,从 GoF 设计模式 中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动, 接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性 等等,但是接口一定是需要实现的,也就是如下语句迟早要执行: AInterface a = new AInterfaceImp(); AInterfaceImp 是接口 AInterface 的一个子类,IoC 模式可以延缓接口的 实现,根据需要实现,打个比喻:接口如同空的模型套,在必要时,需要向模 型套注射石膏,这样才能成为一个模型实体,因此,将人为控制接口的实现成 为“注射” 。 其实 IoC 模式也是解决调用者和被调用者之间的一种关系,上述 AInterface 实现语句表明当前是在调用被调用者 AInterfaceImp,由于被调用 者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调 用者和被调用者有紧密联系,在 UML 中是用依赖 Dependency 表示。 但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者 和被调用者解耦,新的 IoC 模式 Dependency Injection 模式由此产生了, Dependency Injection 模式是依赖注射的意思,也就是将依赖先剥离,然后在 适当时候再注射进入。 .4JAVAJAVA 反射机制反射机制 “反射”是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序 对自身进行检查,或者说“自审” ,并能直接操作程序的内部属性。Java 的反 射机制是使其具有动态特性的非常关键的一种机制,这个机制允许程序在运行 时透过 Reflection APIs 取得任何一个已知名称的 class 的内部信息,包括其 modifiers(诸如 public, static 等等)、superclass(例如 Object)、实现之 interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于 运行时改变 fields 内容或唤起 methods。 .5JSPJSP 自定义标签自定义标签 要在 JSP 中实现自定义标签,那么要求必须实现一个相应的标签处理类及 写该标签的 TLD 文件,在 JSP 中一个自定义的 action 也就是对 tag 处理类,是 基于一个 bean 类型的类,该类里面伴随的 getter/setter 方法对应于 tag 中的 属性。另外这个 tag handler 类还必须要实现 JSP 规范中与 tag 相关的三个接 口中的一个。这三个接口如下所示: 1. Tag 2. IterationTag 第 7 页 共 24 页 3. BodyTag IterationTag 继承了 Tag,BodyTag 继承了 IterationTag 在 API 中提供的 两个类使开发自定义的标签变得容易,它们分别为 TagSupport、BodyTagSupport。TagSupport 实现了 Tag 与 IterationTag 的接 口,而 BodyTagSupport 除了实现了那两个接口外还实现了 BodyTag 接口。图 5 展现了整个标签处理过程: 图 5 标签处理的生命周期 4 4 系统总体框架设计系统总体框架设计 4.14.1 总体结构说明总体结构说明 图 6 系统总体框架示意图 第 8 页 共 24 页 .1表现层表现层 如图 1 所示,在整个 SMART 系统的总体框架中表现层是结合 J2EE 领域的开 源框架 Struts 来实现的,Struts 能充分满足应用开发的需求,简单易用,该 框架是基于 MVC 模式的来构建的,该模式将表达层分解为自包含的和可重用的 几个部分,当用户通过浏览器发起 HTTP 请求时,该框架将利用其 ActionForm 将请求页面的非对象化的数据转化为对象,交由其对应 Action 来处理。基于 MVC 模式的整个交互的序列图如图 7 所示: 控控制制器器视视图图模模型型 客客户户端端 HTTP request locate update choose forward() useBean HTTP response 图 7 MVC 模式中的交互 开发人员利用该框架进行开发时,不用再自己实现全套 MVC 模式,节省了 大量的开发时间。 .2业务层业务层 如图 1 所示,在表现层与业务层之间利用一个公共代理类来完成交互,该 代理类采用单例模式设计开发,在整个框架中起到了如下几点作用: 1.减少耦合性 2.避免生成大量的临时对象 在该代理类,实现一个对相应业务逻辑的处理方法,该方法的参数为一个 封装好相应的页面数据对象、要调用的业务类的名称及该业务类中相应的处理 方法名的类。 在该层中利用了 Spring 框架中的 IoC 模式(英文全名为 Inversion of Control 即反转模式),该模式类似于著名的好莱坞原则:“Dont call us,well call you” ,后被 Martin Fowler 改名为 Dependency Injection 依 赖注射,也就是将类之间的关系通过第三方进行注射,不需要类自己去解决调 第 9 页 共 24 页 用关系,实现了调用者和被调用者之间的解耦分离。IoC 的引入并没有消除接 口与实现类之间的联系,它的实质在于只是将这种联系转移了。在 Spring 的 IoC 实现中这关系被转移到相应的 XML 配置文件中,由 Spring 框架来提供对这 种关系的依赖注入。其原理如图 8 所示: 图 8 IoC 模式在 Spring 中的依赖注入 .3持久层持久层 在 SMART 系统的整体框架中的持久层,是采用基于现有持久层框架的实现 模式,在这种模式中,将最为繁琐的基于 JDBC 的 OR 映射工作,交由第三方组 件(本框架中采用开源的 Hibernate)来完成,这样就会在对数据访问对象进 行编码时,大大的简化了一些繁琐而又复杂的编码工作,只需要利用 Hibernate 提供的 API,对持久化对象进行操作。在该持久层框架提供了优秀的 性能优化机制,如内置的数据库连接池支持,PreparedStatement 缓存、数据 缓存等。这些优化机制的综合使用大大提升了系统的性能。 在 SMART 系统的持久层中,对一些常用的添加、删除、更新数据库操作进 行了抽象封装。并在 Hibernate 中配置相应的数据库连接池实现。 图 9 基于现有持久层框架的实现模式 第 10 页 共 24 页 4.24.2 总体结构设计与建模总体结构设计与建模 .1公共代理机制的设计公共代理机制的设计 在大部分采用 B/S 结构的 web 应用中,用户与系统的交互都是要涉及到相 应的交互数据、业务逻辑,因此在本系统的框架设计中考虑到将这些交互中涉 及到的因素全部封装到一个 Carrier 类中,再通过一个单例类来实现表现层与 业务层的交互,这样用户操作时不用每次都去 new 一个临时的对象,也实现各 功能模块中子程序之间的解耦。 .2系统接口设计系统接口设计 Java 程序设计语言提供了两种机制,可以用来定义一个允许多个实现的类 型:接口和抽象类。两种机制之间最明显的区别是,抽象类允许包含某些方法 的实现,但是接口是不允许的。一个更为重要的不同之处在于,为了实现一个 由抽象类定义的类型,它必须成为抽象类的一个子类。任何一个类,只要它定 义了所有要求的方法,并且遵守通用约定,那么它就允许实现一个接口,不管 这个类位于类层次的哪个地方。因为 Java 只允许单继承,所以,抽象类作为类 型定义受到了极大的限制。接口使得我们可以构造出非层次结构的类型框架。 例如:假设有一个接口代表一个 singer(歌唱家),另一个接口代表一个 songwriter(作曲家): public interface Singer AudioClip Sing(Song s); public interface SongWriter Song compose(boolean hit); 在现实生活中,有些歌唱家本身也是作曲家。因为是使用接口而不抽象类 来定义这些类型,所以对于一个类而言,它同时实现 Singer 和 Songwriter 是 完全允许的。实际上还可以定义第三个接口,它同时扩展了 Singer 和 Songwriter,并且加入一些适合于这种组合的新方法: public interface SingerSongwriter extends Singer,Songwriter AudioClip strum(); Void actSensitive(); 如果要满足这样的一种灵活性,抽象类是不可能完成的。 虽然接口不允许包含方法的实现,但是,使用接口定义类型并不妨碍你为 程序员提供实现上的帮助,在本系统的接口设计与实现中借鉴了 Java API 中的 将接口类与抽象类的优点结合起来,将期望导出的每一个重要接口,都提供一 第 11 页 共 24 页 个抽象类的骨架实现(skeletal implementation)类。按照惯有编码命名习惯, 将该骨架实现类命名为 AbstractInterface 在该系统中采用这种方式的来设计的接口有 Business(业务)接口,DAO(数 据访问对象)接口。 .3自定义标签的设计自定义标签的设计 在对系统的实现中,由于在表现层使用的是基于 MVC 的 Struts 框架,该框 架中为了在表现层的 JSP 页面中不混合大量的 Java 代码,及保持 JSP 页面的程 序的容易读性而提供了相应的 Struts 自己的一套标签,但是考虑到本系统的实 际应用的功能实现。且这些功能实现又是 Struts 标签没法满足要求的,因此在 该系统框架中实现了自己的一套标签,主要有 ,。 1. 标签: 设计意图: 在一般的基于 B/S 结构的 web 应用系统中,在页面上经常是会涉及到 添加、编辑、删除几种常用的功能,在早期的一些开发编码中,相当一部 分人是将这几种功能分为多个页面来实现,例如:添加用一个 add.jsp 页 面,编辑用一个 edit.jsp 页面,删除用一个 delete.jsp 页面。而这些的 页面的代码 80%以上都基本上是一样的,只不过是上显示的按钮及在点击 相应的提交给后台处理方法不一样。为了达到在一个页面上面实现添加、 编辑、删除功能,并且要保持页面代码的清晰可读性,因此,在本系统框 架中,封装了自定义的提交标签。 表 1 标签属性列表 属性名称属性描述备注 Id该标签元素的 id 。 Name该标签元素的名称。 Property当点击该标签所显示的内容后所提交的参数名 称 Message该标签在页面上所显示的值,等同于 html 标 签组里面的 input 标签的 value 属性。 displayControl是否要对该标签的内容是否在页面上显示出来 作控制。 只有两种值 true/false Image该标签在页面显示的内容的背景图片。 onClick当点击该标签所展现的内容后所触发的事件。 第 12 页 共 24 页 2. 标签: 设计意图: 在一般的基于 B/S 结构的 web 应用系统中,在页面上经常要用到下拉 框,且在 JSP 页面加载出来时就有一组相应的值,为了在加载该页面时动 态的、带条件的取其标签相应的键/值对,因此,在本系统框架中,封装了 自定义的下拉菜单。 表 2 标签属性列表 属性名称属性描述备注 name 该标签元素的名称。 property 该标签元素属性名称,与 Struts 中的 html 标签 的 property 元素是一样的含义,对应于 FormBean 里面的一个域。 content 该标签属性为标签取值的业务代码。 multiple 该属性同 html 标签组中的 select 标签的 multiple 属性。 size 该属性同 html 标签组中的 select 标签的 size 属 性。 style 该属性同 html 标签组中的 select 标签的 style 属性。 relationValue 该属性为在加载该标签相应的值时的条件。 .4基于基于 Struts 表现层设计表现层设计 大部分基于 B/S 结构的 web 应用系统中,在页面上经常会出现一个以上的 功能按钮,而这些功能按钮基本上都是对应于后台的一个操作实现,由于在本 系统中的表现层选用较为成熟 Struts 框架,该框架中最为核心的部分要属控制 器控制转发相应的 HttpRequest,其中的 LookupDispatchAction 类是允许你指 定一个具有多个方法的类,每一个方法的调用都基于配置文件中指定的一个特 殊请求参数值,利用该参数值反向查询资源绑定,并将它与类中的一个方法进 行匹配。从这些功能可以看出 Struts 是满足对系统页面上多个功能按钮与实现 的绑定。 因此,在对本系统进行架构设计的时候,考虑建立一个抽象的 BaseAction 类,该类继承 LookupDispatchAction,实现 LookupDispatchAction 类中的 getKeyMethodMap 方法,在方法中返回本系统中请求参数值与资源文件中参数 值的键/值对。实现一些对于所有的 Action 都是有可能用到的公共方法,包括 第 13 页 共 24 页 从 session 中得到用户的信息;对页面上按钮是否显示的控制;检查用户权限; 对公共业务逻辑接口的调用等等。在涉及到系统的具体开发实现的时候,要求 所有开发人员在写自己的 Action 的时候统一继承 BaseAction。 .5基于基于 Hibernate 持久层设计持久层设计 本系统的持久层是基于开源的 Hibernate 来实现的,在了解到相关的 Hibernate 特性后,在本系统的框架中,从如下几个方面对其进行了进一步的 封装。 1. 对产生 Session 实例进行封装 设计意图: Session 是 Hibernate 持久化操作的基础。注意这里 Session 的含义, 它与传统意义上的 Web 层的 HttpSession 并没有什么关系。Hibernate Session 之与 Hibernate,相当于 JDBC Connection 与 JDBC。 Session 作为贯穿 Hibernate 的持久化管理器核心,提供了众多持久化 方法,如 save、update、delete,find 等。通过这些方法即可透明地完成 对象的增删改查(CRUD)。但是值得注意的是,Hibernate Session 的设计是 非线程安全的,也就是说,一个 Session 实例同时只可由一个线程使用, 同一个 Session 实例的多线程并发调用将导致难以预知的错误。 因此在本框架中对通过 SessionFactory 所产生的 Session。进行了线 程安全性的处理,在实现的 HibernateSessionFactory 类新建一个 Java 中 的 ThreadLocal 类,将每次产生 Session 放入该类中,这样就达到了线程 安全性的效果了。 当产生 Session 而创建 SessionFactory 实例时,也要注意对 SessionFactory 重用的问题,因为 SessionFactory 中保存了对应当前数据 库配置的所有映射关系,同时也负责维护当前的二级缓存和 Statement Pool。由此可见,SessionFactory 的创建过程必然非常复杂、代价高昂, 而这也意味,在系统设计中要充分考虑到 SessionFactory 的重用策略。由 于 SessionFactory 采取了线程安全的设计,可由多个线程并发调用,大多 数情况下,一个应用中针对一个数据库共享一个 SessionFactory 实例即可。 2. 对通常的数据库操作进行封装 设计意图: 在系统的设计架构中考虑到代码的重用性,因此对一些通用的数据 库的操作都将其封装到一个公共类中,这样就减少了系统开发人员的代码 第 14 页 共 24 页 编写工作量,也避免了同功能代码的重复编写。 .6类图类图 Serializable +setBusiness() +setAction() +setData() +getBusiness() +getAction() +getData() -business : String -action : String -data : Object Carrier -PublicProxy() +getInstance() : PublicProxy +process() : Object -instance : PublicProxy -lock : Object PublicProxy 1 -create 01 图 10 公共数据传输类 图 11 公共代理类 +BaseAjaxServlet() +doGet() : void +doPost() : void +getXmlContent() : String BaseAjaxServlet +getXmlContent() : String +parseCallBack() : void AjaxServlet +parseCallBack() : String DropDownListServlet +parseCallBack() : String HtmlContentServlet 图 12 表现层基于 Ajax tags 的 servlet 实现类 第 15 页 共 24 页 +LookupDispatchAction() +execute() : ActionForward -initLookupMap() : Map #getKeyMethodMap() : Map #getLookupMapName() : String #getMethodName() : String #localeMap : Map #keyMethodMap : Map LookupDispatchAction #getKeyMethodMap() : Map +execute() : ActionForward -getButtonMap() : Map #call() : Object #showButton() #hideButton() #getCurrentUser() : Authorization #checkPermission() : boolean(idl) -request : HttpServletRequest BaseAction Entity +setRecId() : void +getRecId() : Long +getCurrentUser() : Long +setCurrentUser() : void +getCreatedBy() : Long +setCreatedBy() : void +getCreatedDate() : Date +setCreatedDate() : void +getLastUpdateBy() : Long +setLastUpdateBy() : void +getLastUpdateDate() : Date +setLastUpdateDate() : void +getTaskCode() : String +setTaskCode() : void +getVersion() : Integer +setVersion() : void -recId : Long -currentUser : Long -createdBy : Long -createdDate : Date -lastUpdateBy : Long -lastUpdateDate : Date -version : Integer -taskCode : String PersistenceObject 图 13 表现层的基本 Action 类 图 14 持久化对象接口 +BodyTagSupport() +doStartTag() : int +doEndTag() : int +setBodyContent() : void +doInitBody() : void +doAfterBody() : int +release() : void +getBodyContent() : BodyContent +getPreviousOut() : JspWriter #bodyContent : BodyContent BodyTagSupport +setBodyContent() : void +doInitBody() : void BodyTag +getMultiple() : String +setMultiple() : void +doStartTag() : int +doEndTag() : int +getContent() : int +getProperty() : String +setProperty() : void +getOptions() : Map +getName() : String +setName() : void +getRelation() : String +setRelation() : void +getParentByParent() : String +setParentByParent() : void +getDisabled() : String +setDisabled() : void -content : int -property : String -name : String -relation : String -parentByParent : String -disabled : String -multiple : String DropDownListTag +doStartTag() : int +doEndTag() : int +getDisplayControl() : String +setDisplayControl() : void +getMessage() : String +setMessage() : void +getName() : String +setName() : void +getProperty() : String +setProperty() : void +getValidate() : String +setValidate() : void +getId() : String +setId() : void +getImage() : String +setImage() : void +getOnClick() : String +setOnClick() : void -id : String -image : String -name : String -property : String -onClick : String -message : String -validate : String -displayControl : String ImageButtonTag +findAncestorWithCalss() : Tag +TagSupport() +doStartTag() : int +doEndTag() : int +doAfterBody() : int +release() : void +setParent() : void +getParent() : Tag +setId() : void +getId() : String +setPageContext() : void +setValue() : void +getValue() : Object +removeValue() : void +getValues() : Enumeration -parent : Tag -values : HashTable #id : String #pageContext : PageContext TagSupport 图 15 表现层自定义标签相关实现类 第 16 页 共 24 页 +setMessage() : void +getMessage() : String +setErrorCode() : void +getErrorCode() : int +setAccount() : void +getAccount() : String +ApplicationException() +initCause() : Throwable +getCause() : Throwable +getLogMessage() : String +getWebMessage() : String +getNestedException() : Throwable +printStackTrace() : void -cause : Throwable -account : String -message : String -errorCode : int ApplicationException +CallBackException() +getLogMessage() : String +getWebMessage() : String CallBackException +NestedRuntimeException() +getCause() : Throwable +getMessage() : String +printStackTrace() : void +contains() : Boolean -cause : Throwable NestedRuntimeException +DataAccessException() +getLogMessage() : String +getWebMessage() : String DataAccessException +getLogMessage() : String +getWebMessage() : String -useCases : String PermissionException +ProxyException() +getLogMessage() : String +getWebMessage() : String ProxyException

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论