一、《Java EE编程技术》技能测试考试的测试目的
本学期该课程介绍了Java EE 应用程序的开发环境和开发技术,重点给出了Strus2、Hibernate、Spring三个框架的使用以及整合。
采用技能测试考核的方式,让同学们独立完成一个应用项目的开发,从而考查该学生是否掌握了开发环境的搭建与配置,采用不同框架开发技术的整合,形成该项目的开发方案,给出项目的分析思想、设计思想、所构建的框架结构,最后完成项目的编码实现,并进行部署运行测试。
通过该考试方式,检查学生对一个项目的独立完成能力。
最后,根据所提交的开发文档,按优秀、良好、中等、通过,不通过,5等级确定成绩。
提示:若雷同、或者从网上下载修改的,一律按不通过处理。
二、技能测试题目
基于本学期学习的Strus2、Hibernate、Spring三个框架,完成山东农业大学的选课系统(在功能上模拟山东农业大学的选课系统)。
对于我们农业大学的选课系统,大家都应该很熟悉,其功能及其相关的操作也应该清楚,根据自己的理解,按选课系统的功能需要,自己定义相关的数据表(实体类)及其关联关系(提示对于学生与课程一定是多对多的关联关系,另外,还包含其他的一些实体及其关系)。
需求要求:
该系统的基本需求是,系统要实现如下的基本管理功能:
(1)用户分为两类:系统管理员(教务处管理人员),一般用户(学生)。
(2)提供用户注册和用户登录验证功能;其中登录用户的信息有:登录用户名,登录密码等。
(3)管理员可以实现对注册用户的管理(删除),规定并设置选课时间段,在该段时间内,学生必须完成选课,并可以实现对选课情况的查询、修改和删除等有关的操作。例如,当选课结束后,对于选课人数小于40人的课程进行删除(注意,关联的学生,学生所选课自动删除)
(4)一般用户,可以选课、修改选课、删除选课,查看课程情况、以及自己选课情况。
(5)管理员提前形成选课学生(按专业、班级)数据表,以及根据培养方案(本学期可能要安排的课程)形成一个默认的选课情况。学生登陆后,自动列出该学生目前的默认选课情况,在此基础上,完成自己的选课。
(6)对于管理员,当选课结束后,可以形成以课程为教学单元的一个教学班,并可以查询班级学生,也可以形成班级学生名单。
该技能测试要完成3次系统的开发:
(1) 第一次:基于Struts2框架给出系统的设计
提交作业格式要求:
计算机19级_班级_学号_姓名_Struts2
提交源代码、设计报告、导出的数据库。
该报告是设计基础,必须给出很详细的设计说明。在此基础上,可以完成第2次、第3次的报告。
(2)第二次:
基于Struts2+Hibernate框架整合给出系统的重新设计
提交作业格式要求:
计算机19级_班级_学号_姓名_Struts2_Hibernate
提交源代码、设计报告、导出的数据库
注意,在该设计报告中,只强调你是如何在第一个报告的基础上,重新设计数据库访问的内容,以及如何整合的。
(3)第三次:基于Spring+Hibernate+Struts2重新设计系统
提交作业格式要求:
计算机19级_班级_学号_姓名_SSH
提交源代码、设计报告、导出的数据库
注意,在该设计报告中,只强调你是如何在第2个报告的基础上,如何配置相关的对象,并形成对象之间的依赖关系,如何整合的。
三、项目开发完成后,要提交的材料
需要提交如下材料:
(1) 电子文档—— 按上面要求的内容和命名格式提交相关的内容。
(2) 设计报告的纸质文档。
注意:设计报告,根据自己的开发思想给出相关的设计内容,所给出的设计内容应该清楚明了,体现其设计细想、设计思路、设计方案。该部分内容占总成绩的50%,很重要
四、成绩的评定
根据学生所提供的设计报告、源代码、综合评定成绩。按照“五级制”评分。
(1)不及格:程序要求的基本功能没有完成,或者程序不能正常运行,或者有严重的抄袭现象;报告与系统演示中的大部分内容叙述不正确,条理不清楚。
(2)及格:程序要求的基本功能完成,程序能够正常运行;报告与系统演示中的内容基本正确,格式规范。
(3)中:用户界面友好,操作方便;报告与系统演示条理清楚,内容完整。
(4)良:具备良好的编码规范,主要的程序元素有注释,程序运行稳定;报告与系统演示结构合理,重点突出。
(5)优:程序具有很好的扩展性,界面优美,程序结构清晰;报告与系统演示相一致,详略得当,报告中没有明显的错误。
基于Struts2框架的设计报告
1、 需求分析
1.1 功能需求分析
(1)用户分为两类:系统管理员(教务处管理人员),一般用户(学生)。
(2)提供用户注册和用户登录验证功能;其中登录用户的信息有:登录用户名,登录密码等。
(3)管理员可以实现对注册用户的管理(删除),规定并设置选课时间段,在该段时间内,学生必须完成选课,并可以实现对选课情况的查询、修改和删除等有关的操作。例如,当选课结束后,对于选课人数小于40人的课程进行删除(注意,关联的学生,学生所选课自动删除)
(4)一般用户,可以选课、修改选课、删除选课,查看课程情况、以及自己选课情况。
(5)管理员提前形成选课学生(按专业、班级)数据表,以及根据培养方案(本学期可能要安排的课程)形成一个默认的选课情况。学生登陆后,自动列出该学生目前的默认选课情况,在此基础上,完成自己的选课。
(6)对于管理员,当选课结束后,可以形成以课程为教学单元的一个教学班,并可以查询班级学生,也可以形成班级学生名单。
1.2 技术需求分析
技术采用本学期学习的Struts2框架,来完成山东农业大学的学生挂案例选课系统,数据库采用MySQL数据库。目前,本人已经可以熟练掌握该技术框架,下面进行该系统主要设计、实现等的展示。
2、系统的总体结构
概要设计如下图所示,采用软件工程中的系统结构图进行绘制:
学生选课管理系统主要采用4层结构:
(1)视图层
(2)控制层
(3)模型层
(4)数据库层
3、系统模块结构
3.1系统各角色的用例图实现:
3.2用户登录与注册模块
——用户登录与注册子系统各组件及其功能
3.3学生选课管理子系统
——学生选课管理子系统各组件及其功能
4、系统模块的工作流程
4.1注册、登录模块的工作流程
4.2学生选课管理模块的开发
5、整个应用的组织结构
封装为JdbcUtil,提供了两个静态方法:getConnection()方法和free()方法分别获得connection对象和释放connection对象,result对象和statement对象。(通过类名加函数名直接调用静态方法)
实现单一职责原则,每个类只实现它对应实体类的Add、Delete、Query、Modify等方法,在编写程序时思路更清晰,实现低耦合性
注意,必须要导入的Jar包有:
(1)MySQL数据库连接驱动程序包
(2)支持数据库连接池Jar包:
(3)Struts2所必须的基础Jar包:
(4)导入Struts2支持注释配置的Jar包:
(5)导入支持Excel处理的Jar包:
6、数据库与数据表的设计与实现
选课管理系统的单个实体有管理员、学生、学生课程、选课信息等。
管理员实体:(使用在线绘图processon绘制)
学生实体:
课程实体:
最后设置的数据库中主要使用的表为:学生表、管理员表和课程表
具体数据库展示:
学生表:
管理员表:
课程表:
Id表:
7、学生选课管理系统的实现
7.1注册页面
在此界面用户可以通过手机号、工号和密码来注册管理员,而学生端是通过管理员端注册的,此界面可以进行重置和提交
7.2管理员登录页面
在此界面管理员可以通过工号和密码来登录,同样设有重置和登录两个按钮
7.3学生登录页面
在此界面学生可以通过学号和密码来登录,同样设有重置和登录两个按钮
7.4学生选课界面—我的信息
在此界面学生可以查询学生信息,包括学号、姓名、密码、性别等信息
7.5学生选课界面—更新信息1
在此界面学生可以更新学生信息,包括学号、姓名、密码、性别等信息
7.6学生选课界面—更新信息2
在此界面学生可以更新学生信息,点击下方更新信息的按钮即可更新成功
7.7学生选课界面—在线选课
在此界面学生可以进行在线选课,可以显示课程ID和课程名字等信息,点击选择按钮即可成功选择该老师开设的课程
7.8学生选课界面—选课预览
在此界面学生可以进行选课预览,即自己选课情况的查看,可以显示已选课程的ID和课程名字等信息,点击修改和删除按钮即可修改和删除已选课程
7.9管理员操作界面—课程列表
在此界面可以显示学校目前开设的课程,并且可以点击更新和删除按钮,对课程进行更新和删除
7.10管理员操作界面—添加课程1
在此界面管理员可以添加新课程,包括课程编号和课程名字等信息
7.11管理员操作界面—添加课程2
在此界面管理员可以添加新课程,点击添加课程按钮即可添加成功
7.12管理员操作界面—学生列表
在此界面可以显示学生列表,管理员可以查看学生编号等学生信息,并且可以执行对学生用户进行删除的操作
7.13管理员操作界面—添加学生
在此界面管理员可以添加学生,管理员可以添加的信息有:学生学号,学生姓名和密码,点击添加学生按钮即可添加成功
7.14管理员操作界面—生成报告
在此界面管理员可以点击生成选课情况和生产学生名单,将会通过生产excel 的方式生产这两个文件
8、调试与分析
1.在添加课程信息时候出现了开课人数小于课程人数时也不能添加,找到那段代码发现是在赋值时候弄反了,改正以后没有问题了。代码如下:
改正前:minnum = document.Form1.maxnum .value ;
maxnum = document.Form1.minnum .value ;
if(minnum > maxnum ){
alert("课程人数必须大于开课人数!");
return false ;
改正后: minnum = document.Form1.minnum .value ;
maxnum = document.Form1.maxnum .value ;
2.在查询学生信息是出现错误,报空指针异常错误,通过逐步添加打印信息在控制台找到错误代码,在dao包下实现类出现了问题,用list数组查找以后没有把学生类添加到list数组中。代码如下:
改正前: student.setEmail(rs.getString("email")) ;
student.setDepartName(rs.getString("departname")) ;
return false ;
*改正后: tudent.setEmail(rs.getString("email")) ;
student.setDepartName(rs.getString("departname")) ;
list.add(student) ;
return false ;
3.在做校验时,jsp页面显示不了错误信息,开始我在struts2.xml中找原因,以为是路径处理问题才显示不了错误信息,最后才发现是jsp页面输入需要
s:textfield表单输入,用input输入显示不了。代码如下:
改正前:<input type="text" name="username" id="username" />
<input type="password" name="password" id="password" />
改正后: <s:textfield name="username" id="username" />
<s:textfield name="password" id="password" />
9、结论与心得体会
在这次课程设计中问我做的是一个学生选课管理系统,主要实现了权限管理模块、学生退选课模块、学生信息管理模块、教师信息管理模块、课程信息管理模块等功能,在这次试验中,我遇到了很多问题。
开始我就遇到了空指针问题,很多空指针问题是以为我粗心大意造成的,变量名书写错误、忘记添加到数组还有就是jsp跳转时出现问题,经过逐步输出信息排查发现问题解决了。在实现模糊查询的时候查询的结果错误,不是预期的结果,首先我把SQL语句在控制台打印出来,把SQL语句写到数据库中看看是不是SQL语句出错,然后在检查java语句结构,最后找出问题,在SQL语句中的换行少了空格,所以查询出错了,改正以后可以正确查询。
在这次实验中,我了解到了整个程序的开发流程和结构,学习了使用struts2框架来建立jsp和action之间的联系,更重要的是学到了怎样去解决程序中出现的问题,了解为什么会出现这样的问题,下次怎样避免,积累了很宝贵的经验和教训。还有这次实验的程序并不是很完善,比如说学生、管理员、课程的页面没有分页,数据很多的情况下会很难去游览。还有学生想要申请使用教室也不能实现,学生对教师评教功能都没有实现,所以说程序没有完善。
在这次实验中也发现了自己很多的不足之处,发现自己的基础知识掌握的不牢固,在以后的学习工作中,会注重打好基础知识,在基础知识打好情况下再去提高自己,不好高骛远。
10、项目搭建部分实现细节
Xml配置文件内容如下:
<?xml version="1.0" encoding="gbk" ?> /frame/frame.jsp /frame/frame.jsp /frame/frame.jsp /login.jsp /personal/alter_pass_succ.jsp /error.jsp /login.jsp <action name="StuInfo" class="org.lee.action.StudentAction"
method="StuInfo">
<result name="success">/admin/stu_info.jsp</result>
</action>
<action name="depart_class"
class="org.lee.action.DepartAction">
<result name="success">/admin/stu_info.jsp</result>
</action>
<action name="detailStuInfo"
class="org.lee.action.StudentAction" method="getStuInfoById">
<result name="success">/admin/edit_stu.jsp</result>
</action>
<action name="delStuInfo" class="org.lee.action.StudentAction"
method="delStuInfoById">
<result name="success" type="redirect">
StuInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="getDepartInfo1"
class="org.lee.action.DepartAction">
<result name="success">/admin/add_stu.jsp</result>
</action>
<action name="addStuInfo" class="org.lee.action.StudentAction"
method="addStuInfo">
<result name="success" type="redirect">
StuInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="selectCourse" class="org.lee.action.CourseAction"
method="getSelectedCourseInfo">
<result name="success">/student/selected_info.jsp</result>
</action>
<action name="detailSelectedInfo"
class="org.lee.action.SelectedAction" method="detailSelectedInfo">
<result name="success">/student/detail_selected.jsp</result>
</action>
<action name="detailSelectedInfo2"
class="org.lee.action.SelectedAction" method="detailSelectedInfo">
<result name="success">/admin/detail_selected.jsp</result>
</action>
<action name="addSelectedInfo"
class="org.lee.action.SelectedAction" method="addSelectedInfo"><!-- 选课 -->
<result name="success">
/student/selected_success.jsp
</result>
<result name="error">/error.jsp</result>
<result name="selected">/student/selected_once.jsp</result>
<result name="full">/student/course_full.jsp</result>
</action>
<action name="personalSelectedCourse"
class="org.lee.action.SelectedAction" method="querySelectedCourse">
<result name="success">
/student/personal_selected.jsp
</result>
</action>
<action name="quitSelectedCourse"
class="org.lee.action.SelectedAction" method="delSelectedInfo">
<result name="success">/student/quit_success.jsp</result>
</action>
<action name="stuPersonalInfo"
class="org.lee.action.StudentAction" method="getStuInfoById">
<result name="success">
/student/stu_personal_info.jsp
</result>
<result name="error">/error.jsp</result>
</action>
<action name="getTchInfoById"
class="org.lee.action.TeacherAction" method="getTchInfoById">
<result name="success">/admin/edit_tch.jsp</result>
</action>
<action name="editTchInfo" class="org.lee.action.TeacherAction"
method="editTchInfo">
<result name="success" type="redirect">
TchInfo.action
</result>
<result name="input">/error.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="editTchInfo2" class="org.lee.action.TeacherAction"
method="editTchInfo">
<result name="success" type="redirect">
tchPersonalInfo.action?teacherNo=${teacherNo}
</result>
<result name="error">/error.jsp</result>
</action>
<action name="tchPersonalInfo"
class="org.lee.action.TeacherAction" method="getTchInfoById">
<result name="success">
/teacher/tch_personal_info.jsp
</result>
<result name="error">/error.jsp</result>
</action>
<action name="TchInfo" class="org.lee.action.TeacherAction"
method="TchInfo">
<result name="success">/admin/teacher_info.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="getDepartInfo2"
class="org.lee.action.DepartAction">
<result name="success">/admin/add_tch.jsp</result>
</action>
<action name="delTchInfo" class="org.lee.action.TeacherAction"
method="delTchInfo">
<result name="success" type="redirect">
TchInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="addTchInfo" class="org.lee.action.TeacherAction"
method="addTchInfo">
<result name="success" type="redirect">
TchInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="getCourseInfo" class="org.lee.action.CourseAction"
method="CourseInfo">
<result name="success">/teacher/course_info.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="getCourseByTchId"
class="org.lee.action.CourseAction" method="getCourseByTchId">
<result name="success">/teacher/teach_course.jsp</result>
</action>
<action name="CourseOfTch" class="org.lee.action.CourseAction"
method="getCourseByTchId">
<result name="success">/teacher/stu_of_course.jsp</result>
</action>
<action name="getStuByCseId"
class="org.lee.action.SelectedAction" method="getStuInfoByCseId">
<result name="success">/teacher/stu_of_course.jsp</result>
</action>
<action name="detailCourseInfo2"
class="org.lee.action.CourseAction" method="getCourseInfoById">
<result name="success">/teacher/detail_course.jsp</result>
</action>
<action name="detailStuInfo2"
class="org.lee.action.StudentAction" method="getStuInfoById">
<result name="success">/teacher/detail_stu.jsp</result>
</action>
<action name="editStuInfo" class="org.lee.action.StudentAction"
method="editStuInfo">
<result name="success" type="redirect">
StuInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="editStuInfo2" class="org.lee.action.StudentAction"
method="editStuInfo">
<result name="success" type="redirect">
stuPersonalInfo.action?studentNo=${studentNo}
</result>
<result name="error">/error.jsp</result>
</action>
<action name="CourseInfo" class="org.lee.action.CourseAction"
method="CourseInfo">
<result name="success">/admin/course_info.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="detailCourseInfo"
class="org.lee.action.CourseAction" method="getCourseInfoById">
<result name="success">/admin/edit_course.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="delCourseInfo" class="org.lee.action.CourseAction"
method="delCourseInfoById">
<result name="success" type="redirect">
CourseInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="getDepartInfo3"
class="org.lee.action.DepartAction">
<result name="success">/admin/add_course.jsp</result>
</action>
<action name="addCourseInfo" class="org.lee.action.CourseAction"
method="addCourseInfo">
<result name="success" type="redirect">
CourseInfo.action
</result>
<result name="time-place">/admin/error_tp.jsp</result>
<result name="course-tch">/admin/error_ct.jsp</result>
<result name="input">/error.jsp</result>
</action>
<action name="stuListOfCse"
class="org.lee.action.SelectedAction" method="getStuInfoByCseId">
<result name="success">/admin/stu_of_course.jsp</result>
</action>
<action name="editCourseInfo"
class="org.lee.action.CourseAction" method="editCourseInfo">
<result name="success" type="redirect">
CourseInfo.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="allNotice" class="org.lee.action.NoticeAction">
<result name="success">/admin/notice.jsp</result>
</action>
<action name="getNoticeById" class="org.lee.action.NoticeAction"
method="getNoticeById">
<result name="success">/admin/alter_notice.jsp</result>
</action>
<action name="delNotice" class="org.lee.action.NoticeAction"
method="delNotice">
<result name="success" type="redirect">
allNotice.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="addNotice" class="org.lee.action.NoticeAction"
method="addNotice">
<result name="success" type="redirect">
allNotice.action
</result>
<result name="input">/error.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="alterNotice" class="org.lee.action.NoticeAction"
method="alterNotice">
<result name="success" type="redirect">
allNotice.action
</result>
<result name="error">/error.jsp</result>
</action>
<action name="selectedInfo"
class="org.lee.action.SelectedAction">
<result name="success">/admin/selected_info.jsp</result>
</action>
<action name="notice" class="org.lee.action.NoticeAction"
method="noticeInfo">
<result name="success">/frame/sys_notice.jsp</result>
</action>
<action name="lookNoticeInfo"
class="org.lee.action.NoticeAction" method="getNoticeById">
<result name="success">/frame/notice_info.jsp</result>
</action>
<action name="printStuList"
class="org.lee.action.MakeReportAction" method="stuListOfSelect">
<result name="success">/makeExcel.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>