目 录
第1章 引言.................................................... 2
1.1 选题背景.................................................. 2
1.2 主要工作.................................................. 2
第2章 学生成绩系统需求分析.............................. 2
2.1 总体概述.................................................. 2
2.2 功能需求分析.............................................. 3
第3章 学生成绩系统总体设计.............................. 3
3.1 总体设计思想.............................................. 3
3.2 系统技术体系结构.......................................... 3
3.3 系统采用的设计模式........................................ 3
3.4 系统数据库设计............................................ 4
第4章 学生成绩系统详细设计.............................. 5
4.1 设计方案.................................................. 6
4.2 部分数据库表.............................................. 6
4.3 部分功能实现.............................................. 6
第5章 学生成绩系统系统测试方案......................... 8
5.1 软件测试.................................................. 8
5.2 测试用例.................................................. 8
5.3 测试分析.................................................. 8
结束语、谢辞................................................. 9
参考文献...................................................... 10
附录1 部分系统界面......................................... 10
附录2 部分源程序................................ 12
第 1 章 引言
1.1 选题背景
题目6 学生成绩系统
1.2 主要工作
论文的主要目标是基于 J2EE 架构,实现网站构建管理系统的基本功能。
本论文的主要工作可以归结如下:
(1)分析学生成绩管理系统的功能需求和非功能需求。
(2)设计学生成绩管理系统的技术体系结构,应用设计模式,设计数据库实体联系模型。
(3)实现学生成绩管理系统的组件管理、模块管理、界面模板管理等诸多系统管理功能,提供留言板、滚动新闻、计数器等常用组件和模块。
(4)完成学生成绩管理系统的单元测试、功能测试及性能测试,并给出测试分析。
第 2 章 学生成绩系统需求分析
2.1 总体概述
成绩管理系统是针对各大中专院校的成绩管理工作而开发的一个管理软件,根据用户的要求,实现了学生基本情况信息管理,课程信息管理、课程信息管理、班级信息管理以及成绩管理等几个方面的功能。
用户通过输入学生基本情况、学生成绩等基本信息,由系统自动生成相应的数据及各类统计报表以供用户查询、修改、打印。另外用户可以对这些基本信息进行数据的更新和删除。成绩管理系统力求提供用户一个方便快捷的途径去管理这些繁琐的数据。
2.2 功能需求分析
1、学生成绩增删改查;
2、学生查询所有课程的成绩及排名;
3、某一门课程学生成绩的排序;
4、教师所授课程的成绩报表(包括不及格率及各个分数段的学生比例等)。
第 3 章学生成绩系统总体设计
3.1 总体设计思想
核心系统拟由前台网站界面和后台网站管理两部分组成。前台为显示网站内容的网站。后台通过对网站内容的组织,对模板、组件、模块、菜单的控制来实现前台网站的显示和显示形式的变化。
3.2 系统技术体系结构
技术体系结构是系统实现中使用的这样一套软件产品或组件定义。是 由一组用来调用通用软件产品的接口、封装器软件,以及一组实现这些接口的通用软件组成。
3.3 系统采用的设计模式
采用分层技术的设计理念,基于J2EE架构。
J2EE 是一种技术规范,是一种用来开发分布式企业软件应用系统的平台,它给开发人员提供了一种工作平台,它 定义了整个标准的应用开发体系结构和一个部署环境,通过一个基于组件的方法,来设计、开发、装配及部署企业应用程序。J2EE 平台提供了多层的分布式应用模型、组 件重用、一 致化的安全模型以及灵活的事务控制。应用软件厂商不仅可以比以前更快的速度向市场推出创造性的客户解决方案,而 且其平台是独立的,基于组件的 J2EE 解决方案不会被束缚在任何一个厂商的产品和API上。
3.4 系统数据库设计
1、实体联系图描绘了系统的数据关系。实体联系图中的菱形框代表关系,它确定了实体对之间逻辑上和数量上的联系。关系按照关联的属性来命名。
ER图:
2、用例图描述系统外部的执行者与系统提供的用例之间的某种联系,一个用例就是外部执行者与系统之间的一系列典型交互过程,每个用例为执行者提供有价值的功能。
用例图:
3、顺序图描述按照时间的先后顺序对象之间的交互动作过程。顺序图由对象和消息等图符组成。顺序图的关键思想是对象之间的交互是按照特定的顺序发生的,这些特定顺序发生的交互序列从开始到结束需要一定的时间。
顺序图:
第四章 学生成绩系统详细设计
4.1 设计方案
学生成绩管理系统通过系统后台来进行成绩的增删改查,并将配置好的各种参数存入数据库,系统前台通过读取数据库中的数据来输出学生的成绩信息,并能输出各科的成绩排序。
分析一个要由计算机解决的问题,就是要设法确定该问题最合适的模型,这是分析问题的出发点和目的。为此,首先要分析问题和题意,明确所要解决的问题属于什么类型、原始数据是什么、是怎样被加工的、经计算机处理后需要输出什么结果,然后才能建立相应的系统模型,并把解决问题的方法确定下来。
4.2 部分数据库表
1、建立Student表 学生信息表
Create Table Student
(
SName char(20),
SNumber char(9) Primary Key,
SSex char(2),
SAge smallint,
SDept char(10)
)
2、建立Course表 课程信息表
Create Table Course
(
CNumber char(4) Primary Key,
CName char(40),
CCredit smallint
)
3、建立Grade表 学生成绩单信息表
Create Table Grade
(
SNumber char(9) not null,
CNumber char(4) not null,
GNumber char(4) not null,
GName char(10),
GScore int,
GRecord int
)
4.3 部分功能实现
功能描述:
能实现学生成绩增删改查,并对学生查询所有课程的成绩及排名,同时能对某一门课程学生成绩的排序;最后可以对教师所授课程的成绩进行报表(包括不及格率及各个分数段的学生比例等)。
Struts框架工作原理:
hibernate运行过程:
第 5 章 学生成绩系统测试方案
5.1 软件测试
软件测试是系统工程中的一个问题。它是一种特殊的软件系统的设计和实现;即执行另一个以发现错误为目标的软件系统 。是使用为发现错误所选择的输入和状态的组合而执行代码的过程 。
网站构建管理工具使用测试工具 JUnit 进行单元测试,使用 Selenium 进行功能测试,使用JMeter 进行性能测试。
5.1.1单元测试与 JUnit
单元测试测的是独立的一个工作单元。在Java 应用程序中,“独立的一个工作单元”常常指的是一个方法(但并不总是如此)。
JUnit 是 Java 的单元测试框架,是 XUnit 家族中的 Java 成员。XUnit 是一套适合于多种语言的单元测试工具。JUnit 是开放源码项目。
5.1.2功能测试与 Selenium
功能测试也称黑盒测试和验收测试,是测试和检验应用程序是否能按照涉众(stakeholder)的功能性需求、非功能性需求和其他重要需求来运行的一种方法。功能测试是单元测试和组合测试的补充。
Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个功能测试工具据 Selenium 主页所说,与 其他测试工具相比,使 用Selenium 的最大好处是:S elenium测试直接在浏览器中运行,就像真实用户所做的一样。
5.1.3性能测试与 JMeter
性能测试是检验系统的性能是否符合要求的测试。包括压力测试、负荷测试、可靠性测试、稳定性测试等。
JMeter 是 Apache 组织的开放源代码项目,它 是性能测试的工具,1 00%的用Java实现。JMeter 可以用于测试静态或者动态资源的性能(文件、Servlets、Perl 脚本、Java 对象、数据库和查询、ftp 服务器或者其他的资源)。
5.2测试分析
软件测试的首要任务时发现错误。发现错误也许要花很大的代价,或者不可能用其它的严正和确认技术去发现错误。第二个目的是对于给定的测试包,说明被测系统是符合规约所描述的需求。
从软件产品的角度考虑,有 效的测试对于生产可靠、安 全和成功的系统是必须的。尽管测试的定量数据和面向对象系统的定量数据是很少的,但报告表明,测试会带来非常高的质量;在面向对象的开发中,有效的测试有助于产生非常低的错误率。
结束语
如今科学技术迅速发展,人们越来越离不开计算机了,随着数据量得剧增,也迫使人们选择一种新的存储方式代替过去将数据存放到书本上的文件中,这种新的方式就是要借助计算机编程和数据库技术来完成,为我们的工作提供了很大的方便。
作为一名软件工程专业的学生,要学好数据库及J2EE已经不是一个旧话题了,虽然我们现在只是浅薄的接触了数据库,了解了一些框架的基本使用方法和简单的java、jsp语句的编写,但是这也是为今后的学习和工作奠定的基础。
通过这次的课程设计,让我们真正的认识到了自己的不足和缺陷,同时,我们也从中学到了很多东西,不但加深了基础知识的训练,而且也在出现了的那些新的问题中更加深入的学习了J2EE框架结构。
课程的结束并不等于学习的结束,通过课设发现了平时学习中很多没有注意到的问题,一定要尽快补上,同时深知还有很多关于数据库的知识要学,我们都回更加的努力学习,在实践中锻炼成长。
谢辞
一学期的课程结束了,感谢老师一直以来对我们的细心授课和教导,在本次课程设计中,我们遇到了问题,老师都会耐心指导和帮助,不仅加强了我们对J2EE框架的运用,而且也在遇到的问题中学会了更多,谢谢老师!
参考文献
[1] Karl E.Wiegers 著.陆丽娜 等译.软件需求.北京:机械工业出版社,2000
[2] Erich Gamma 等著.李英军 等译.设计模式:可复用面向对象软件的基础.北京:机械工业出版社,1999
[3] William Crawford 著.刘绍华译.J2EE 设计模式.北京:中国电力出版社,2005
[4] James McGovern 著.李琦译.企业架构实用指南.北京:清华大学出版社,2005
[5] Stephen R.Palmer 等著.熊焕宇 等译.特征驱动开发方法原理与实践.北京:机械工业出版社,2003
附录 1 部分系统界面
附录 2 部分源程序
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'update.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1><font color="red">课程列表</font></h1>
<s:form action="updateUser">
<table>
<tr>
<td>
<s:hidden name="user.id" value="%{user.id}"></s:hidden>
</td>
</tr>
<tr>
<td>
<s:textfield name="user.name" value="%{user.name}" label="课程名称"></s:textfield>
</td>
</tr>
<tr>
<td>
<s:textfield name="user.xz" value="%{user.xz}" label="课程性质"></s:textfield>
</td>
</tr>
<tr>
<td>
<s:textfield name="user.xf" value="%{user.xf}" label="学分"></s:textfield>
</td>
</tr>
<tr>
<td>
<s:textfield name="user.xueshi" value="%{user.xueshi}" label="学时"></s:textfield>
</td>
</tr>
<tr>
<td>
<s:submit></s:submit>
</td>
</tr>
</table>
</s:form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>operation</title>
</head>
<body>
<h1><font color="red">请选择操作</font></h1>
<s:a href="save.jsp">添加成绩信息</s:a> <br><br><br>
<s:a href="listUser.action">查看列表</s:a>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function del()
{
if(confirm("你真的想删除该记录么?"))
{
return true;
}
return false;
}
</script>
</head>
<body>
<h1><font color="red"><center>课程列表</center></font></h1>
<table border="1" width="80%" align="center">
<tr>
<td>编号
</td>
<td>课程名称
</td>
<td>课程性质
</td>
<td>分数
</td>
<td>学时
</td>
<td>删除
</td>
<td>更新
</td>
</tr>
<s:iterator value="#request.list" id="us">
<tr>
<td><s:property value="#us.id"/>
</td>
<td><s:property value="#us.name"/>
</td>
<td><s:property value="#us.xz"/>
</td>
<td><s:property value="#us.xf"/>
</td>
<td><s:property value="#us.xueshi"/>
</td>
<td><s:a href="deleteUser.action?user.id=%{#us.id}" onclick="return del();">delete</s:a>
</td>
<td><s:a href="updatePUser.action?user.id=%{#us.id}">update</s:a>
</td>
</tr>
</s:iterator>
</table>
<s:a href="index.jsp">Homepage</s:a><br><br>
<s:a href="generateExcel.action">生成excel</s:a>
</body>
</html>
package com.test.dao;
import java.util.List;
import com.test.bean.User;
public interface UserDAO
{public void saveUser(User user);
public void removeUser(User user);
public User findUserById(Integer id);
public List<User> findAllUsers();
public List<User> findchengji();
public void updateUser(User user);
}
package com.test.service.impl;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.test.bean.User;
import com.test.dao.UserDAO;
import com.test.service.UserService;
public class UserServiceImpl implements UserService
{private UserDAO userDao;
public UserDAO getUserDao()
{ return userDao;
}
public void setUserDao(UserDAO userDao)
{
this.userDao = userDao;
}
public void delete(User user)
{this.userDao.removeUser(user);
}
public List<User> findAll()
{ return this.userDao.findAllUsers();
}
public List<User> findCJ()
{ return this.userDao.findchengji();
}
public User findById(Integer id)
{ return this.userDao.findUserById(id);
}
public void save(User user)
{ this.userDao.saveUser(user);
}
public void update(User user)
{this.userDao.updateUser(user);
}
}
package com.test.dao.impl;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.test.bean.User;
import com.test.dao.UserDAO;
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO
{@SuppressWarnings("unchecked")
public List<User> findchengji()
{
String hql = "from User user order by user.xueshi desc";
return (List<User>)this.getHibernateTemplate().find(hql);
}public List<User> findAllUsers()
{
String hql = "from User user order by user.id desc";
return (List<User>)this.getHibernateTemplate().find(hql);
}public User findUserById(Integer id)
{
User user = (User) this.getHibernateTemplate().get(User.class, id);
return user;
}
public void removeUser(User user)
{
this.getHibernateTemplate().delete(user);
}
public void saveUser(User user)
{ this.getHibernateTemplate().save(user);
}
public void updateUser(User user)
{ this.getHibernateTemplate().update(user);
}
}