zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于Java(SSH)+ Oracle 实现的(Web)视频教学平台【100010405】

JAVAsshOracle平台Web 实现 基于 视频
2023-09-11 14:17:49 时间

基于 SSH 的视频教学平台

第 1 章引言

1.1 论文研究背景与意义

随着我国教育事业和多媒体教学设施的快速发展,越来越多的人可以有机会接受教育,促使人们对教育的质量和要求就有了更高的要求。同时,教育也慢慢往公开方向发展,让人们有机会选择更适合自己的课程来学习提升自己,共享教育资源。视频教学平台是人们空闲时间学习和提升自己的重要场所,可以共享教育资源以提高利用率。现在我国的教育事业发展速度,大部分人都有机会可以接收到学校的教育。任何事物都是两面的,机会和选择的增多,也使得很多人不珍惜,现在很多高校存在学生上课不认真、课后不努力的现象就体现了这一点。

社会对人才的知识要求越来越高。80 后、90 后、乃至 00 后仍有很多人没有机会接收教育,部分原因是自己本身学不好不想上学、家庭条件不允许继续深造等。我国教育不像美国教育,出来社会后仍可以回校学习深造,以我国中学的教育理念和制度,出社会后很难再回校读书。

视频教学平台的出现,弥补了这块教育体系的空缺。不仅让学校的同学拥有学习其他相关专业的知识,实现教学资源的最大限度的利用,减少相关的资源浪费;学生课后可以对知识再复习巩固,减轻教师的教学负担和同学课后复习的困难,有利于推动学生的学习动力,促进学习氛围;同时在大数据时代,我们不能止步于传统的课堂教学,要跟上时代的潮流,随着网络的进一步发展,网络课堂已经成为必然趋势;社会上一些想学习的人即使没有机会上好学校,也可以在视频教学平台上学习到和学生一样的课程和知识。

开发视频教学平台,有利于学校的学科发展和建设,能够进一步提升学生的自学能力。有利于进一步加强学校的学术氛围和社会的学习氛围。在社会进行再教育,也极大地提升人们的知识文化水平,有利于社会的安定和整体文化实力的提升。同时也进一步地完善了我国的教育系统。

1.2 研究内容与目标

本毕业设计采用面向对象的方法,运用 SSH 框架、Oracle 数据库等现有的技术,设计开发一个基于 SSH 框架的视频教学系统平台。主要实现教师添加课程并对课程进行管理、添加测试、上传课件等功能,同时设立管理员对教师和视频教学课程进行审核和管理。前端使用流行的 Bootstrap 前端框架来快速搭建页面,后台使用 Struts2,Spring,Hibernate 框架来实现视频教学平台,以实现网上教学和教育资源的共享的目标。

第 2 章开发环境及相关技术的介绍

2.1Java 简介

Java面向对象的开发编程语言,具有功能强大和简单易用两个特征。Java 具有健壮性、面向对象、多线程分布式、动态性、安全性、简单性、平台独立与可移植性等特点[1]。Java 可以编写各种各样的应用程序,如 Web 应用程序分布式系统嵌入式系统应用程序、桌面应用程序等。它在设计时就被承诺:WriteOnce,RunAnywhere[2].

Java 上世纪九十年代设计出来到现在已经有二十多年,有生命力的东西才能够经住历史的考验,现在仍然作为一门最流行的编程语言之一,深受程序员的喜爱,可见 Java 语言的强大与易用。

2.2MVC 简介

在以前 Model1 模式下,做出来的系统几乎全部是由 JSP 页面组成的,JSP 页面不仅要接收和处理用户的请求,还要对请求进行处理后直接做出响应。只用少量的 JavaBean 来连接数据库的访问等操作。虽然这种模式实现简单,很适合极快地开发一些小型的项目。但因为把显示和控制的任务都交给 JSP 页面来处理,导致代码重用底,后期也难以扩展和维护[3]。

Model2 模式已经是以 MVC 架构为基础的设计模式,MVC 思想[4]将一个应用分成三个部分:Model(模型)、View(视图)、Controller(控制器),这三部分各司其职,有分工也有合作,可以提高系统的可维护性和可扩展性,如图 2-1。事件的发生由控制器来进行负责,控制器根据事件的类型来决定要调用什么样的视图或模型。

