技术文章(自动答疑系统)
随着隔热网络教学平台的不断建设,新的学习模式不断兴起,传统的教学方式不再起到垄断性的作用,随之而来的是越来越强调学生的自主性,个性需求。学习是一个积极、能动的过程,不仅仅是告知学习者如何做或者做什么的问题。网上有效的学习是一个积极的信息加工、解释和综合的过程,目的是在于通过使用各种不同的策略来存储和提取信息,能够使学习环境适应自己的需求和目标,在这一点上,传统的教学模式已经不能很好地满足每个个体的需求,因此,一种基于网络的新型学习模式——自主性探索学习模式正在兴起。
针对当前知识的不断更新,信息量的不断增大,我们更觉得有必要通过新型的教学媒介开发新的教学手段作为对传统教学的补充,为此我们选择了“基于WEB的个人网络教学平台”的开发,而要实现当前提倡的“探索性”学习,网络自动答疑系统则是个人网络教学平台开发的重点。通过计算机和网络技术,将每门课程都设置知识问答库是自动答疑系统的基础,学习者可以通过这个不断更新的自我帮助系统完成最初的答疑解惑过程。当然这仅仅是第一步,更多的是利用网络的无限资源,通过此系统作为与外界的接口,实现最大化的信息整合,实现个人定制知识,个人自我解决问题,并通过个人的学习过程协同建设知识库,从而实现更大程度上的知识共享和广泛交流。
正是通过自动答疑系统的开发和应用,学生可以在最大程度上实现学习的自由化,从而推动学习的自主性。另外非常重要的一点是,通过自动答疑的过程,学习者能够清楚地明白自身存在的问题,并且还能够通过与同学、教师的交流做到对问题的深入探讨和研究,而不仅仅止步于单纯的问题解决。对于教师而言,自动答疑系统无疑帮助教师减轻了相当部分的工作量。教师可以通过系统对班级进行宏观调控,包括学生问答的统计、存在疑难点的分布、学生的学习程度等一系列的教学指标,通过对于这些指标的把握,教师可以对教学计划做出调整和改进,从而可以非常有针对性地因材施教。可以说,自动答疑系统的开发在推进“自主性探索”学习模式过程中起到了至关重要的作用,是整个个人网络教学平台开发的核心。一旦该模块建设成功,将极大地促进个人网络教学平台的整体功能的提升。
1.2 系统研究问题的提出
1.3 本文的主要研究内容
第二章 系统实现相关背景
2.1 网络自动答疑系统简介
2.2 国内外答疑系统的现状
2.2.1 国内网上答疑系统发展现状
在调研的过程中发现,有些教育网站中真正具有智能功能的答疑很少,大多数有答疑系统的教育类网站采用电子邮件、留言板和 BBS 聊天室等基于网络的人际交互方式实现答疑。可见国内大部分教育人员对网上答疑的认识还局限在传统教学中的人际交互的模式中,而忽视或者应该说回避了网络技术人工智能等先进技术给答疑提供的强大支持。
1.系统的独立性
在对国内的网上答疑系统的调研过程中,我们发现国内具有答疑功能的独立平台或系统非常少,大部分的答疑系统都嵌套在网络教学平台或系统之中。这与国内前一段网络教学和学习平台建设热潮有一定关系。这类答疑系统所履行的主要的功能是提供给学生就课程相关问题与教师或其它课程权威以及同伴进行交互的环境。
2.系统的功能
国内网上智能答疑系统中的主要功能、包括答疑功能、问题查询和浏览功能、用户信息和知识管理功能、系统统计功能,除此之外还包括了其它的附加功能,如用户个性化定制、问题操练、问题解答评价等功能。
国内答疑功能主要是通过人工答疑和基于数据库的自动答疑两种方式来实现。人工答疑通过电子邮件、网上异步讨论区和留言板、网上同步聊天室、网卜语音会议等方式来实现。然而人工答疑中没有从结构上给用户设计更有益于深入探讨问题的环境,结构比较松散讨论的内容很难控制。自动答疑是通过对知识库的自动搜索实现的,无论提问者输入关键字或是自然语言短语或句子,系统都会根据问题进行系统知识库的全文搜索,然后将与这个问题相关性较强的问题及其答案反馈给提问者。然而基于自然语言的答疑准确率和针对性对比较差,会有很多与问题中词语有关的信息被呈现出来,真正的答案需要用户自己来再次寻找。除了提问用户还可以通过浏览已回答问题列表解答问题,国内很多系统给用户设计了多个属性查询己回答的问题。
系统的统计功能提供了与答疑情况有关的数据和信息的简单处理,然而统计对象的选择缺乏对整个教学或学习系统的考虑,另外只提供了如频率统计这样的简单统计,缺乏对原始数据的深层处理,在统计数据与教学系统其它子系统数据交流方面也没有较好的渠道,这样统计功能对系统的改善意义就非常有限了。
总体而言,国内系统的功能较为全面和丰富,但许多功能质量较低,有些功能的实用意义较小,而且操作性不强。
3.系统的智能性
目前国内答疑系统的智能性主要体现在低水平的机器对人类自然语言的理解,自动的问题资源库检索和相关信息的反馈。然而利用自然语言进行查询的精确性和有效性没有得到科学的证明,经验表明其查询准确性较低,此外反馈的答案针对性和有效性也比较低。
4.系统的资源库
国内答疑系统寻求问题答案的资源库主要是基于课程章节组织的,这与国内答疑系统大多是教学系统的子系统有关。系统将每章学生提出的常见问题和教师的解答作为数据库的基本内容,有的系统将学科知识以章节为单位组织起来作为资源库的基本内容(如上海交通大学远程教育研究中心的网上答疑系统),有的系统的资源库是基于课堂的常见问题而建设,有的两者合一。这种基于课程的资源库结构在资源扩展时容易造成资源重复的现象。
国内网上答疑系统的一个主要问题是系统的资源库内容不够丰富,比起浩瀚的网络教学资源,网上答疑系统的资源非常有限,嵌入教学系统的答疑系统的资源库和教学系统本身的资源库是割裂的[6]。
2.2.2 国外网上答疑系统发展现状
相比国内答疑系统的丰富功能而言,国外答疑系统的功能更加简洁。虽然主要的功能与国内类似,但是所有的功能都是围绕答疑功能而设计,功能设计重点突出、设计精良。
国外系统的答案资源库不只包括知识库。还包括信息库这样答案中呈现的信息可能是对问题的解答,也包括能够解答相关问题的网上资源的信息。
与系统的独立性相关的是和国内针对学科和课本的内容体系相比,国外系统答案资源库的内容采用了内容史加丰富和广泛的主题式或专业领域式内容组织体系[4]。
2.2 本系统答疑模式的确立
2.3 系统开发的可行性研究
在线答疑系统的建设 ,解决了网络教学这种非面对面教学形式中学生与教师之间交流的难题。主要就基于WEB方式的在线答疑系统的功能及实现方法进行了讨论 ,并给出了实际的解决方法。综合以上章节我们发现在现有的答疑系统中还没有一套综合解决以下问题的方案:
针对协作学习模式而专门设计的答疑支持。
提问与答疑方式和表现手段的丰富化与多媒体化。
提问与答疑的实时交互性。
自动答疑。
答疑系统的开放性。
自动答疑系统耗费的人力物力都相对较小,而且前景比较好,所以开发本系统还是比较切实可行的。本系统在开发过程中按照先底层后界面的原则,首先是对系统的分析,然后设计系统的数据库,在代码编写的时候先写接口,再写表示层的次序进行的。
2.4 开发环境及相关技术的介绍
本系统开发环境:操作系统采用WindowsXP,WEB服务器采用:Tomcat5.0,数据库:Mysql, 开发工具:Eclipse+MyEclipse的IDE开发环境,JDK1.5。
Eclipse的开发工具具有方便,快捷的特点,开发过程中引入了第三方开源框架Spring,开发过程中采用了大量的GSTL标记语言,并引用了XML文件进行信息的存贮。
Java是由sun公司开发的一种新型的面向对象的程序设计语言,主要用于web页面的设计。
例如一些小的动画,实时更新的图表、声音等。总之,Web页面的设计主要采用HTML语言,利用Java则使其锦上添花。
Java应用程序是由Java语言编写,在经过编译和解释后,可以独立运行在MS-DOS,UNIX等操作平台上。Java应用程序一般以命令行方式运行。
(1)HTML语言属于一种简单的标记语言,一般使用者均可在数小时内学会如何编写HTML文件。而Java语言的结构和编写方法更类似于c++,所以学习Java语言要有程序设计的基础和面向对象的概念。
(2)Web页面的编写主要采用HTML语言,但若想使页面更具变化性、多样性、交互性,可采用Java语言来达到这种效果,起到锦上添花的作用。
第三章 系统总体设计
3.1 系统设计说明
3.1.1 系统开发的主要内容
本系统是由JAVA编写的,主要运用JAVA中的HTTPSERVLET来实现客户端与服务端的链接,从而实现时时的客户端IE与服务端的通讯。
1.服务器端程序的设计
在设计的时候引用了第三方控件Spring 所以我们就不用直接去创建对象,而只要在外部配置文件中描述如何创建对象的,这样的开发结构节省了人力物力。
2.客户端程序设计
客户端IE发送请求后,会自动调用服务端相应的方法,实现客户端的需求。
“网上自动答疑系统”是一个各校各课的通用系统,指导教师都可以任意地添加、删除和修改。此系统的使用者有三种,他们分别进行不同的操作,实现不同的功能,最终使得在网上自动答疑得以实现。
管理员:负责管理整个答疑系统,他可以对问题和留言及问题答案进行自如地增加、删除和修改等操作。
教师:教师可通过本系统设问和答疑。他可以把问题和答案输进本系统,供学生查询,还可以对系统中的问题和答案进行修改、添加或删除,还需负责回答学生提出的而题库中又没有的问题。
系统中的问题可以任意地添加,适用面比较广泛。用户提问可以带附件,即可以以不同的文件格式来拟题,如图象、声音、视频等。本系统界面友好、交互性强、操作方便。
3.1.2 系统开发的实施计划
自动答疑系统拟工作原理图如下图3.1:
图3.1 自动答疑系统拟工作原理图
由上面的结构图可以看出,系统的总体结构由四个部件和三个库组成。四个部件分别是提问部件,系统搜索部件,资源管理部件和系统管理部件。三个库分别是用户信息库,系统关键词库,领域知识库。
1. 用户信息库:包括用户注册时的基本信息。
2. 系统关键词库:实际上是系统工作日志库,记录系统工作时涉及到的系统负荷,用户来源和特点,与每个用户进行的对话等信息。系统分析工具可以分析这些信息得出有价值的结论,使系统更好的工作
3. 领域知识库:领域知识库是解答用户提问的基础,含有回答提问需要的相关领域的知识。一般包含的知识类型主要有陈述性知识,过程性知识和元知识三种。
用户可分为普通用户,专家用户,系统工程师。
1. 普通用户:是本系统服务的目标,他们通过使用系统解答自己的疑问。
2. 专家用户:是系统涉及到的专门领域的专家,负责提供系统最初始的领域知识和领域结构来创建领域知识库;用知识管理工具来帮助系统解决系统本身解决不了的用户问题等关键性的作用。
3. 系统工程师:熟悉计算机技术,负责解决与系统有关的技术问题。
提问部件的界面是WWW浏览方式,通过填写并提交问题表单来获得系统的即时解答。用户提问时,可以采取三种方式:纯粹的关键词的逻辑组合,基于模板的自然语言提问和不受任何限制的自然语言提问。以纯粹的关键词的逻辑组合方式来提交问题,就是用户自己提取出问题中的关键词信息,并使用与、或和非三种逻辑关系将之结合起来提交给系统来查询回答。此时的工作方式类似于Internet搜索引擎的工作方式。基于模板的自然语言提问方式,则是系统根据涉及的领域知识的特点和人们常用问题的格式,预先定义好一些提问语句,但这些提问语句的关键词部分空出来供用户填写。这种方式在关键词的基础上,进一步明确了关键词的语义作用,能够得到更精确的结果。而不受任何限制的自然语言问题,就是用户直接用自然语言写出提问的问题,由系统根据与领域相关的词典,从中抽取出关键词信息来回答用户的提问。
系统搜索部件在用户提问完毕并且系统已经成功的抽取用户问题中的关键词信息后,系统将利用搜索部件在系统的领域知识库中搜寻问题的答案。主要是基于关键词匹配的启发式搜索方式。系统搜索到问题的答案后把结果按照相关程度的高低呈现给用户。如果没有找到相关信息,则去掉重要程度低的关键词进一步搜索。如果仍然没有结果,则系统将问题自动通知给系统的某个专家用户,由专家用户来负责解答。专家的答案在自动转发给用户的同时,也会被系统工程师利用知识管理工具添加到系统中的领域知识库中。
系统管理部件可以完成处理新用户的申请,鉴别用户的身份等任务。最主要的任务是管理用户的基本信息和用户的个性信息。
3.2 系统概要设计
3.2.1 网站内容设计
本系统的运行环境:
客户端配置
硬件环境:单机Pentium Ⅱ300 128M 600M 以上硬盘空间 或以上
系统软件:Windows 98/NT/2000
开发语言:JAVA
服务端配置
硬件环境:
网络环境: 100M LAN 100节点
系统软件:Windows 2000 server或以上版本
DBMS: Mysql4.0
随着该信息量的不断扩大,对知识的搜集和管理的工作越来越繁重,急需一个软件系统解决这些问题。本软件应能结合当前学习传统作业的流程以及将来业务发展的需要,对相关学科的知识,社会知识的查询、维护提供完全的计算机管理。
性能需求:
页面响应时间:不超过10秒
更新处理时间:不超过15秒
数据转换与传输时间:不超过30秒。
适应性:
开发基于的平台要考虑向上兼容性,如操作系统,数据库等要考虑更高版本的兼容性。当需求发生变化时系统应具有一定的适应能力,要求系统能够为将来的变更提供以下支持:能够在系统变更用户界面和数据库设计,甚至在更换新的DBMS后,系统的现有设计和编码能够最大程度的重用,以保护现阶段的投资和保证软件系统能够在较少后续投入的情况下适应系统的扩展和更新。在设计中最好列出针对变更所需要重新设计的模块部分
本系统由前台主要是给用户提供自动搜索的功能,后台主要是管理员对网站内容进行控制,网站内容以简洁,明了为主,类似百度首页。后台主要用户是管理员,内容有层次感,操作方便。
3.2.2 数据模型及其属性
主要介绍问题表(quese和留言表(leave_word)的属性
quese表:
quese_id 问题的ID号
quese_title
quese_content
create_time
leave_word
leave_word_id
content
quesname
create
3.3 系统数据库设计
3.3.1 数据库设计原则
数据库设计是建立数据库及其应用系统的核心和基础,它要求对于指定的应用环境,构造出较优的数据库模式,建立起数据库应用系统,并使系统能有效地存储数据,满足用户的各种应用需求。一般按照规范化的设计方法,常将数据库设计分为若干阶段:
系统规划阶段
主要是确定系统的名称、范围;确定系统开发的目标功能和性能;确定系统所需的资源;估计系统开发的成本;确定系统实施计划及进度;分析估算系统可能达到的效益;确定系统设计的原则和技术路线等。对分布式数据库系统,还应分析用户环境及网络条件,以选择和建立系统的网络结构。
需求分析阶段
要在用户调查的基础上,通过分析,逐步明确用户对系统的需求,包括数据需求和围绕这些数据的业务处理需求。通过对组织、部门、企业等进行详细调查,在了解现行系统的概况、确定新系统功能的过程中,收集支持系统目标的基础数据及其处理方法。
概念设计阶段
要产生反映企业各组织信息需求的数据库概念结构,即概念模型。概念模型必须具备丰富的语义表达能力、易于交流和理解、易于变动、易于向各种数据模型转换、易于从概念模型导出与DBMS有关的逻辑模型等特点。
逻辑设计阶段
除了要把E-R图的实体和联系类型,转换成选定的DBMS支持的数据类型,还要设计子模式并对模式进行评价,最后为了使模式适应信息的不同表示,需要优化模式。
物理设计阶段
主要任务是对数据库中数据在物理设备上的存放结构和存取方法进行设计。数据库物理结构依赖于给定的计算机系统,而且与具体选用的DBMS密切相关。物理设计常常包括某些操作约束,如响应时间与存储要求等。
系统实施阶段
主要分为建立实际的数据库结构;装入试验数据对应用程序进行测试;装入实际数据建立实际数据库三个步骤。
另外,在数据库的设计过程中还包括一些其他设计,如数据库的安全性、完整性、一致性和可恢复性等方面的设计,不过,这些设计总是以牺牲效率为代价的,设计人员的任务就是要在效率和尽可能多的功能之间进行合理的权衡。
3.3.2 数据库结构设计
按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下六个阶段:
进行整个数据库设计必须准确了解与分析用户需求(包括数据和处理)。需求分析是整个设计过程的基础,是最困难、最耗费时间的一步。作为地基的需求分析是否做得充分与准确,决定了在其上构建数据库大厦的速度和质量。
需求分析的任务是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。
需求分析调查的重点是“数据”和“处理”,通过调查、收集和分析,获得用户对数据库的如下需求:
(1)信息需求。指用户需要从数据库中获得信息的内容与性质。由信息要求可以导出数据要求,即在数据库中需要存储哪些数据。
(2)处理要求。指用户需要完成什么处理功能。明确用户对数据有什么样的处理要求,从而确定数据之间的相互关系。
概念结构的主要特点是能真实、充分地反映现实世界;易于理解;易于更改;易于向关系、网状、层次等各种数据模型转换。描述概念模型的有力工具是E-R模型。
即首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构;
首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他概念结构,直至总体概念结构;
概念结构是独立于任何一种数据模型的信息结构。逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。
(2)将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换;(3)对数据模型进行优化。
数据库的概念结构和逻辑结构设计式数据库设计过程中最重要两个环节。
数据库在物理设备上的存储结构与存储方法称为数据库的物理结构,它依赖于给定的计算机系统。为一个给定的逻辑数据模型选取一个最适合应用要求的物理结果的过程,就是数据库的物理设计。
(1)确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;(2)对物理结构进行评价,评价的重点是时间和空间效率。
第四章 系统设计与实现
4.1 自动答疑引擎的设计和实现
4.1.1 本系统答疑模型的建立
随着网络技术的不断根新,现有的个人网络教学平台存在着交互性不强、无法真正调动学生学习主动性等问题。针对这一问题,本文提出了自主性探索的学习模式,并依托实时交互个人网络教学平台中自动答疑系统的开发,使该模式得以有效地实施。我们根据国内外自动答疑系统的开发现状,根据教师的实际需求建立了适合本系统的自动答疑模型。系统详细介绍了自动答疑引擎的设计和实现,以及引入知识库协同建设的系统模式,最大程度实现教学的自主性和可维护性,切实地提高了教学质量。最后对该项目的开发情况作了总结,并从自动答疑系统模式的完善性研究、答疑引擎的发展、教学“社区化”协同建设三方面对课题作了展望,以期能够深入研究。
4.1.2 关键字全文搜索的实现
4.2 系统主要功能模块的实现
4.2.1 自动问答功能的实现
自动答疑系统首先接受来自用户的登录,当用户在登录页面输入了正确的用户名和密码后,页面将跳转至答疑查询页面,如果用户名或密码错误,将不能成功登录,页面部实现跳转,用户登录页面如下图4.1所示:
图4.1 用户登录页面
用户进入答疑页面后可以搜索所有系统中的记录,当用户输入关键字后,点击搜索,页面将跳转至显示记录页面,搜索页面如下图4.2:
图4.2 搜索记录页面
自动答疑模块主要实现接受成员的提问,在答疑库中查询相关答疑结果,返回给成员,返回结果如下图4.3所示
图4.3 用户查询结果返回页面
当没有疑问时自动通知辅导教师进行答疑。教师答疑完成之后将答疑或讨论记录入库。教师可以添加答疑记录,并上传相关附件,如下图4.4所示:
图4.4 添加答疑记录页面
教师并拥有编辑答疑记录的权限,对答疑记录进行规范的编辑,以便用户在查询的时候能够更准确搜索所需答案,教师可以删除重复或者过期的答疑记录,编辑删除答疑记录的页面如下图4.5 所示:
图4.5 编辑删除答疑记录的页面
在教师编辑答疑记录的过程中,如果编辑的内容或者格式不符合系统要求,提交后,页面将不实现跳转,如果按照系统要求编辑了答疑记录,页面将跳转至显示成功页面,如下图4.6:
图4.6 编辑答疑记录结果返回页面
在教师删除答疑记录时,系统将会弹出对话框,提示教师是否确定删除当前记录,如下图4.7所示:
图4.7 删除答疑记录提示页面
从上面的分析可以看出,以教师为中心教师,通过一个教室联网与学生实时通信交流,这种方式解决了学生与教师之间时空的间隔,学生可以与教师进行面对面交流,采取逐层控制,分级管理模式,使得系统能够稳定有效的进行。而要开发的Internet网络自动答疑系统,应该说具有一定智能性、开放性、主动性和使用友好方便的特点,以较少的人力物力,不受时空的局限,具有较高的实用价值,结合适当适时的实时交互答疑,效果将会更好。
自动答疑系统的数据流图如图4.8所示。
图4.8 自动答疑系统的数据流图
在本系统能中自动问答功能主要是靠系统提供的搜索机制,用户先输入需要查询的问题,当用户发出请求后,进行页面跳转,并且调用DAO文件,结合SQL语句中的模糊查询,截取用户提出问题的关键词,进行搜索,如果有相关信息则返回给用户,如果没有相关信息则提示用户进行新的问题的提交。
4.2.2 知识库查阅功能的实现
在本系统中,程序主要通过模糊查询实现知识库查阅功能,SQL语句如下:
private static final String QUERY_QUES = "select * from ques where ques_title like ?";
用户通过在主页面中输入所要查询的问题,提交到后台程序,后台程序进行判断处理,提取该问题的核心词汇,如果能够找到,则把所有问题返回,如果没有找到则返回一个空信息。
4.2.3 知识库建设的实现
知识库建设主要通过专家对提出的问题的解答,及系统用户提出问题,等呆专家进行解答,把用户提出的问题和专家的解答存入知识库。
4.3 系统界面设计
第五章 总结和展望
5.1 系统开发总结
5.2 自动答疑系统的展望
5.2.1 自动答疑系统的完善性研究
随着技术的不断更新,知识需求的程度的不断膨胀,自动答疑系统前景还是比较广泛的,目前的系统还应该根据用户特殊功能的需求而不断的改进和完善。
5.2.2 自主性探索学习引擎的发展
基于自主性学习的教学,是作为一种教学活动而存在的。在教学活动中,教师依据一定的教学目标,组织、帮助和指导学生有效地开展自主性学习。具体来说,基于自主性学习的教学活动所强调的是这样一种情形:整个教学以给予学生的自主学习时间为前提,以培养学生的自主学习能力和促进学生的自主发展为目标,以让学生自主决定、自主选择、自主控制、自主反思、自主评价、自主建构为进程,以教师的组织、帮助和指导为方式而开展的教学活动过程。这种自主性学习的教学,是一种最高理想的教学过程,它充分体现了教师的教学自主和学生的学习自主。
致 谢
本研究及学位论文是在我的导师王晨关怀和悉心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成, 王 老师都始终给予我细心的指导和不懈的支持。在此谨 向王 老师致以诚挚的谢意和崇高的敬意。
在此,我还要感谢在一起愉快的度过四年大学生活的638每个同学,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。
参考文献
[1] 蒋东兴 沈培华 罗念龙等. 清华大学网络教学实践与规划[J]. 新世纪网络教育研讨会. 2001年,6月,第四期.
[2] 武祥村 陶超全 周霖 一个网上共享式CAI课件点播学习系统TH-COD[J],现代教育技术研究与应用. 1999年,10月,第三期.
[3] 黄维通 黄欣 汤荷美. 基于BWD的网络考试系统的设计与实现[J]. 计算机工程. 2000年,11月, 第26卷.
[4] 周霖 武祥村 蒋东兴. 课件点播系统研究与实现[J]. 计算机工程. 2000年,11月,第26卷.
[5] 柳泉波. Internet环境下的网络自动答疑系统[J]. 教育技术通信. 1999年,3月,第七期.
[6] 吴娟. 网上协作学习策略的研究[J]. 教育技术通信. 1999年, 3月, 第七期.
[7] 顾君忠. 现代远程教育技术和CSCL[J]全国CBE学会 基于网络和计算机的教育 专题论文集. 2000年, 1月, 第6卷.
[8] 赵建华 李克东. 信息技术环境下基于协作学习的教学设计[J]. 教育技术通信. 1999年, 3月, 第七期.
[9] 张毅斌 顾君忠. VClassRoom:一个基于子空间模型的协同教学系统[J]. 通信学报. 1999年,9月,第九卷.
附 录
核心代码由于版面的原因主要列举了接口,接口的实现,业务逻辑的实现及模型JAVABEAN,代码如下:
IbusinessService接口
import cc.auto.bean.Attachment;
import cc.auto.bean.ImageInfo;
import cc.auto.bean.LeaveWord;
import cc.auto.web.util.Finder;
public interface IBusinessService {
public static final String QUES = "que";//定义一个静态的QUES常量
public List getQues(int number);
public List getLeaveWords(int number);
public Ques getQues(long quesId);
public LeaveWord getLeaveWords(long leaveWordId);
public void addLeaveWord(LeaveWord leaveWord);
public Finder getQuesePagination(int page);
public Finder getLeaveWordPagination(int page);
public Ques addQues(Ques ques);
public List<Attachment> getAttachments(String attachmentType, long useAttachmentId);//获取附件
public Attachment addAttachment(Attachment attachment);//添加附件
public ImageInfo addImageInfo(ImageInfo image);
public List<ImageInfo> getImages(String imageType, long useImageId);
public Ques updateQues(Ques ques);
public void removeQues(long quesId);
public void removeLeaveWords(long leaveWordId);
private boolean hasPrevious = false;
private boolean hasNext = false;
public void setTotalRows(int totalRowsNum) {
this.totalRows = totalRowsNum;
this.totalPages = ((totalRowsNum + pageSize) - 1) / pageSize;
if (currentPage < totalPages) {
public boolean isHasPrevious() {
} else if (currentPage == 1) {
} else if (currentPage == totalPages) {
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
public void setPageSize(int pageSize) {
public void setToPage(int toPage) {
public void setTotalPages(int totalPages) {
public void setCollection(List collection) {
public void setHasNext(boolean hasNext) {
public void setHasPrevious(boolean hasPrevious) {
this.hasPrevious = hasPrevious;
//基类BaseDao,继承了springframework下的JdbcDaoSupport
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class BaseDao extends JdbcDaoSupport {
import java.sql.PreparedStatement;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import cc.auto.web.util.Finder;
public class QuesDao extends BaseDao {
private static final String QUESES = "select * from ques order by create_time desc limit ?,?";
private static final String QUES = "select * from ques where ques_id=?";
private static final String QUES_COUNT = "select count(*) as ques_count from ques";
//定义SQL语句向数据库中插入问题名称,问题内容,问题提交时间
private static final String DELETE = "delete from ques where ques_id=?";
private static final String QUERY_QUES = "select * from ques where ques_title like ?";
public List<Ques> getQuese(final Finder finder) {
final List<Ques> quese = new ArrayList<Ques>();
final int firstResult = (finder.getToPage() - 1) * finder.getPageSize();
this.getJdbcTemplate().query(QUESES, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(2, finder.getPageSize());
public void processRow(ResultSet rs) throws SQLException {
ques.setQuesId(rs.getLong("ques_id"));
ques.setQuesTitle(rs.getString("ques_title"));
ques.setQuesContent(rs.getString("ques_content"));
ques.setCreateTime(rs.getTimestamp("create_time"));
public Ques getQues(final long quesId) {
this.getJdbcTemplate().query(QUES, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
public void processRow(ResultSet rs) throws SQLException {
ques.setQuesId(rs.getLong("ques_id"));
ques.setQuesTitle(rs.getString("ques_title"));
ques.setQuesContent(rs.getString("ques_content"));
ques.setCreateTime(rs.getTimestamp("create_time"));
public void getQuesNum(final Finder finder) {
this.getJdbcTemplate().query(QUES_COUNT, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
finder.setTotalRows(rs.getInt("ques_count"));
public List< Ques > get Ques (final String quesTitle) {
final List< Ques > ques = new ArrayList< Ques >();
this.getJdbcTemplate().query(QUERY_ QUES, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, "%"+ quesTitle.trim()+"%");
public void processRow(ResultSet rs) throws SQLException {
qe.setQuesId(rs.getLong("ques_id"));
qe. setQuesTitle(rs.getString("ques_title"));
qe.setQuesContent (rs.getString("ques_content"));
pd.setCreateTime(rs.getTimestamp("create_time"));
public Ques save(final Ques ques) {
KeyHolder keyHolder = new GeneratedKeyHolder();// 创建一个主键执有者
getJdbcTemplate().update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
PreparedStatement ps = conn.prepareStatement(ADD_QUES); ps.setString(1, ques.getQuesTitle());
ps.setString(2, ques.getQuesContent());
ps.setTimestamp(3, new java.sql.Timestamp(ques.getCreateTime().getTime()));
ques.setQuesId(keyHolder.getKey().longValue());// 从主键执有者中获取主键
public Ques update(final Ques ques) {
this.getJdbcTemplate().update(UPDATE_QUES, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, ques.getQuesTitle());
ps.setString(2, ques.getQuesContent());
ps.setTimestamp(3, new java.sql.Timestamp(ques.getCreateTime().getTime()));
ps.setLong(4, ques.getQuesId());
public void delete(final long quesId) {
this.getJdbcTemplate().update(DELETE, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
// LeaveWordDao继承BaseDao实现提交问题业务逻辑
import java.sql.PreparedStatement;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowCallbackHandler;
import cc.auto.bean.LeaveWord;
import cc.auto.web.util.Finder;
public class LeaveWordDao extends BaseDao {
private static final String SELECT_LEAVEWORD = "select * from leave_word where leave_word_id=?";
//定义SQL语句向数据库中插入留言者问题名称,问题内容,提交时间
private static final String LEAVEWORD_COUNT = "select count(*) as leaveword_count from leave_word";
private static final String DELETE = "delete from leave_word where leave_word_id=?";
public List<LeaveWord> getLeaveWord(final Finder finder) {
final List<LeaveWord> leaveWord = new ArrayList<LeaveWord>();
final int firstResult = (finder.getToPage() - 1) * finder.getPageSize();
this.getJdbcTemplate().query(SELECT_LEAVEWORDS,
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps)
ps.setInt(2, finder.getPageSize());
public void processRow(ResultSet rs) throws SQLException {
LeaveWord lw = new LeaveWord();
lw.setLeaveWordId(rs.getLong("leave_word_id"));
lw.setQuesName(rs.getString("ques_name"));
lw.setContent(rs.getString("content"));
lw.setCreateTime(rs.getTime("create_time"));
public LeaveWord getLeavewords(final long leaveWordId) {
final LeaveWord lw = new LeaveWord();
this.getJdbcTemplate().query(SELECT_LEAVEWORD, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
public void processRow(ResultSet rs) throws SQLException {
lw.setLeaveWordId(rs.getLong("leave_word_id"));
lw.setQuesName(rs.getString("ques_name"));
lw.setContent(rs.getString("content"));
lw.setCreateTime(rs.getTimestamp("create_time"));
public void getLeavewordNum(final Finder finder) {
this.getJdbcTemplate().query(LEAVEWORD_COUNT, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
finder.setTotalRows(rs.getInt("leaveword_count"));
public void addLeaveWord(final LeaveWord leaveWord) {
this.getJdbcTemplate().update(INSERT_LEAVEWORD, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, leaveWord.getQuesName());
ps.setString(2, leaveWord.getContent());
ps.setTimestamp(3, new java.sql.Timestamp(leaveWord.getCreateTime().getTime()));
public void delete(final long leaveWordId) {
this.getJdbcTemplate().update(DELETE, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
import cc.auto.bean.Attachment;
import cc.auto.bean.ImageInfo;
import cc.auto.bean.LeaveWord;
import cc.auto.dao.AttachmentDao;
import cc.auto.dao.LeaveWordDao;
import cc.auto.web.util.Finder;
public class BusinessService implements IBusinessService {
private LeaveWordDao leaveWordDao;
private AttachmentDao attachmentDao;
public List getQues(int number) {
return quesDao.getQuese(finder);
public List getLeaveWords(int number) {
return leaveWordDao.getLeaveWord(finder);
public final void setQuesDao(QuesDao quesDao) {
public final void setLeaveWordDao(LeaveWordDao leaveWordDao) {
this.leaveWordDao = leaveWordDao;
public Ques getQues(long quesId) {
return quesDao.getQues(quesId);
public LeaveWord getLeaveWords(long leaveWordId) {
return leaveWordDao.getLeavewords(leaveWordId);
public void addLeaveWord(LeaveWord leaveWord) {
this.leaveWordDao.addLeaveWord(leaveWord);
public Finder getQuesePagination(int page) {
finder.setCollection(quesDao.getQuese(finder));
public Finder getLeaveWordPagination(int page) {
leaveWordDao.getLeavewordNum(finder);
finder.setCollection(leaveWordDao.getLeaveWord(finder));
public Ques addQues(Ques ques) {
public List<Attachment> getAttachments(String attachmentType, long useAttachmentId) {
return attachmentDao.getAttachments(attachmentType, useAttachmentId);
public final void setAttachmentDao(AttachmentDao attachmentDao) {
this.attachmentDao = attachmentDao;
public Attachment addAttachment(Attachment attachment) {
return attachmentDao.save(attachment);
public ImageInfo addImageInfo(ImageInfo image) {
public Ques updateQues(Ques ques) {
public void removeQues(long quesId) {
attachmentDao.removeAttachments(QUES, quesId);
imageDao.removeImages(QUES, quesId);
public void removeLeaveWords(long leaveWordId) {
leaveWordDao.delete(leaveWordId);
public class Ques implements java.io.Serializable {
public Ques(long quesId, String quesTitle,String quesContent, Date createTime) {
this.quesContent = quesContent;
public String getQuesTitle() {
public void setQuesTitle(String quesTitle) {
public String getQuesContent() {
public void setQuesContent(String quesContent) {
this.quesContent = quesContent;
public void setCreateTime(Date createTime) {
public void setQuesId(long quesId) {
public class LeaveWord implements java.io.Serializable {
public LeaveWord(long leaveWordId) {
this.leaveWordId = leaveWordId;
public LeaveWord(long leaveWordId,String quesName, String content, Date createTime) {
this.leaveWordId = leaveWordId;
public void setContent(String content) {
public void setCreateTime(Date createTime) {
public long getLeaveWordId() {
public void setLeaveWordId(long leaveWordId) {
this.leaveWordId = leaveWordId;
public void setQuesName(String quesName) {
技术文章(自动答疑系统)相关推荐
- 自动仓储系统(AS/RS)技术与装备
4.1自动仓储系统(AS/RS)概述 自动仓储系统即AS/RS(Automated Storage and Retrieval System)是指不用人工直接处理.能自动存储和取出物料的系统.自动化仓 ...
- 基于SSH架构的在线答疑系统
摘要 答疑是教学一个重要环节,在传统的教学模式下,答疑通常是通过老师和学生面对面进行交流,此模式使得答疑在实际教学难以执行.而网络教学模式就打破了传统模式在时间和空间上的限制,同学们可以自主安排时间和 ...
- 双网卡上网冲突解决_【技术文章】局域网IP地址冲突罪魁祸首是什么?这几点要注意!(附高手处理方法)...
现如今,人们的生活处处离不开网络.单位办公信息化对网络的依赖则更大.为了提升安全管理和信息化水平,很多单位不仅建设了完善的办公信息系统,还部署了视频监控.但由于缺乏整体规划,或选择网络产品时考虑欠周, ...
- 基于web的教学答疑系统
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye2 第一章 绪 论 1.1基于Struts和Hibernate的教学答疑系统的优势 目前随着Int ...
- 基于量产的乘用车高速自动驾驶系统开发
近日,深圳通过了<深圳经济特区智能网联汽车管理条例>,成为全国首个支持全域L3级自动驾驶的城市,为全国其他城市的L3级自动驾驶准入政策,提供了标准和模板. 在此之前,乘用车高速自动驾驶早已 ...
- 卡车自动装载系统(ATLS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
本文研究全球与中国市场卡车自动装载系统(ATLS)的发展现状及未来发展趋势,分别从生产和消费的角度分析卡车自动装载系统(ATLS)的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的 ...
- 自动驾驶系统入门(八)- 自动驾驶仿真技术
1.什么是自动驾驶汽车 1.1 基本概念定义 1)自动驾驶汽车是通过搭载先进的车载传感器.控制器和数据处理器.执行机构等装置,借助车联网.5G和V2X等现代移动通信与网络技术实现交通参与物与彼此间的互 ...
- 【转】自动驾驶系统入门(八)- 自动驾驶仿真技术
1.什么是自动驾驶汽车 1.1 基本概念定义 1)自动驾驶汽车是通过搭载先进的车载传感器.控制器和数据处理器.执行机构等装置,借助车联网.5G和V2X等现代移动通信与网络技术实现交通参与物与彼此间的互 ...
- 最新WordPress系统文章自动采集插件Auto Post完美运行版
源码介绍: 今天有用户咨询wp的采集插件,找了一个WordPress文章采集插件Auto Post Pro3.6.2版本,可以多线程采集.自动采集免授权学习版,目前完美运行于的WordPress各个版 ...
最新文章
- MySQL 常见操作指令
- C++编程优化——让你的代码飞起来
- 单片机温度控制系统DS18B20
- Linux内核中断底半部处理--工作队列
- fasttext简单理解及应用
- java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制
- 南邮CTF-MISC-Remove Boyfriend
- openoffice转化太慢且不能多线程_职场新人众多工作要处理,手足无措咋办?“多线程工作法”来救急...
- java窗体实现射击_java_Java基于Swing实现的打猎射击游戏代码,本文实例讲述了Java基于Swing实 - phpStudy...
- 【动态规划】路径dp:蓝桥2020: 数字三角形
- 毕业设计-医院药品出入库管理系统
- 面试必备(背)-Linux八股文系列!
- java layoutinflater_安卓 LayoutInflater详解
- 魏俊妮《支持业务发展为核心的HR六大模块体系构建》课程大纲
- 使用 {}.format 对字符串进行格式(一)
- 进阶篇:5.1.1)确认公差分析的目标尺寸和判断标准
- 程序员离职后跳到国企,每天主动加班到10点,结果试用期没过?
- 微信又因夜间模式上热搜,我们又成为了谣言的传播者
- 企业微信2020年翻倍增长背后:更新27个版本、迭代1000多次
- asp.net 调试 无法显示该网页