1、本科毕业论文(科研训练、毕业设计)题 目:Java 课程管理网站开发在线拟题和阅卷的设计与实现姓 名:学 院:软件学院系:软件工程专 业:软件工程年 级: 学 号:指导教师: 职称: 年 月1Java 课程管理网站开发在线拟题和阅卷的设计与实现摘要 网络教学逐渐走入人们的视线,进入我们的生活。广义的说,早期的网络学习通常指使用搜索引擎查找自己不知道的知识,而现在各种专业教学网站层出不穷,这使得远程教学从不可能变成了可能。网络教学已经不再是单纯地下载、观看教学视频,还需要教师和学生通过网络进行互动和交流,达到更好的学习效果。本论文对 Java 课程管理网站项目的架构和在线拟题、阅卷子模块进行详细
2、设计。项目是为厦门大学软件学院 Java 课程教学而设计,满足教学的所有需求,主要包括课件模块、公告模块、考试模块、答疑论坛模块和作业模块五个部分。项目实现后软件学院Java 课程教学将加入更多的互动环节,摆脱原来老师讲、学生听的填鸭式教育方式,使学生学习更有兴趣,老师上课更有目标。此系统开发环境为全开源的 Eclipse+Tomcat+Mysql。项目使用了 Spring 框架整合Hibernate;采用 Hibernate Annotation 语法建立持久类,实现对象到关系的适配;将数据访问对象(DAO) 作为数据接口层;利用直接 Web 远程控制(DWR)将后台的 Java 类映射到
3、JavaScript,进而减少不必要的网络传输,加快了页面打开速度。而为了达到跨浏览器的要求,系统采用了对各浏览器都支持很好的 Dojo 技术。另外,本文还特别针对考试模块的在线拟题和阅卷子模块进行了详细设计,对这两个子模块的流程进行了分析,并详细说明了其中使用的类和数据库。关键词 在线考试 Hibernate Dojo 数据访问对象 直接 Web 远程控制2The Development of Java Course Management SiteDesign and Realization of Online Drawing and Marking Test PaperAbstractSt
4、udying Online gradually comes into the peoples minds and their lives. Generally, the early form of Studying Online was using the Search Engine to search the knowledge they didnt know. But now a number of professional teaching websites emerge, which provides a possible opportunity for long distance l
5、earning. Studying Online is no longer simply to download teaching video and watch, teachers and students need interact and communicate through the Internet, which can achieve better learning Effects.This thesis is detailed design for the Website of Java Course Management, especially for the system f
6、ramework and Online Examination module. The project is used by Java course in Software School of Xiamen University. This software must meet all the needs of teaching, including lecture module, notice module, examination module, Qpublic void settest1(String test1)this.test1 = test1;public String gett
7、est1()return test1;另外,在持久类的编写过程中使用了 Hibernate Annotation 实现 Hibernate 的数据库映射,使用 Spring 的封装来配置 annotation pojo。在使用 Hibernate Annotation 的时候需要使用到一些 annotation 表达式,下面介绍在项目中用到的七个表达式。17 Entity 表明是一个 Entity 对象,默认表名与对象名相同,否则加上Table(name = “) 这样的配置语句; Id GeneratedValue(strategy=GenerationType.AUTO)标识主键和生成策略
8、; Column()映射字段的列属性; ManyToOne() Cascade(value=CascadeType.REFRESH) JoinColumn(name = “)配置多对一映射(3). 实现 CRUD 操作的 DAO( Data Access Object 数据访问接口)本系统构建了一个为数据源提供 CRUD(创建、读取、更新、删除)操作的 GenericDao 类,继承了 org.springframework.orm.hibernate3.support.HibernateDaoSupport,封装了各种数据库操作的方法,当业务类需要访问数据库时,直接调用继承了 Generic
9、Dao 类相应的 Dao 子类。GenericDao 实现的方法包括各种创建、读取、更新、删除和查询操作。(4). Hibernate 的事务管理事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,也防止数据在修改时受到用户干扰。本系统用Spring 的自动代理来配置 Hibernate 的事务管理。以下是在 Spring 中配置 Hibernate 的事务管理器18需要自动创建事务代理的 bean transactionInterceptor193.1.2 Direct Web Remoting 的使用1. DWR
10、概述 11DWR(直接 Web 远程控制)项目是在 Apache 许可下的一个开源解决方案,它供给那些想要以一种简单的方式使用 Ajax 和 XMLHttpRequest 的开发者。它具有一套 JavaScript 功能集,它们把从 HTML 页面调用应用服务器上的 Java 对象的方法简化了,它操控不同类型的参数,并同时保持了 HTML 代码的可读性。DWR 是一个 Java 开源库,帮助实现 Ajax 网站。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了许多有用的功能。它可以让人在浏览器中的 JavaScript 代码调用 Web 服
11、务器上的 Java 代码,就像 Java 代码就在浏览器中一样。DWR 主要包括两部分: 在服务器上运行的 Servlet,用来处理请求并把结果返回浏览器; 运行在浏览器上的 JavaScript,可以发送请求,并动态改变页面。DWR 会根据 Java 类动态地生成 JavaScript 代码,这些代码的魔力是让人感觉整个 Ajax调用都是在浏览器上发生的,但事实上是服务器执行了这些代码,DWR 负责数据的传递和转换。DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉,这意
12、味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应,不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML,甚至不再需要编写 Servlet 代码把Ajax 请求调整成对 Java 域对象的调用。这种 Java 和 JavaScript 之间的远程调用会让 DWR 用户感觉像是曾经习惯使用的 RMI或 SOAP 的 RPC 机制,而且这一过程还不需要额外的浏览器插件。Java 是同步的,而 Ajax 是异步的。所以当你调用一个远程方法时,你要给 DWR 一个回调函数,当数据从网络上回来时,DWR 会调用这个函数。如下图 3-5 所示,它表现了使用
13、者是如何通过 DWR 改变下拉列表的内容,图中暗色箭头表明了整个流程的调用完成过程。图 3-5 DWR 调用实现流程20DWR 动态为服务端 AjaxService 类(Java) 生成了一个相应的客户端 AjaxService 类(JavaScript),这个类被 eventHandler 调用。DWR 就会去处理整个远程调用的细节,包括在JavaScript 和 Java 之间转换参数和返回值。然后在这里例子中,它会执行你提供的回调函数(populateList),这个函数再利用 DWR 提供的工具函数来更改页面内容 12。DWR 帮你生产出具有很好交互性的网站,它提供的一些 JavaSc
14、ript 库帮你处理DHTML,也提供了一些例子作为参考。2. DWR 的配置使用(1). dwr.xml 的配置 11allow 元素中内容是可以给 JavaScript 访问的相应类名即其他操作信息。create 元素中的内容是 JavaScript 中可以访问的 Java 类,同时定义了 DWR 应当如何获得要进行远程访问的类的实例。param 元素指定要公开给 JavaScript 的 Java 类名。convertor 标签负责这些方法的参数和返回类型。convert 元素的作用是告诉 DWR 在服务器端 Java 对象表示和序列化的 JavaScript 之间如何转换数据类型。DW
15、R 自动地在 Java和 JavaScript 表示之间调整简单数据类型,这些类型包括 Java 原生类型和它们各自的封装类表示,还有 String、Date、数组和集合类型。 DWR 也能把 JavaBean 转换成 JavaScript 表示,但是出于安全性的原因,要求显式的配置,convertor 标签就是完成此项功能的。converter=“bean“属性指定转换的方式采用 JavaBean 命名规范,match=“com.model.QuesInfo“属性指定要转换的 JavaBean 的名称,param 标签指定要转换的 JavaBean 属性。(2). 在 JavaScript
16、中进行调用 DWR首先需要引入 JavaScript 脚本,具体代码为:21其中 quesInfoService.js 是 DWR 根据配置文件自动生成的,而 engine.js 和 util.js 是DWR 自带的脚本文件。接下来只需要编写调用 Java 方法的 JavaScript 函数就完成对 DWR的使用了。如下面例子程序。function checkandsave()var tigantext = document.all.tigantxt.value;var daantext = document.all.daantxt.value;var questypeid = parseIn
17、t(document.all.qtype.value);var qtype = document.all.qt.options document.all.qt.selectedIndex.innerText;var quesType = id:questypeid,quesTypeName: qtype ;var quesInfo = mainBody:tigantext,answer:daantext,quesType:quesType;quesInfoService.save(quesInfo);本例中用 quesInfoService 来使用 QuesInfoService.class
18、的方法,在这里使用了它的 save方法。不过需要注意,save 方法的参数必须是事先已经定义好的 quesInfo,参数名不可以更改,否则将无法识别,出现错误。3.2 关键技术 Dojo 介绍作为早期的开源 Ajax 架构之一, Dojo 开始于 2004 年 9 月,由 JotSpot 的 Alex Russell领导,网址是 http:/www.dojotoolkit.org/。Dojo 是一个开源的 JavaScript 工具包,本身预置了很多模块,可以实现完整的轻量级窗口组件及很多功能。Dojo 的包加载机制(Package System)可以实现动态加载所需模块。而且 Dojo 用户
19、可以编写自己的 Dojo 扩展模块,有很好的灵活性。Dojo 的目标是解决开发 DHTML 应用程序遇到的长期存在的历史问题也就是跨浏览器问题 13。目前 Dojo 支持多种浏览器,主要有: IE 5.5+ Firefox 1.0+ Safari (2.0.x) Opera (8.5)22 Konqueror (3.5)3.2.1 Dojo 的优点 141. Dojo 是一个很好的基础架构。近年来,Ajax 成了备受关注的技术热点,各种 Ajax 框架迅速的发展了起来,这其中又分为客户端 Ajax 架构,服务器端 Ajax 架构等,其中 DojoToolkit 做为一个优秀的客户端Ajax 架
20、构,被越来越多的人所关注。它可以非常有效地分离页面中的 Structure、Presentation和 Behaviour,这对于实现 Ajax 组件 unobtrusive 的目标非常有帮助。Dojo 其实是一个组件模型,类似于 Spring,用来支持大规模的组件化开发。组件模型的作用就是增强代码的重用,这对于提高开发效率是至关重要的。2. Dojo 的背后有强大的支持。Dojo 现在已经是众多开源框架的选择,包括: WebWork Tapestry Eclipse ATF MyFaces3. Dojo 的 Web 页面特性 Dojo 使 Web 页面更容易具有动态能力,在任何支持 Java
21、Script 语言的环境中发挥作用; 利用 Dojo 提供的组件,可以提升 Web 应用程序可用性和交互能力; 利用 Dojo 提供的 Widgets,Animate Transitions 更容易地建立简单易用的用户界面; 利用 Dojo 的低级 APIs 和可兼容的代码,容易写出轻便的 JavaScript 代码; 通过 Dojo 提供的工具,可以对代码进行命令行式的单元测试; Dojo 的包加载机制使代码更容易维护,耦合性更低。Dojo 通过很少的代码完成了以上的功能。当写脚本时,只需要包含很少的 JS 文件,当然也可以有选择地下载 Dojo 提供的庞大功能。4. 离线可用性Web 应用
22、程序的一个流行趋势是不管是否具有互联网连接,随时随地都可以使用它们,Google Gears 浏览器扩展就是一个典型的例子。Dojo 存储 API 也通过在客户端安全存储数据提供这种类型功能的。它适用于 IE 6、Firefox 2 和 Safari。5. 可定制的 Dojo.js 文件23Dojo 工具箱的一个有趣方面是它的构造(build)引擎。如果不希望使用一个应用程序中的某些特性,可以建立一个定制的 Dojo.js 文件构造,其中仅包含需要的功能。执行一个构造需要完整的 Dojo 源代码,它包含在下载文件中。另外,Dojo 工具箱包括一个叫做ShrinkSafe 的 JavaScrip
23、t 压缩器,允许减少用户下载的 JavaScript 代码。3.2.2 Dojo 的结构 15Dojo 的基础是一个在文档资料中称作 base(基本成分)的小型库。它包括 Ajax、事件处理、特效、CSS 查询和语言实用工具,这个基本库包含在核心 Dojo 文件(Dojo.js)中。此外,核心文件中还包含拖放、Ajax 扩展表单、I/O 、JSON-RPC、国际化和后退按钮处理等功能,它提供的有效库和选项的数量非常庞大。1. Dojo 的版本Dojo 目前最高版本号是 1.0.1,它的文件主要由上面说到的 Dojo.js 和众多的 JavaScript文件组成。使用时可以根据包加载机制动态载入
24、所需模块。Dojo 本身是由许多模块所组合而成的, 但是由于用户需求的多样性, Dojo 针对不同的需求而提供了不同的版本, 用户在下载 Dojo 的时候就能够看见可以选择的版本,根据核心代码包含模块的不同,又细分为以下五个版本: Ajax 版本:可以创建带有 Ajax 的应用程序,集成复杂的可视效果并使用事件模块; Widget 版本:包括与小器件实现松耦合的 HTML 和 CSS 模板能力,提供明确分离的样式、内容和逻辑; Event 和 I/O 版本:包括事件模块及 I/O 模块; Event 版本:包括事件模块; Kitchen Sink 版本:包括整个工具集合。以上版本分别适用于不同
25、的场合。用户也可以根据自己的需求重新构建自己的核心代码文件,只引入自己常用的模块,以避免频繁动态地加载常用的模块。而对于初学者,它提供服务器端开发者小部件,通过一个叫做 Dijit 的小部件系统提供,这个系统位于 Dojo 的顶部。Dijit 允许你用很少或不用 JavaScript 建立强大的 Web 界面。所有 Dijit 小部件提供完整的易访问性微调、支持连贯键盘事件处理的基础架构,使用者可以仅用 CSS 处理所有 Dijit 组件。HTML 和 CSS 开发者可以开发出模板驱动的小部件。2. 模块Dojo 的代码被划分为一个一个的逻辑单元,这些单元称为模块,这有点类似于 Java 中2
26、4的 package,Dojo 的模块能够包含类(类似于 Java 中的 class)和简单函数,比如:模块“dojo.html“包含了一系列的函数,模块“dojo.dnd“ 包含了一系列 HtmlDragObject 的类。Dojo 也有名称约定,函数的首字母为小写字母,类的首字母为大写,模块也可以称之为“命名空间” 16。3. 包在多数情况下,Dojo 的模块只需要定义在一个文件中就可以了,但有时一个模块可能划分到多个文件。比如:模块 dojo.html 本来是定义在一个文件中的,可是由于功能的增强,文件逐渐变大,不得不将其拆分为多个文件。这主要是为性能考虑,以便浏览器可以只下载其需要用到
27、的代码。但是,不幸的是 Dojo 的实现细节对于其用户看起来不那么透明,用户必须知道自己想要用到的功能到底是包含在哪个文件中,然后才能 require 并使用它,这样的每一个文件都称之为一个包 16。3.2.3 如何开始 Dojo以 Grid 为例由于本毕业设计中多次使用了 Dojo 的 Grid 控件,所以在此以 Grid 的使用为例子介绍Dojo 的使用方法 16。1. 引用 Dojo 的启动代码djConfig 是 Dojo 的一个全局对象,其作用就是为 Dojo 提供各种选项,isDebug 是最常用的属性之一,设置为 true 就能够在页面上直接看到调试输出,其中还有些其他属性与调试
28、有关。核心 Dojo 库通过这个脚本语句加载,在 src 中加入 dojo.js 的引用路径,这个文件的路径可能会根据不同用户的配置而有所不同。这样就完成了对 Dojo 代码的引用,并可以直接使用其中部分常用的对象。dojo.js 大概有 127K, 而未压缩前有 211K,已经把部分常用的模块整合进 dojo.js 里,因此显得大了一点,Dojo 压缩包里的 build.txt 说明了默认的 dojo.js包含了哪些模块。2. 声明要用到的包dojo.require(“dojox.grid.Grid“);dojo.require(“dojox.grid._data.model“);dojo.
29、require(“dojo.parser“);25这些代码可以理解成 Java 的 import 语句或 C#中的 using 语句,需要使用这里面的模块就需要引入这个模块,否则会出现脚本错误。dojo.require 语句加载将要在页面中用到的Dijit 特性。这一核心功能通过加载 dojo.js 文件而生效,dojo.require 语句可实现 Dojo 的全部功能。本例中主要使用了 Grid、model 以及 parser,其实 Dojo 的内部结构对用户并不是很透明,此处,如果不知道自己应该使用哪一个包的时候,可以参考 Dojo 提供的 test 程序,里面有详细的例子程序,通过查看源代码就可以知道自己需要引用哪些包了。3. 页面中使用 Dojo 提供的控件类型Dojo 功能通过分配给 HTML 元素的属性加以利用。对大多数的 Dojo 控件来说,这样使用已经足够了,用户可以在控件代码里像使用 html 一样加入自己需要的方法。但是对于Grid 来说还需要以下几个方面的工作。其实以下两个步骤本应该是在本步之前完成的,但是为了说明大多数 Dojo 控件的使用方法特将本步骤提前。4. 定义自己的 Grid 的结构gridLayout =