图 2-1MVC 模式的 JavaWeb 运行流程

2.3SSH 架构

SSH 框架是框架 Struts2、Spring 框架、Hibernate 框架的集成框架,是开源的比较典型的基于 MVC 思想的框架。其中 Struts 负责进行对系统进行 MVC 分离,模型部分负责控制业务跳转;Hibernate 提供面向对象的方法对持久化的数据进行存取,使程序员可以采用面向对象的方法来操作数据库;Spring 负责整合和管理 Struts2 框架和 Hibernate 框架。

2.3.1Struts

Struts2 是一个以 MVC 设计模式为基础的 Web 应用型框架[5]。在 MVC 的设计模式下,模型和视图之间的数据交流传递是通过 Struts2 作为控制器(Controller)来建立的。Struts2 框架在 Struts1 框架的基础上,去掉 Struts1 不合理的部分,再整合 WebWork 优秀部分,其实和 Struts1 差别很大。

Struts2 的最前面的控制器是 FilterDispatcher,它能最先接收和过滤用户的请求。FilterDispatcher 的本质其实是一个 Servlet。现在的 Struts 中已经把 FilterDispatcher 改名为 StrutsPrepareAndExecuteFilter,这个命名更加清晰和明确。模型是对事物本身建立的一个模型,所有的业务逻辑、数据的存储都应该放在模型中。视图就是看得到的东西,即上网看到的页面都可以称为视图。在系统启动的时候 Web 容器会先进入 web.xml,所以程序员要先在 web.xml 中指定 FilterDispatcher 来指定用户的什么请求需要过滤器过滤,然后让 struts 执行。Struts2 的原理图见图 2-2。

图 2-2Struts2 的原理图

2.3.2Spring

Spring 是一个开源的框架。Spring 开发流行的原因就是因为企业应用开的过程比较复杂,而 Spring 则可以使用基本的 JavaBean 来代替 EJB,不仅如此它还提供很多的企业功能。Spring 是一个轻量级的容器框架,控制反转(IoC)和面向切面(AOP)是它的两个重要特征。Spring 的核心是轻量级(Lightweigt)的容器,它是实现 IoC(InversionofControl)容器和非侵入式(Nointrusive)的框架,它提供 AOP(Aspect-orientedprogramming)概念的实现方式;提供对持久层(Persistence),事务(Transaction)的支持,提供 MVCWeb 框架的实现,并对一些常用的企业级 API 提供一致的模型封装,是一个全方面的应用程序框架[6]。还有就是,现在的各种框架(如:Struts,Hibernate 等),Spring 也提供了和它们无缝整合的方法。这也说明了它不仅专注于某一层的解决方案,可以说 Spring 是企业级应用开发的“一站式”选择,Spring 贯穿表现层,业务层,持久层,Spring 并不是想取代这些已有的框架,而是对它们进行无缝整合。从图 2-3 可以看到,使用 Spring 框架时,必须使用 SpringCoreContainer(即 Spring 核心容器),主要由 org.springframework.core、org.springframework.beans、org.springframework.context 和 org.springframework.expression 四个包和它的子包构成,以提供 SpringIoC 容器的支持。

图 2-3Spring 框架的组成结构图

2.3.3Hibernate

Hibernate 是一个开源的对象和数据库表的关系映射的框架。JDBC 被 Hibernate 进行了十分轻量级的封装,Hibernate 将普通的 Java 类与数据库表建立起映射关系。Hibernate 可以自动生成 SQL 语句,自动执行,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库[7]。Hibernate 将数据库表和程序的普通 Java 类进行映射处理,对数据库的数据进行的操作进行了对象封装,使程序员不需要精通数据库知识,只要会面向对象编程就可以对数据进行存取。Hibernate 不仅管理普通 Java 类到数据库表的映射关系,还提供数据查询和存储数据的方法,可以大大减少开发人员使用 SQL 语句和 JDBC 来处理数据问题的时间。

Hibernate 是优秀的 ORM 框架,是因为它有以下优势:

开源、免费的 License,可以对源码进行修改定制。

