基于 Java 和 MySQL 的精品课程网站设计与实现
一、 毕业设计(论文)任务书
摘要:近年来,教育信息化发展十分迅猛,人们的教育观念、教育手段、学习方法、学习渠道等等都发生了重大的变化。知识性人才也已经日益成为了一个国家繁荣昌盛和民族伟大振兴的决定性因素和强大资源后盾。
远程教育这一基于日益发达的计算机技术和早已大规模普及的通讯技术的现代教育方式,正以其自身强大优势,成为现代教育的一个亮点和重点。在传统的教育教学模式中,授课老师通过面授,直接进行教学活动,学生只能在课堂上学习知识。然而教学活动不仅受到了时间的限制同时也受到了空间束缚,师生之间不能及时的进行交流、问题得不到及时的解决,甚至还存在教育资源紧缺不能共享等问题。得益于信息技术的支持与发展及问题急于解决的紧迫性,在线学习类系统的开发与实现成为了必要趋势。
基于与 Java 和 MySQL 的精品课程网站以 JSP、Servlet 和 Java Bean 为基础,采用 MySQL 数据库及 Tomcat 服务器技术进行网站设计和开发。首先对相关的 Java Web 成功案例进行学习,再根据师生的使用需求,对精品课程网进行详细的系统需求分析,然后根据分析结果设计功能、处理逻辑、编写模块代码。
经过多次分析及测试,最终表明基于与 Java 和 MySQL 的精品课程网站可稳定运行,符合师生的使用需求,且用户体验良好,具有一定的价值效益。
关键词:Java Web 课程网 在线学习
二、前言
背景
人类自从进入 21 世纪,科学技术飞速发展,知识经济初见端倪。一个国家综合国力的竞争更主要地体现在了国民素质和人才资源上,而人才的培养,关键在于教育。当下的社会将对劳动者们有着前所未有的高要求,这讲使得教育目标发生了本质上的变化。终身学习和继续教育成为了社会生活中必不可少的需求。在任何时间任何地点都可以接受所需的教育是未来教育的根本目标。
在市场日益繁荣,经济文化空前发展的今天,现有的教育模式根本无法满足人们教育学习的需求。因此,培养现代化建设的高素质人才,使有限的教育资源得到充分合理利用的任务刻不容缓。
在这种现状下,我国迫切需要采取某种技术手段,充分利用各种资源,增强教育普及、缩小城乡差距,培育现代化创新性人才,从而构建一个终身学习的体系。
国内外研究概况及发展趋势
在国外,网络教学的发展较国内更加迅速,除了普及广泛外,已经向更高层次的应用和标准化方面发展。信息化的网络教学和学习方式已经成为了一种趋势,并即将成为教学教育活动的主流。
以美国为例,美国是目前通过网络进行教育规模最大的国家。近年来,美国高校通过网络进行远程教育,课程建设快速发展,达到了十多万种。其中本科课程 3.5 万种,研究生课程 1.4 万种,非学历学位课程包括各种知识普及课程 6 万多种。所有的教学活动和教育管理都是通过网络教学技术实现的,网络教学技术几乎成为了广大学员获取知识和相关技能的主要途径。
在国内,关于教学信息化我国已有一些网络教学平台,如:软酷网、尔雅课程网、网易公开课等,它们都为我们提供了良好的学习平台。如今,网络已基本普及到全国各大中小城市,而网络教育资源仍不是很丰富,因此在未来,我国的网上教育平台的建设将有很大的前景。要提高我国网络教学水平,必须注重网络教育的教学设计,提供更多在线教育平台,加强适应个性化教学,加强资源库的标准化建设。
研究意义
由于现有教学资源的复杂多样,各种不同属性教学资源纷繁复杂,不易于管理与利用。为了更加有效地建设教学资源库,使得各项教育资源可以得到充分的利用和有效地管理,增强师生之间的交流,提高学生的自我学习能力,在线教育系统的探索与研究十分必要。
基于 Java 和 MySQL 的精品课程网站,其主要目的是为了提供一个全新的学习、教育、交流平台。它服务于不同层次的需求者和使用者。用户可反复观看视频进行深入学习;学生可以通过登录网站进行相应课程的学习,可以在线进行测试,且能立即查看分数与错题,及时复习并提高学习效率,还可以在网上进行留言提问,跟大家一起交流。教师可以让同学们直接在网上提交作业,还可以通过该平台直接获取作业的提交情况。
这样的网站为教师教学、学生自学及普通浏览的游客提供了优质、高效的服务。在提高教育质量、扩大教育规模、缓解教育资源紧张等方面存在重大意义。
可行性分析
基于 Java 和 MySQL 的精品课程网站,使用上满足了教育资源共享、在线测试、在线提交作业等各项需求,实现了教师和学生之间的信息交流;管理上,管理员可发布公告方便于让登入网站的用户及时了解到公布的重要信息,也可以对用户帐号进行相应管理,操作简单便于维护;技术上,使用 JSP、servlet、AJAX、jstl、jQuery 等开源技术进行实现,资料丰富,编写相对简单。
需求分析
功能分析
在传统的学习过程中很都学生都反应枯燥无味,课堂上学习的知识很快就会忘记,问题也得不到及时的解决。同学们总是推迟提交作业,学生越多老师越难统计作业提交情况。因此,基于 Java 和 MySQL 的精品课程网站应帮助用户提高学习兴趣,实现高效率的教育教学。
综上所述,为满足所需人群的要求,可将角色分为普通游客、学生、教师、管理员四种,不同的角色有不同的使用权限。普通游客只能浏览网站中的视频,学生用户则还可以在此平台进行测试、下载资料、留言讨论、提交作业等,教师用户可在线出题、上传资料等,管理员可以对用户进行管理,也可以发布公告。
模块分析
- 用户注册模块:普通游客只能浏览首页或进入课程中心观看视,但可通过此功能注册成为本站的学生用户,获得更多使用权限。
- 用户登录模块:登录用户可进入其他内置页面,通过判断角色来显示相应的功能。管理员登录与其他用户登录页面分开。
- 在线测试模块:只有学生用户可进入,实现试卷查询(根据试卷关键字查询试卷)、生成试卷(题库中随机抽取题目自动生成试卷)、试题批改(提交答案后显示相应分数)等功能。
- 师生互动模块:实现主题查询(根据主题关键字查询留言)、科目查询(根据科目类型查询留言)、创建留言、回复留言等功能。
- 今日作业模块:学生用户进入模块,实现作业查询(根据科目及作业布置日期查询提交过的作业)、作业下载(下载之前已提交过的作业)、提交作业(选择完科目、任课教师、布置日期信息后上传作业文档)等功能。教师用户进入模块,显示最近一次布置日期的作业提交情况(展示科目、提交人数、未提交人姓名),可根据科目及具体布置日期查询详细作业提交情况,可下载相应的作业。
- 资料下载模块:学生用户进入模块,实现资料查询(根据关键词查询相应资料)、资料下载等功能。教师用户进入模块,实现资料查询、资料下载、我的上传(显示本人已上传文件列表,可进行删除或下载操作)、上传文件等功能。
- 在线出题模块:只有教师用户可进入,实现题目查询(根据关键字查询自己所出的题目)、题目修改、题目删除、题目添加功能。
- 用户管理模块:只有管理员用户可进入,实现查询用户(根据用户名查询)、冻结用户、初始化密码、添加教师用户等功能。
- 公告管理模块:只有管理员用户可进入,实现发布公告、查询公告、删除公告等功能。
概要设计
结构模块图描述
数据库结构设计
- 关系模型
- 用户表(用户 id、帐号、密码、姓名、科目、学校、角色、删除标识、注册时间)
- 题目表(题目 id、科目、题目标题、选项 A、选项 B、选项 C、选项 D、正确答案、困难度、更新时间、用户 id)
- 用户答案表(答案 id、用户 id、试卷 id、用户答案、创建时间)
- 试卷表(试卷 id、试卷题目、题目答案、用户 id、科目、困难度、创建时间)
- 作业表(作业 id、科目、布置时间、提交时间、用户 id、接受人姓名、作业文件名字)
- 留言表(留言 id、留言主题、科目、内容、用户 id、创建时间)
- 回复表(回复 id、留言 id、用户 id、回复内容、回复时间)
- 上传表(上传 id、用户 id、科目、标题、大小、存储路径、上传时间、文件后缀、删除标记)
数据字典
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
u_id | int | 11 | N | 用户 id,主键自增 | |
username | varchar | 20 | Y | NULL | 帐号 |
password | varcahr | 20 | Y | NULL | 密码 |
name | varchar | 20 | Y | NULL | 姓名 |
subject | varchar | 30 | Y | NULL | 科目 |
school | varchar | 30 | Y | NULL | 学校 |
role | int | 11 | Y | NULL | 角色 管理员:1 教师:2;学生:3 |
del | int | 2 | Y | 1 | 删除标识 冻结:0 正常:1 |
create_time | varchar | 20 | Y | NULL | 注册时间 |
表 3-2-1 用户表(user)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
t_id | int | 11 | N | 题目 id,主键自增 | |
subject | varchar | 30 | Y | NULL | 科目 |
title | varcahr | 500 | Y | NULL | 题目标题 |
optiona | varchar | 200 | Y | NULL | 选项 a |
optionb | varchar | 200 | Y | NULL | 选项 b |
optionc | varchar | 200 | Y | NULL | 选项 c |
optiond | varchar | 200 | Y | NULL | 选项 d |
answer | varchar | 10 | Y | NULL | 正确答案 |
difficulty | varchar | 10 | Y | NULL | 困难度 |
update_time | varchar | 20 | Y | NULL | 更新时间 |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
表 3-2-2 题目表(topic)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
upload_id | int | 11 | N | 上传 id,主键自增 | |
u_id | int | 11 | N | NULL | 用户 id,对应用户表(user) |
subject | varchar | 30 | Y | NULL | 资料相关科目 |
title | varchar | 100 | Y | NULL | 资料标题 |
size | varchar | 10 | Y | NULL | 文件大小 |
path | varchar | 200 | Y | NULL | 文件存储路径 |
upload_time | varchar | 20 | Y | NULL | 上传时间 |
ext | varchar | 5 | Y | NULL | 文件后缀 |
del | int | 2 | Y | 1 | 删除标记 正常:1 删除:0 |
表 3-2-3 上传表(upload)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
test_id | varchar | 100 | N | 试卷 id,主键自增 | |
alltopic | varchar | 100 | Y | NULL | 该试卷的全部题目 |
allanswer | varcahr | 100 | Y | NULL | 该试卷全部题目的答案 |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
subject | varchar | 30 | Y | NULL | 科目 |
difficulty | varchar | 10 | Y | NULL | 困难度 |
create_time | varchar | 20 | Y | NULL | 创建时间 |
表 3-2-4 试卷表(test)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
h_id | int | 11 | N | 作业 id,主键自增 | |
subject | varchar | 30 | Y | NULL | 科目 |
give_time | varcahr | 20 | Y | NULL | 作业布置时间 |
submit_time | varchar | 20 | Y | NULL | 提交时间 |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
consignee | varchar | 20 | Y | NULL | 接收人姓名 |
filename | varchar | 100 | Y | NULL | 作业存储后的名字 |
表 3-2-5 作业表(homework)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
a_id | int | 11 | N | 答案 id,主键自增 | |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
test_id | varcahr | 100 | Y | NULL | 试卷 id,对应试卷表(test) |
myanswer | varchar | 100 | Y | NULL | 用户的答案 |
create_time | varchar | 200 | Y | NULL | 创建时间 |
表 3-2-6 用户答案表(answer)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
bbs_id | int | 11 | N | 留言 id,主键自增 | |
title | varchar | 100 | Y | NULL | 留言主题 |
subject | varcahr | 30 | Y | NULL | 科目 |
content | varchar | 2000 | Y | NULL | 内容 |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
create_time | varchar | 20 | Y | NULL | 创建时间 |
表 3-2-7 留言表(bbs)
字段名称 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
reply_id | int | 11 | N | 回复 id,主键自增 | |
bbs_id | int | 11 | Y | NULL | 留言 id,对应留言表(bbs) |
u_id | int | 11 | Y | NULL | 用户 id,对应用户表(user) |
content | varchar | 500 | Y | NULL | 回复内容 |
create_time | varchar | 20 | Y | NULL | 回复时间 |
表 3-2-8 回复表(reply)
模块流程图
登录与注册
题目管理
师生互动
在线测试
我的上传
收取作业
详细设计
任务概述
基于 Java 和 MySQL 的精品课程网站设计与实现由两位同学共同完成。程序的实现主要可分为数据库设计、前端页面设计、后台模块数据提取、前后台数据交互四个部分。其中数据库设计及前后台数据交互由两人共同讨论完成,本人则主要负责后台代码块的实现,从数据库中提取所需数据。
开发环境
- 操作系统:Windows 7
- 开发平台:MyEclipse10
- 数据库:MySQL
- Java Web 服务器:apache-tomcat-6.0.29
- Java 语言的软件开发工具包:jdk1.7.0_45
代码模式结构
业务逻辑层(biz)
类名 | 描述 |
IBbsBiz | 留言业务逻辑接口类 |
IHomeWorkBiz | 作业业务逻辑接口类 |
IPostBiz | 公告业务逻辑接口类 |
ITestBiz | 试卷业务逻辑接口类 |
ITopicBiz | 试题业务逻辑接口类 |
IUpDownBiz | 上传下载业务逻辑接口类 |
IUserBiz | 用户业务逻辑接口类 |
impl | 包(用来存储对应的业务逻辑实现类) |
- IBbsBiz(留言业务逻辑接口类):
创建新帖:
public boolean createBbs(String title, String subject, String content, int u_id) ;
查询单条留言内容:
public Bbs selDanBbs(int bbs_id);
添加回复:
public boolean addReply( int u_id,int bbs_id,String content);
查询多条留言:
public List<Bbs> selBbs(String sql);
查询留言下所有回复:
public List<Reply> selReply(int bbs_id);
查询留言个数:
public int countBbs(String sql);
- IHomeWorkBiz(作业业务逻辑接口类):
查询作业列表:
public List<HomeWork> selHomeWork(String sql);
提交作业:
public boolean addHomeWork(String subject, String give_time, int u_id,String consignee, String filename);
提交作业人数:
public int countCollect(String sql);
未提交人列表:
public List<User> weiUsers(String sql);
- IPostBiz(公告业务逻辑接口类):
发布公告:
public boolean fbPost(String title, String content);
删除公告:
public boolean delPost(int post_id);
查询公告列表:
public List<Post> selPost(String sql);
查询单个公告详情:
public Post selPost(int post_id);
- ITestBiz(试卷业务逻辑接口类):
查询试卷科目:
public List<Topic> selTopic(String sql);
生成试卷,存入试卷表:
public boolean createTest( String test_id,int u_id,List<Topic> topicLists);
将我的答案插入答案表:
public boolean addAnswer( String test_id,String myanswer,int u_id);
查找单个试卷对象:
public Test selDanTest(String sql);
- ITopicBiz(公告业务逻辑接口类):
添加题目:
public boolean addTopic(String subject, String title, String optiona,String optionb, String optionc, String optiond, String answer,String difficulty, int u_id);
删除题目:
public boolean delTopic(int t_id);
修改题目:
public boolean updateTopic(int t_id, String subject, String title,String optiona, String optionb, String optionc, String optiond,String answer, String difficulty) ;
根据题目关键字,查询题目:
public List<Topic> selTopic(String sql,String title) ;
查询所有题目:
public List<Topic> selTopic(String sql,int u_id,int pageIndex,int pageSize);
查询题目个数:
public int countTopic(String sql) ;
按查询单个题目:
public Topic selOneTopic(String sql,int t_id);
- IUpDownBiz(上传下载业务逻辑接口类):
上传文件:
public boolean upFile(String subject, String title, String path,String ext, int u_id, String size) ;
查询所有文件:
public List<Upload> selUpload(String sql) ;
删除文件:
public boolean delUpload(int upload_id);
查询文件个数:
public int countUpload(String sql);
- IUserBiz(用户业务逻辑接口类):
用户注册:
public boolean register(String userName, String password, String name,String school);
根据帐号密码查询用户,返回用户(判断登录):
public User login(String sql);
添加教师用户:
public boolean addTeacher(String username, String password, String name,String school, String subject);
根据查询单个用户:
public User selUser(String sql);
冻结用户:
public boolean delUser(String userName, int d);
初始化密码:
public boolean cshPassword(String userName);
查询帐号是否已存在:
public boolean cxzh(String userName);
修改密码:
public boolean updatepsw(String userName, String yuan,String xinpsw);
数据访问层(dao)
类名 | 描述 |
IBbsDao | 留言数据访问接口类 |
IHomeWorkDao | 作业数据访问接口类 |
IPostDao | 公告数据访问接口类 |
ITestDao | 试卷数据访问接口类 |
ITopicDao | 试题数据访问接口类 |
IUpDownDao | 上传下载数据访问接口类 |
IUserDao | 用户数据访问接口类 |
impl | 包(用来存储对应的数据访问实现类) |
数据实体层(model)
类名 | 描述 |
Answer | 答案实体类 |
Bbs | 留言实体类 |
HomeWork | 作业实体类 |
Post | 公告实体类 |
Reply | 回复实体类 |
Test | 试卷实体类 |
Topic | 试题实体类 |
Upload | 上传文件实体类 |
User | 用户实体类 |
控制层(servlet)
类名 | 描述 |
BbsServlet | 师生互动模块逻辑控制 |
CollectWorkServlet | 收集作业模块逻辑控制 |
HomeWorkServlet | 今日作业模块逻辑控制 |
LoginServlet | 登录注册模块逻辑控制 |
PostServlet | 公告管理模块逻辑控制 |
TestServlet | 在线测试模块逻辑控制 |
TopicServlet | 在线出题模块逻辑控制 |
UploadServlet | 上传下载模块逻辑控制 |
UserServlet | 用户管理模块逻辑控制 |
过滤器(filter)
类名 | 描述 |
BackFilter | 后台管理页面过滤 |
LoginFilter | 精品课程网页面过滤 |
工具包(util)
类名 | 描述 |
DBUtils | 数据库操作工具类 |
DownFile | 下载文件方法类 |
获得连接:
public static Connection getConn();
关闭链接释放资源:
private static void close(ResultSet rs, PreparedStatement pst,Connection conn);
增删改:
public static int update(String sql, Object... objs);
查询结果为一条:
public static <T> T query(String sql,Class<T> t,Object...objs);
查询一个字段的数据:
public static Object selOne(String sql,Object...objs);
查询数量:
public static int count(String sql,Object...objs);
查询结果为多条:
public static <T> List<T> queryList(String sql,Class<T>t,Object...objs);
resultset 转换 MAP:
private static Map<String,Object> rsToMap(ResultSet rs);
把 Map 转化为 bean 对象:
private static <T> T mapToBean(Class<T> t,Map<String,Object> map);
模块功能的实现
登录与注册
- 用户注册:
String userName=request.getParameter("userName");
String school=request.getParameter("school");
String name=request.getParameter("name");
String password=request.getParameter("psd");
if(ub.register(userName, password, name, school)) {u.setUserName(userName);setPassword(password);setSchool(school);setName(name);setRole(3);session.setAttribute("user", u);//把名字存入sessionresponse.sendRedirect("/course/index.jsp");
}
- 用户登录:
int role=Integer.parseInt(request.getParameter("role"));
String userName=request.getParameter("userName");
String password=request.getParameter("password");
if(role==1) { //管理员登录String sql="select * from user where userName='"+userName+"' and password='"+password+"' and role=1";=ub.login(sql);//查找用户,返回用户信息if(u!=null) { //存在此用户session.setAttribute("user", u);//用户信息存于session}response.sendRedirect("/course/backindex.jsp");
} else { //不是管理员String sql="select * from user where userName='"+userName+"' and password='"+password+"' and role!=1 and del=1";=ub.login(sql);//查找用户,返回用户信息if(u!=null) { //存在此用户session.setAttribute("user", u);//用户信息存于session}response.sendRedirect("/course/index.jsp");
}
- 检测帐号:
if("zh".equals(p)) { //检测帐号是否可用String userName=request.getParameter("userName");if(ub.cxzh(userName)) { //帐号可用out.print(1);} else {out.print(0);}out.flush();out.close();
} else if("cslogin".equals(p)) { //超时后登录String userName=request.getParameter("userName");String password=request.getParameter("password");String sql="select * from user where userName='"+userName+"' and password ='"+password+"'";u=ub.login(sql);if(u!=null) {session.setAttribute("user", u);//用户信息存于session}out.flush();out.close();
}
在线出题
- 添加与修改题目:
if ("add".equals(type)||"update".equals(type)) {String subject = request.getParameter("subject");String title = request.getParameter("title");String optiona = request.getParameter("optiona");String optionb = request.getParameter("optionb");String optionc = request.getParameter("optionc");String optiond = request.getParameter("optiond");String answer = request.getParameter("answer");String difficulty = request.getParameter("difficulty");if("add".equals(type)) {if (tb.addTopic(subject, title, optiona, optionb, optionc, optiond,answer, difficulty, u_id)) {// 添加成功out.print(1);} else {out.print(0);}} else {int t_id=Integer.parseInt(request.getParameter("id"));System.out.println(t_id);if (tb.updateTopic(t_id, subject, title, optiona, optionb, optionc, optiond, answer, difficulty)) {// 修改成功out.print(1);} else {out.print(0);}}out.flush();out.close();
}
- 按条件搜索与删除题目:
if("search".equals(type)) {int pageIndex=Integer.parseInt(request.getParameter("index"));int pageSize=10;//一页5条String searchTitle = request.getParameter("searchTitle");String title = new String(searchTitle.getBytes("iso8859-1"), "utf-8");String sql="select * from topic where title like ?";List<Topic> topicLists=tb.selTopic(sql,"%"+title+"%");sql="select count(1) from topic where title like '%"+title+"%'";int length=tb.countTopic(sql);//总共多少条int count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("topicLists", topicLists);request.setAttribute("count", coun);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/topicmanager.jsp?type=search&title ="+searchTitle).forward(request, response);
} else if("clickUpdate".equals(type)) { //点击修改int t_id=Integer.parseInt(request.getParameter("id"));String sql="select * from topic where t_id=?";Topic topic=tb.selOneTopic(sql,t_id);request.setAttribute("topic",topic);request.getRequestDispatcher("/jsp/addtopic.jsp?type=update").forward (request, response);
} else if("lie".equals(type)) {int pageIndex=Integer.parseInt(request.getParameter("index"));String sql="select * from topic where u_id=? limit ?,?";int pageSize=10;//一页5条List<Topic> topicLists=tb.selTopic(sql,u_id,(pageIndex-1)*pageSize,pageSize);System.out.println(topicLists);sql="select count(1) from topic where u_id="+u_id;int length=tb.countTopic(sql);//总共多少条int count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("topicLists", topicLists);request.setAttribute("count", count);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/topicmanager.jsp?type=lie").forward(request, response);
} else if("del".equals(type)) {int t_id=Integer.parseInt(request.getParameter("id"));if(tb.delTopic(t_id)) {out.print(1);} else {out.print(0);}out.flush();out.close();
}
}
在线测试
- 随机产生 10 道题目生产试卷:
String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");
int nd=Integer.parseInt(request.getParameter("nd"));
Map<Integer,String> map=new HashMap<Integer, String>();
map.put(1, "简单");
map.put(2, "一般");
map.put(3, "困难");
Map<Integer,String> map2=new HashMap<Integer, String>();
map2.put(1, "基础题");
map2.put(2, "练习题");
map2.put(3, "竞赛题");
request.setAttribute("testTop", subject+map2.get(nd));// 试卷标题
sql="select * from topic where subject ='"+subject+"' and difficulty='"+map.get(nd)+"'";
List<Topic> allTopics=tb.selTopic(sql);//查询所有符合的题目
System.out.println(allTopics);
List<Topic> topicLists=new ArrayList<Topic>();
//随机产生题目
int sj=allTopics.size();
if(sj>10) { //如果题目足够int index=0;boolean flag=true;do {index=(int)(Math.random()*sj-1);//随机产生一个数Topic t=allTopics.get(index);//拿到相应的对象if(topicLists.size()<1) { //才产生一个随机对象topicLists.add(t);//把随机产生的这个对象放入集合中} else {for(int i=0; i<topicLists.size(); i++) { //循环所有题目int stid=topicLists.get(i).getT_id();if(t.getT_id()==stid) { //已存在此题flag=false;break;} else {flag=true;}}if(flag) {topicLists.add(t);//把随机产生的这个对象放入集合中}}} while(topicLists.size()!=10);//循环收取10个题目//把该试卷存入试卷表String test_id = UUID.randomUUID().toString();//生成唯一idtb.createTest(test_id, u_id,topicLists);request.setAttribute("test_id", test_id);
}
request.setAttribute("topicLists", topicLists);
request.getRequestDispatcher("/jsp/test.jsp").forward(request, response);
}
- 批改试卷(学生答案与正确答案相比较):
String myanswer=request.getParameter("myanswer");
String test_id=request.getParameter("test_id");
tb.addAnswer(test_id, myanswer, u_id);//将自己的答案存入答案表
sql="select * from test where test_id='"+test_id+"'";
Test test=tb.selDanTest(sql);
String myAnswerList[]=myanswer.split(",");
String rightAnswerList[]=test.getAllanswer().split(",");
//装错误了的题的答案,正确的赋值1
List<String> worryList=new ArrayList<String>();
for(int i=0; i<rightAnswerList.length; i++) {System.out.println(myAnswerList[i]+"----"+rightAnswerList[i]);if(myAnswerList[i].equals(rightAnswerList[i])) { //答案正确worryList.add("1");} else {worryList.add(rightAnswerList[i]);}
}
String json = JSONArray.fromObject(worryList).toString();
System.out.println(json);
out.write(json);
out.flush();
out.close();
}
资料下载
- 文件上传关键代码:
try {// 创建文件项工厂DiskFileItemFactory factory = new DiskFileItemFactory();// 创建解析请求数据的ServletFileUpload对象ServletFileUpload upload = new ServletFileUpload(factory);// 解析request请求把流装入到list中List<FileItem> list = upload.parseRequest(request);HashMap<String, String> map = new HashMap<String, String>();for (int i = 0; i < list.size(); i++) {// 把各个流装入到item中FileItem item = list.get(i);if (item.isFormField()) {// 判断当前fileitem是否是表单中的字段String key = item.getFieldName();map.put(key,new String(item.getString().getBytes("iso-8859-1"),"utf-8"));} else {// 当fileitem是文件流时// 文件后缀String filename = item.getName();ext =filename.substring(filename.lastIndexOf(".")+1);String newname= map.get("title")+"."+ext;String newpath = request.getRealPath("/upload") + "/" +newname;size=convertFileSize(item.getSize());item.write(new File(newpath));path = request.getContextPath()+"/upload/"+newname;}}//存储信息if(ub.upFile(map.get("subject"),map.get("title"),path,ext,u_id,size)) {request.getRequestDispatcher("/jsp/success.jsp").forward(request, response);}
} catch (Exception e) {printStackTrace();
}
}
- 文件大小格式换算:
public static String convertFileSize(long size) {
long kb = 1024;
long mb = kb * 1024;
long gb = mb * 1024;
if (size >= gb) {return String.format("%.1f GB", (float) size / gb);
} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
} elsereturn String.format("%d B", size);
}
师生互动
- 按条件查询讨论留言:
if("search".equals(type)) { //查询String countsql=null;int pageIndex=Integer.parseInt(request.getParameter("index"));//页面传来的页码int pageSize=5;//一页5条String p=request.getParameter("p");if("title".equals(p)) { //按主题查询String title = new String(request.getParameter("title").getBytes("iso8859-1"), "utf-8");sql="select b.*,u.name from bbs b,user u where title like '%"+title+"%' and u.u_id=b.u_id order by b.create_time desc limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1) from bbs where title like '%"+title+"%' " ;request.setAttribute("title", title);} else if("subject".equals(p)) { //按科目查询String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");sql="select b.*,u.name from bbs b,user u where b.subject like '%"+subject+"%' and u.u_id=b.u_id order by b.create_time desc limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1) from bbs where subject like '%"+subject+"%' " ;request.setAttribute("subject", subject);} else if("all".equals(p)) { //查询所有sql="select b.*,u.name from bbs b,user u where b.u_id=u.u_id order by b.create_time desc limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1) from bbs " ;}List<Bbs> bbsLists=bbiz.selBbs(sql);int length=bbiz.countBbs(countsql);//总条数request.setAttribute("bbsLists", bbsLists);int count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("count", count);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/bbs.jsp?p="+p).forward(request, response);
} else if("addbbs".equals(type)) {String subject =request.getParameter("subject");String title = request.getParameter("title");String content = request.getParameter("content");if(bbiz.createBbs(title, subject, content, u_id)) {out.print(1);}out.flush();out.close();
}
- 查询单个留言页面,添加留言:
if("dan".equals(type)) { //点击进入单个页面int bbs_id=Integer.parseInt(request.getParameter("id"));sql="select b.*,u.name from bbs b,user u where b.u_id=u.u_id and bbs_id="+bbs_id;Bbs bbs=bbiz.selDanBbs(bbs_id);request.setAttribute("bbs", bbs);List<Reply> replyLists=bbiz.selReply(bbs_id);request.setAttribute("replyLists", replyLists);request.getRequestDispatcher("/jsp/bbsdan.jsp").forward(request, response);
} else if("addreply".equals(type)) {String content = request.getParameter("content");int bbs_id=Integer.parseInt(request.getParameter("id"));if(bbiz.addReply(u_id, bbs_id, content)) {out.print(1);}out.flush();out.close();
}
}
我的作业
- 查询该用户所提交的作业:
if("all".equals(type)) {sql="select * from homework where u_id="+u_id+" order by submit_time desc";
} else if("search".equals(type)) {String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");String start_time=request.getParameter("start_time");String end_time=request.getParameter("end_time");sql="select * from homework where u_id="+u_id+" and subject ='"+subject+"' and give_time between '"+start_time+"' and '"+end_time+"' order by give_time desc ";
}
List<HomeWork> homeWorkList=hb.selHomeWork(sql);
request.setAttribute("homeWorkList", homeWorkList);
request.getRequestDispatcher("/jsp/tijiaohomework.jsp").forward(request, response);
}
收取作业
- 批量下载学生作业:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String subject=request.getParameter("subject");String give_time=request.getParameter("give_time");byte[] buffer = new byte[1024];String path=this.getServletConfig().getServletContext().getRealPath("/");// 生成的ZIP文件名String strZipName = "【"+subject+"】"+give_time+".zip";System.out.println(strZipName);ZipOutputStream out = new ZipOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\"+strZipName));//解决中文乱码问题String filenames=request.getParameter("filenames");System.out.println("filenames-------------"+filenames);String filename[]=filenames.split(",");// 需要同时下载的几个文件File[] file1 = new File[filename.length];for(int j=0; j<filename.length; j++) {file1[j]=new File(path+"//upload//"+filename[j]);}for (int i = 0; i < file1.length; i++){FileInputStream fis = new FileInputStream(file1[i]);out.putNextEntry(new ZipEntry(file1[i].getName()));int len;// 读入需要下载的文件的内容,打包到zip文件while ((len = fis.read(buffer)) > 0){out.write(buffer, 0, len);}out.closeEntry();fis.close();}out.flush();out.close();System.out.println("生成.zip成功");
}
用户管理
- 查询用户:
if("search".equals(type)) {String userName=request.getParameter("userName");System.out.println(userName);String sql="select * from user where userName='"+userName+"'";User seluser=ub.selUser(sql);request.setAttribute("seluser", seluser);request.getRequestDispatcher("/backstage/usermanager.jsp").forward(r equest, response);
}
}
- 冻结与初始化密码:
if("del".equals(type)||"csh".equals(type)) {String userName=request.getParameter("userName");if("del".equals(type)) {int d=Integer.parseInt(request.getParameter("d"));//解冻:1 冻结 0if(ub.delUser(userName,d))out.print(1);} else if("csh".equals(type)) {if(ub.cshPassword(userName))out.print(1);}out.flush();out.close();
}
- 增加教师用户:
if("add".equals(type)) {String userName=request.getParameter("userName");String name=request.getParameter("name");String school=request.getParameter("school");String[] subjects=request.getParameterValues("subject");String subject="";for(int i=0; i<subjects.length; i++) {subject=subject+subjects[i]+",";}ub.addTeacher(userName, "000000", name, school, subject);request.getRequestDispatcher("/backstage/success.jsp").forward(request, response);
} else if("updatepsw".equals(type)) {String yuanpsw=request.getParameter("yuanpsw");String xinpsw=request.getParameter("xinpsw");User user=(User) session.getAttribute("user");String userName=user.getUserName();if(ub.updatepsw(userName, yuanpsw, xinpsw)) {out.print(1);} else {out.print(0);}
}
}
公告管理
- 展示公告列表:
if ("lie".equals(b)) {// 获取公告列表String sql = "select * from post order by create_time desc";List<Post> plist = postBiz.selPost(sql);request.setAttribute("plist", plist);request.getRequestDispatcher("/backstage/post.jsp").forward(request, response);
} else if("dan".equals(b)) {int post_id=Integer.parseInt(request.getParameter("id"));Post post=postBiz.selPost(post_id);request.setAttribute("post", post);request.getRequestDispatcher("/jsp/postdetail.jsp").forward(request, response);
}
}
- 发布删除公告:
if ("fb".equals(type)) {// 发布公告String title = request.getParameter("title");String content = request.getParameter("content");System.out.println(title + "-----" + content);System.out.println(postBiz.fbPost(title, content));
} else if ("all".equals(type)) {String sql = "select * from post order by create_time desc limit 0,5";List<Post> plist = postBiz.selPost(sql);String json = null;if (plist != null) {json = JSONArray.fromObject(plist).toString();}out.write(json);
} else if ("del".equals(type)) {// 删除公告int post_id = Integer.parseInt(request.getParameter("id"));if(postBiz.delPost(post_id)) {out.print(1);} else {out.print(0);}
}
用户使用说明
本程序 Java Web 程序,在 MySQL 中建立相应表插入适当数据后,更改数据库配置文件 database.properties,将程序源代码导入相应的开发工具或将编译后的程序直接放在 Tomcat 下,运行即可。
- 精品课程网首页:localhost:8080/course/index.jsp
- 测试登录学生用户: 帐号:student 密码:123456
- 测试登录教师用户: 帐号:teacher 密码:123456
- 图 5-1 精品课程网首页
- 学生用户权限:首页、课程中心、资料下载、师生互动、在线测试、提交作业(如图 5-2)
- 教师用户权限:首页、课程中心、资料下载、师生互动、在线出题、收集作业(如图 5-3)
图 5-2 精品课程网在线测试模块
图 5-3 精品课程网在线出题模块
精品课程网后台管理:localhost:8080/course/backindex.jsp
- 测试登录管理员用户: 帐号:admin 密码:admin
- 图 5-4 精品课程网后台管理系统登陆页面
- 管理员用户权限:用户管理、公告管理(如图 5-5)
图 5-5 精品课程网后台管理系统用户管理模块
三、结论
基于 Java 和 MySQL 的精品课程网站设计与实现由我和同组同学合作完成。它是根据当下教育资源紧缺和广大教育需求而分析设计的,初步确定了网站系统具有的解决当下教务模式与需求之间的矛盾的功能,包括数据库设计、网页界面设计、Web 应用层设计等,是一个具有实际应用意义和使用价值的资源共享网站。
在此次设计中,我主要负责的是后台代码的编写。从一起分析讨论到各自完成所负责部分的代码再到前后台的数据交互,期间反反复复遇到了很多问题,不过通过在网上查阅资料和相互交流,最终都得以解决。
这次的程序编写使我对网站设计的开发步骤和思路有了一个全新的认识,也更加熟练的掌握了 Java 基础代码,我体会到了代码规范化的重要性:写代码之前要设计好文案,操作步骤、流程图、数据结构等都要想好,命名规范,尽量多的思考需要什么,将整个流程都构思好后,与大家一起讨论。编写时思路要清晰,尽量避免重复代码,多加注释,等等。
由于毕业设计的时间有限,该网站在功能需求和用户体验方面仍不完善,还有待进一步改进和提高。
四、参考文献
- 蔡剑,景楠.JavaWeb 应用开发:J2EE 和 Tomcat[M].北京:清华大学出版社,2004
- 孙鑫编著.JavaWeb 开发详解[M].电子工业出版社,2006
- 张志峰,朱颢东.Java Web 技术整合应用与项目实战.清华大学出版社,2013
- 王飞飞,崔洋.MySQL 数据库应用.中国铁道出版社,2007
- 鲍格斯坦.JSP 设计第一版.中国电力出版社,2008
- 孙更新.Java 毕业设计指南与项目实践.北京科海电子出版社,2008
五、致 谢
本次毕业设计能够顺利完成离不开我的导师的指点和帮助。从选题、程序分析、程序设计、程序调试到最终论文的撰写,其中遇到了不少问题,但在老师的悉心教导下都得以解决,在此由衷的感谢导师对我的帮助及支持。
本次设计也是我和同学第一次搭档的作品,以前在班上交流不算多,这次的合作使我们更加熟悉加深了友谊,这也再次让我体会到齐心协力的重要性,我们一起相互讨论,研究出相对合适的解决方法,虽然设计还有很多不足,但是我们还会慢慢完善做到更好!