轻量级的封装,不会引入其他的复杂问题,方便调试。

扩展性强,API 对外开放,需要时可以自己进行扩展。

开发者活跃,框架有稳定的发展和维护保障。

2.4Maven 简介

Maven 是一个项目管理的工具,它管理项目的策略是“约定优于配置(CoC)”。它不仅用于把源代码构建成可发布的项目(包括编译、打包、测试和分发),还可以生成报告、生成 Web 站点等[8]。Maven 有如下特点:

Maven 能够自动化地进行构建,比如:清理、编译、测试、生成报告、打包和部署。

Maven 极大地清除重复的构建。

Maven 抽取构建生命周期的模型,它吸收了很多其他的构建脚本和构建工具的精华,根据很多项目的实际需求来进行思考总结。如果参照这个模型,则可以避免很多没必要的错误。

Maven 的插件,Maven 为几乎全部的构建任务提供了已经实现的插件,而且还有很多其他稳定的插件来完成任务,它还可以自己来实现插件。

Maven 统一标准化构建过程。

2.5Bootstrap 简介

Bootstrap 是由 Twitter 的设计师 MarkOtto 和 JacobThornton 两个人一起合作开发的,是现在极受开发者喜欢的前端框架。Bootstrap 是以 HTML5CSS3 为基础开发的,它在 jQuery 的基础上进行了更好的封闭和发展,在这个过程中慢慢形成一种自己特有的网站风格,而且兼容大部分 jQuery 插件[9]。Bootstrap 提供了漂亮合理的 HTML 和 CSS 的规范,它是由动态 CSS 语言和 Less 写成。有了 bootstrap,程序员也可以快速地写出漂亮的前端页面,而不再完全需要美工的支持。同时它对移动端的支持也是它的一大特点,能够能页面在移动端和 PC 端都有很好的展示。

2.6Tomcat 服务器

Tomcat 是 JavaWeb 项目中最著名的开源的 Web 容器,不仅简单容易使用,而且比较稳定,既可以拿它来自己学习,也可以用它对商业新产品进行发布。Tomcat 的强大是因为它不仅有 Web 容器的基本功能,还提供 JAAS 和 JNDI 的绑定等。Tomcat 和 Java 语言一样,可以在任何操作系统上运行,具有平台无关性的特点[10]。很多的程序员都喜欢 Tomcat,因为使用它运行时占用的系统资源小,它的扩展性很好,支持邮件服务、负载平衡等应用系统常用到的功能;更重要的是它还在不断的完善和发展中,任何一个程序员只要你有兴趣都可以修改它或者在它里面加入新的功能。Tomcat 是一个轻量级的小型的 Web 服务器,适合在中小型系统和并发访问的用户不非常多的情况下使用,是开发和调试 Web 应用程序的第一选择。

2.7 开发环境的搭建

下载并安装 JDK7.0(https://www.oracle.com)

下载并安装 eclipse-jee-kepler-SR2-win32-x86_64(https://www.eclipse.org

下载 Maven 并在 Eclipse 中安装配置好(http://maven.apache.org

下载并安装 Oracle(https://www.oracle.com

在 Eclipse 工具中,安装 Struts2,Spring,Hibernate 插件。

第 3 章需求分析

3.1 系统功能

视频教学平台的用户类型分为普通用户、教师用户和管理员用户。教师用户除了具有普通用户所有的属性和操作外,还具有添加课程、管理课程、上传课件、添加测试、回复留言等操作;管理员用户可以添加教师和审核管理教师课程。

普通用户的基本操作:

(1)用户的注册、登录,没有登陆则不能观看视频。

(2)维护个人信息,包括个人信息的修改和登录密码的修改。

(3)下载课程资料。

(4)进行课程测试。

(5)给教师留言和查看留言信息。

教师用户的基本操作:

(1)维护个人信息,包括个人信息的修改和登录密码的修改。

(2)添加、查看、删除课程

(3)上传课件

(4)添加测试

(5)回复留言

管理员用户的基本操作:

(1)维护个人信息,包括个人信息的修改和登录密码的修改。

(2)审核和管理教师课程

(3)添加教师

3.2 用例图

用例图[11]用来表示系统做了哪些事情的,可以帮助分析系统有哪些功能,以及明确系统内部和系统外部的交互。从图 3-1 到图 3-3 中,可以看到系统具体的功能,同时可以清楚的知道哪些用户具有哪些功能。

图 3-1 学生用户用例图

图 3-2 教师用户用例图

图 3-3 管理员用户用例图

3.3 用例规约

用例图只能在总体上大概地说明了系统的用户和功能服务,简洁明了。所以,用例模型不仅要包括用例图,还包括了用例规约[12]。

用例编号:UC01

用例名称:用户学习课程

简要说明:用户选择课程进行学习

参与者:用户

涉众及其关注点:教师希望用户可以在课程中学到自己想要的东西

前置条件:登陆

后置条件:无

扩展点:无

触发事件:用户点击观看视频

基本流:

1.用户浏览页面,选择相应的课程

2.用户登陆成功

3.用户点击课程进行学习

备选流:

*a.在基本流的任何一步骤用户退出系统或关闭浏览器

2a.系统提示用户登陆后才能学习课程

成功场景:学习课程成功

失败场景:

1.用户登陆失败

2.系统异常

特殊需求:无

未解决问题:无

用例编号:UC02

用例名称:教师上传课程

简要说明:教师上传课程和课程相关的信息

参与者:教师

涉众及其关注点:教师希望可以成功上传课程,管理员希望教师上传的课程合理。

前置条件:教师登陆成功

后置条件:课程上传成功后需等待管理员审核

扩展点:无

触发事件:教师提交课程

基本流:

1.教师点击“添加课程”菜单

2.填写课程的基本信息并提交

3.教师选择添加章节和视频,为课程继续添加信息

4.教师选择视频文件

5.提交信息

备选流:

*a.在基本流的任何一步骤用户退出系统或关闭浏览器

2a.填写的信息不符合规范

4a.选择的视频文件与允许上传的文件格式不符合,或视频文件大小过大

成功场景:基本流,添加课程成功

失败场景:

1.教师登陆失败

2.填写的课程信息有误

3.视频格式不正确或大小过大

特殊需求:无

未解决问题:无

第 4 章概要设计

4.1 系统框架设计

该系统为前端页面展示和后台业务处理两部分。前端使用 Bootstrap 框架,页面简单处理即可获取优美的展现效果。后台使用流行的 SSH 框架,Struts2 负责分层和过滤用户请求,并控制页面的跳转;Hibernate 负责所有的持久化操作;Spring 负责管理 Struts2 和 Hibernate。

后台具体可划分为 4 层。

Action 层(控制器层):接收前端页面数据的传输,调用业务层,负责页面的跳转。

Service 层(业务逻辑层):处理系统的业务。

Dao 层(持久层):负责所有对象的数据库操作,如增、删、改、查。

Entity 层(实体层):普通的 Java 实体类。

通过以上的分层,可以提高应用程序的扩展性、维护性、伸缩性、重用性、管理性。Action 层获取前端数据,调用业务处理层进行处理,如果需要持久化处理则业务层调用持久层来进行数据的存取,最后由 Action 控制层来决定返回哪个逻辑视图显示给用户。具体的系统框架如图 4-1 所示:

图 4-1 系统框架图

4.2 顺序图

用户所有操作都要先经过 Action,当用户发送一个请求时,Action 获取到用户请求的数据,必要时把数据封装成对象,再调用业务层对数据进行处理,若需要到数据库的操作,则由业务层来调用持久层来完成,最后由 Action 来返回页面给用户。具体的顺序图模型如图 4-2 所示:

图 4-2 用户请求顺序图

4.3 系统活动图

当用户浏览页面时,系统处于没有登录的状态。当用户登录成功后,系统处于已经登录的状态,可以进行各种各样的操作。若未进行登录,则不能进行任何有关数据的操作。如果用户退出登陆后,系统处于没有登录的状态,可以重新进行登录,或退出应用程序。具体的系统活动图[13],如图 4-3 所示:

图 4-3 系统活动图

第 5 章详细设计

5.1 数据关系模型

根据需求分析和用例分析,此系统的数据库可以由如下实体构成:

(1)用户表 User(用户编号,用户名,密码,性别,邮箱,地址,电话,职业,状态,简介,学校)

(2)管理员表 Admin(管理员编号,用户表)

(3)教师表 Teacher(教师编号,单位,用户表)

(4)课程表 Course(课程编号,课程名,课程简介,学时,状态,分类,上传时间,备注,教师)

(5)课件表 Annex(课件编号,课件路径,课件类型,课件名,课程表)

(6)章节表 Chapter(章节编号,章节名,课程表)

(7)评论表 Comment(评论编号,评论内容,评论时间,用户表,课程表)

(8)留言表 Message(留言编号,留言内容,留言时间,状态,谁留言,给谁留言)

(9)评论表 Comment(评论编号,评论内容,评论时间,用户表,课程表)

(10)测试表 Test(测试编号,测试内容,选项 A,选项 B,选项 C,选项 D,答案,答案详情)

(11)视频表 Video(视频编号,视频标题,视频路径,上传时间,视频名称)

5.2 实体-关系模型

系统的实体-关系(Entity-Relationship,ER)模型[14],如图 5-1 和图 5-2 所示:

图 5-1 数据库概念结构图

图 5-2 数据库物理结构图

5.3 数据字典

系统的数据字典如表 5-1 到表 5-7 所示:

表 5-1 用户表(User)

名称代码数据类型长度主键外键
用户 IDuserIdNumber255TRUEFALSE
用户名userNameVarchar2255FALSEFALSE
密码PasswordVarchar2255FALSEFALSE
性别SexVarchar2255FALSEFALSE
邮箱emailVarchar2255FALSEFALSE
地址addressVarchar2255FALSEFALSE
电话phoneVarchar2255FALSEFALSE
职业VocationVarchar2255FALSEFALSE
状态StatusVarchar2255FALSEFALSE
简介introVarchar2255FALSEFALSE
学校schoolVarchar2255FALSEFALSE

表 5-2 管理员表(Admin)

名称代码数据类型长度主键外键
管理员 IDadminIdNumber10TRUEFALSE
用户 IDuserIdNumber10FALSETRUE

表 5-3 教师表(Teacher)

名称代码数据类型长度主键外键
教师 IDteacherIdNumber10TRUEFALSE
教师单位unitVarchar2255FALSEFALSE
用户 IDuserIdNumber10FALSETRUE

表 5-4 课程表(Course)

名称代码数据类型长度主键外键
课程 IDcourseIdNumber10TRUEFALSE
课程名称courseNameVarchar2255FALSEFALSE
课程简介IntroVarchar2255FALSEFALSE
学时periodVarchar2255FALSEFALSE
状态StatusVarchar2255TRUEFALSE
分类classifyVarchar2255FALSEFALSE
上传时间uploadDateDateFALSEFALSE
备注RemarkVarchar2255FALSEFALSE
教师 IDteacherIdNumber10FALSETRUE

表 5-5 留言表(Message)

名称代码数据类型长度主键外键
留言 IDmessageIdNumber10TRUEFALSE
留言内容ContentVarchar2255FALSEFALSE
留言时间messageDateDateFALSEFALSE
状态StatusVarchar2255FALSEFALSE
谁留言fromWhoVarchar2255FALSEFALSE
给谁留言toWhoVarchar2255FALSEFALSE

表 5-6 章节表(Chapter)

名称代码数据类型长度主键外键
章节 IDchapterIdNumber10TRUEFALSE
章节名称chapterNameVarchar2255FALSEFALSE
课程 IDcourseIdNumber10FALSETRUE

表 5-7 视频表(Video)

名称代码数据类型长度主键外键
视频 IDvideoIdNumber10TRUEFALSE
视频标题titleVarchar2255FALSEFALSE
视频路径pathVarchar2255FALSEFALSE
视频类型uploadContentTypeVarchar2255FALSEFALSE
视频名称uploadFileNameVarchar2255FALSEFALSE
章节 IDchapterIdNumber10FALSETRUE

表 5-8 评论表(Comment)

名称代码数据类型长度主键外键
评论 IDcommentIdNumber10TRUEFALSE
评论内容ContentVarchar2255FALSEFALSE
评论时间commentDateDateFALSEFALSE
课程 IDcourseIdVarchar210FALSETRUE
用户 IDuserIdVarchar210FALSETRUE

表 5-9 课件表(Annex)

名称代码数据类型长度主键外键
课件 IdcourseIdNumber10TRUEFALSE
课件路径PathVarchar2255FALSEFALSE
课件类型uploadcontentTypeVarchar2255FALSEFALSE
课件名称uploadFileNameVarchar2255FALSEFALSE
课程 IdcourseIdNubmer10FALSETRUE

表 5-10 测试表(Test)

名称代码数据类型长度主键外键
测试 IdtestIdNumber10TRUEFALSE
题目testNameVarchar2255FALSEFALSE
选项 AitemAVarchar2255FALSEFALSE
选项 BitemBVarchar2255FALSEFALSE
选项 CItemCVarchar2255FALSEFALSE
选项 DitemDVarchar2255FALSEFALSE
答案AnswerVarchar2255FALSEFALSE
答案详情detailVarchar2255FALSEFALSE
课程 IdcourseIdNumber10FALSETRUE

5.4 对象-关系映射

对象-关系映射(Object-RelationMapping,ORM)[15]是说明对象与数据库的表映射关系,将 Java 系统中的对象自动映射到关系数据库中。Hibernate 提供了实现这种映射的模式,它使用映射元数据的方法来说明对象-关系的映射细节,使得 Hibernate 中间件能在任何一个 Java 应用的业务逻辑层和数据库层之间充当桥梁。如课程表的映射配置文件如下:

<hibernate-mapping>
    <class name="com.jmu.video.entity.Course" table="T_COURSE">
        <id name="courseId" type="java.lang.Integer">
            <column name="COURSEID" />
            <generator class="increment" />
        </id>
        <property name="courseName" type="java.lang.String">
            <column name="COURSENAME" />
        </property>
        <property name="intro" type="java.lang.String">
            <column name="INTRO" />
        </property>
        <property name="period" type="java.lang.String">
            <column name="PERIOD" />
        </property>
        <property name="status" type="java.lang.String">
            <column name="STATUS" />
        </property>
        <property name="classify" type="java.lang.String">
            <column name="CLASSIFY" />
        </property>
        <property name="uploadDate" type="java.util.Date">
            <column name="UPLOADDATE" />
        </property>
        <property name="remark" type="java.lang.String">
            <column name="REMARK" />
        </property>
        <many-to-one name="teacher" class="com.jmu.video.entity.Teacher">
            <column name="TEACHERID" />
        </many-to-one>
    </class>
</hibernate-mapping>

Class 指定对应实体类的全类名,Table 指定实体类对应数据库表的表名,id 指定实体和数据库中的主键,column 对应数据库表的列,generator 说明了主健的生成策略,property 对应其他普通的列,many-to-one 对应表与表的关联,如 Course 表与 Teacher 表关联。

第 6 章系统实现

6.1 系统代码

(1)Spring 管理的配置文件(部分)

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	<bean id="loginAction" class="com.jmu.video.action.LoginAction" scope="prototype">
		<property name="userService" ref="userService"></property>
	</bean>
	<bean id="userAction" class="com.jmu.video.action.UserAction" scope="prototype">
		<property name="userService" ref="userService"></property>
	</bean>

	<!-- 配置业务层的类 -->
	<bean id="userService" class="com.jmu.video.service.impl.UserServiceImpl">
		<property name="userDao" ref="userDao"></property>
	</bean>
	<bean id="courseService" class="com.jmu.video.service.impl.CourseServiceImpl">
		<property name="courseDao" ref="courseDao"></property>
	</bean>
	
	<!-- 配置dao的类 -->
	<bean id="userDao" class="com.jmu.video.dao.UserDao">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<bean id="courseDao" class="com.jmu.video.dao.CourseDao">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

	<!-- 引入外部的属性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties" />

	<!-- 配置连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

	<!-- 配置Hibernate的相关属性,需要spring-orm.jar包 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

		<!-- 注入连接池 -->
		<property name="dataSource" ref="dataSource"></property>

		<!-- 配置Hibernate的属性,配置hibernate 的基本信息 -->
		<property name="hibernateProperties">
			<props>
				<!-- hibernate 所使用的数据库方言 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<!-- 执行操作时是否在控制台打印SQL -->
				<prop key="hibernate.show_sql">true</prop>
				<!-- 是否对SQL 进行格式化 -->
				<prop key="hibernate.format_sql">true</prop>
				<!-- 指定自动生成数据表的策略。update:数据库中有该表就使用,没表就创建 -->
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>

		<!-- 加载Hibernate中的映射文件 -->
		<property name="mappingResources">
			<list>
				<!-- .hbm.xml的全路径,包名用"/"隔开而不是用"." -->
				<value>com/jmu/video/entity/User.hbm.xml</value>
			</list>
		</property>
	</bean>

	<!-- 配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

	<!-- 开启注解事务 -->
	<tx:annotation-driven transaction-manager="transactionManager" />

	<!-- 配置事务的传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="modify*" propagation="REQUIRED" />
			<tx:method name="save*" rollback-for="Exception" propagation="REQUIRED" />
			<tx:method name="*" read-only="false" />
		</tx:attributes>
	</tx:advice>
	
</beans>

(2)Struts2 配置文件(部分)

<?xml version="1.0" encoding="UTF-8" ?>

<struts>
	<!-- 添加上传文件错误提示的国际化资源 -->
	<constant name="struts.custom.i18n.resources" value="app"></constant>
	<!-- 设置项目允许上传最大的文件 -->
	<constant name="struts.multipart.maxSize" value="900000000"/>

	<package name="default" namespace="/" extends="struts-default">
		<!-- 首页的action,加载所有课程 -->
		<action name="index" class="indexAction" method="execute">
			<result name="index">/WEB-INF/pages/index.jsp</result>
			<result name="success">/WEB-INF/pages/index.jsp</result>
			<result name="input">/WEB-INF/pages/index.jsp</result>
		</action>			
			
			<!-- 文件下载 -->
			<param name="inputPath">/annex</param>
			<result name="success" type="stream">
				<param name="contentType">application/ectet-stream</param>
				<param name="inputName">targetFile</param>		
				<!-- 以附件的形式下载 -->		
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<param name="bufferSize">1024</param>
			</result>
			<result name="input">/WEB-INF/pages/register.jsp</result>
		</action>

		<action name="loginAction" class="loginAction" method="execute">
			<result name="success" type="chain">index</result>
			<result name="fail">/WEB-INF/pages/fail.jsp</result>
			<result name="input">/WEB-INF/pages/register.jsp</result>
		</action>
		
		<action name="registerAction" class="registerAction" method="execute">
			<result name="success" type="chain">index</result>
			<result name="input">/WEB-INF/pages/register.jsp</result>
		</action>
		
		<action name="user_*" class="userAction" method="{1}">
			<result name="student">/WEB-INF/pages/student.jsp</result>
			<result name="teacher">/WEB-INF/pages/teacher.jsp</result>
			<result name="admin">/WEB-INF/pages/admin.jsp</result>
			<result name="success" type="chain">index</result>
			<result name="updateTeacherSuccess">/WEB-INF/pages/teacher.jsp</result>
			<result name="updateAdminSuccess">/WEB-INF/pages/admin.jsp</result>
			<result name="updateStudentSuccess">/WEB-INF/pages/student.jsp</result>
			<result name="input" type="chain">index</result>
		</action>
		
		<action name="course_*" class="courseAction" method="{1}">
			<result name="success">/WEB-INF/pages/index.jsp</result>
			<result name="input">/WEB-INF/pages/index.jsp</result>
			<result name="courseScanSuccess">/WEB-INF/pages/courseScan.jsp</result>
			<result name="classify">/WEB-INF/pages/classify.jsp</result>
			<result name="videoPlay">/WEB-INF/pages/videoPlay.jsp</result>
			<result name="input" type="chain">index</result>
		</action>
		
		<!-- 视频上传 -->
		<action name="upload" class="courseAction" method="upload">
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">video/mp4,image/png,image/gif,image/jpeg</param>
				<!-- 允许上传500M -->
				<param name ="maximumSize">1024*1024*500</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<param name="savePath">/video</param>
			<result name="uploadSuccess">/WEB-INF/pages/teacher.jsp</result>
			<result name="uploadFail">/WEB-INF/pages/error.jsp</result>
			<result name="input">/WEB-INF/pages/teacher.jsp</result>
		</action>
		<!-- 课件上传 -->
		<action name="uploadAnnex" class="annexAction" method="uploadAnnex">
			<interceptor-ref name="fileUpload">
				<!-- <param name="allowedTypes">video/mp4</param> -->
				<param name="allowedExtensions">  
				    png,bmp,jpg,doc,xls,ppt,zip,rar  
				</param>  
				<!-- 允许上传500M -->
				<param name ="maximumSize">1024*1024*500</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<param name="savePath">/annex</param>
			<result name="uploadSuccess">/WEB-INF/pages/teacher.jsp</result>
			<result name="uploadFail" type="chain">course_findAllCourses</result>
			<result name="input" type="chain">course_findAllCourses</result>
		</action>
		
		<!-- 页面跳转 -->
		<action name="*">
			<result>/WEB-INF/pages/{1}.jsp</result>
		</action>

		<!-- 验证码 -->
		<action name="createImageAction" class="com.jmu.video.action.CreateImageAction"
			method="execute">
			<result name="success" type="stream">
				<param name="contentType">image/jpeg</param>
				<param name="inputName">inputStream</param>
			</result>
		</action>
	</package>
</struts>

(3)课程 Action 的部分代码

ActionContext context = ActionContext.getContext();
	Map<String, Object> session = context.getSession();
	Map<String, Object> request = (Map<String, Object>) context.get("request");
	
	Teacher teacher = (Teacher) session.get("teacher");
	
	public String videoPlay(){
		HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
		String videoId = httpServletRequest.getParameter("videoId");
		Video v = courseService.findVideoById(new Integer(videoId));
		request.put("video", v);
		return "videoPlay";
	}
	
	/**
	 * 添加课程
	 * @return
	 */
	public String addCourse(){
		findCourse = courseService.findCourseByName(course.getCourseName());
		if(findCourse != null){
			System.out.println("已存在该课程!");
			return "addCourse";
		}else {
			int CourseId = courseService.addCourse(course, teacher);
		}
		return "addCourseSuccess";
	}
	
	/**
	 * 根据教师的ID查找该教师的所有课程
	 * @return List<Course>
	 */
	public String findAllCoursesByTeacherId(){
		List<Course> courses = courseService.findAllCoursesByTeacherId(teacher.getTeacherId());
		request.put("courses", courses);
		return "findAllCoursesByTeacherIdSuccess";
	}

6.2 系统截图

系统截图见图6-1到图6-7。

图 6-1 教学平台首页图

图 6-2 课程章节详情图

图 6-3 课程评论图

图 6-4 课程测试图

图 6-5 教师信息图

图 6-6 教师所有课程图

图 6-7 管理员管理教师课程图

结论

刚开始设计这个系统的时候,因为花在设计上的时间过少而直接写代码,导致后期出来很多不合理的问题。表结构的不合理,不仅仅影响进度,更重要的是影响自己思考的思路。最后不得不重新从头开始重新思考重新设计,合理的设计带来的效益是比较高的。

在实践中发现和解决问题。本次毕业设计遇到很多问题,刚开始时主要集中在框架上,后期主要集中在业务逻辑上。对框架的不熟悉,所以前期花了较多的时间去学习框架和处理框架的问题;后期更多的问题是业务逻辑的问题,思考不够全面,这些问题耐心花点时间调度就慢慢可以解决。

及时沟通。遇到问题想一两天都想不通时,最好的办法是去和别人沟通。在设计留言表结构的时候,要考虑的到回复时表的设计。自己想了很久都没想通怎么设计更合理,最后请教一个同学,问题很快就解决了。从这也学会了遇到问题先自己思考,自己想不通的时候要及时沟通,不然不仅问题没有解决,也会使自己一直陷入痛苦当中。

这次的毕业设计,不仅是学会了怎么去设计实现一个系统,还学会了遇到问题如何去解决,如何去查资料,如何去安排项目进度才更合理。

♻️ 资源

在这里插入图片描述

大小: 141MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87379038