unix课程设计java学生管理系统.docx
- 文档编号:5543440
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:57
- 大小:303.97KB
unix课程设计java学生管理系统.docx
《unix课程设计java学生管理系统.docx》由会员分享,可在线阅读,更多相关《unix课程设计java学生管理系统.docx(57页珍藏版)》请在冰点文库上搜索。
unix课程设计java学生管理系统
《UNIX系统与软件开发》课程设计
设计题目:
学生管理系统
专业:
计算机科学与技术
指导教师:
班级:
0814102
学号:
姓名:
同组人:
计算机科学与工程学院
2013年06月26日
前言
本系统是使用java语言编写的一个简单的c/s结构的学生管理系统,服务端运行在linux系统,通过mysql数据库来存储数据,客服端运行在windows系统,通过socket发送请求给服务端,服务端分析处理后返回结果给客服端。
在客户端,客户端的每一次操作都会生成日志文件,在服务端,服务端对客服端每次发送的请求生成日志文件。
由于技术以及相关知识的欠缺,本系统只实现了简单的增删改查的功能,其面向的是学生管理员,有增加学生,删除学生等高级权限,因为服务端要同时接受多个客户端的请求,所以服务端做成多线程模式,但也只是简单实现同时能连多个客服端,当多个客户端对同一个数据进行处理时,不会进行线程同步,本人将会在以后的学习中加强相关知识的获取,不断的完善系统现有功能以及增加一些实用的功能。
一、系统环境
(一)、硬件环境
家用计算机,内存2G,硬盘80G以上。
(二)、软件环境
本系统是基于javaJDK1.6在window7系统下用eclipse以及在fedora9系统下用fedoraeclipse开发,因为使用的开发语言是java,故系统必须安装有java虚拟机。
数据库使用linux下的mysql数据库。
二、设计目的
当今计算机技术飞速发展,数据库技术作为数据管理的一个有效的手段,在各行各业中得到越来越广泛的应用,然而并不是每个人都会直接操作数据库,面对大量的数据,必须提供一个简单的形象的,可视化的操作界面给数据的管理员,例如,当今各高校的的规模越来越大,学生人数也将增加,而随着人数的增加,也给学校带来了大量数据的增加,这给学校的学籍管理人员在资料的整理,资料的查询,数据的处理上带来很大的不便。
开发本系统的目标就是为了减少管理员的工作强度,使得对学生信息的查询和数据处理的速度得到很大程度的提高,从而提高学籍管理员的的工作效率,使管理员的工作系统化,规范化,自动化。
同时对这个学期学过的知识通过这次的设计进行实际检测。
三、总体设计
(一)、功能分析
学生管理系统的主要功能是管理学生的基本信息。
由于本人水平有限本系统将只提供五个功能。
●查询所有学生信息:
管理员登录成功后可以查询所有的学生信息。
●条件查询:
按管理员的条件进行查询。
●增加信息:
管理员登录成功后可以添加新学生信息。
●删除信息:
只提供了按学号删除。
●更新信息:
分别提供了更新姓名,更新学号,更新电话。
(二)、数据库设计
因为本系统较为简单,数据库只建了两张表,一张学生信息表(stuinfo),一张用户表(userinfo),都存在studentdb数据库下。
学生信息表存储学生基本信息,包含四个字段:
学号(stuID),姓名(stuname),性别(sex),电话(tel);用户表存储学籍管理员用于登录的用户名和密码,只包含两个字段:
用户名(name),密码(passwd)。
以下是两张表的内容:
表1userinfo表的内容
字段名
字段描述
数据类型
主键
非空
name
用户名
Varchar(15)
Yes
Yes
passwd
密码
Varchar(20)
No
Yes
表2stuinfo表的内容
字段名
字段描述
数据类型
主键
默认值
stuname
姓名
Varchar(10)
No
Null
stuID
学号
Varchar(15)
Yes
Null
sex
性别
Char(5)
No
Null
tel
电话
Varchar(11)
No
Null
(三)、系统结构图
图1
(四)、程序流程图
图2
(五)、类图
1、系统类概述:
系统包含9个类,客户端包含五个类,服务端包含4个类,各类中包含的方法以及说明如下:
Client类:
stuServer类:
图3图4
Clien工具类:
stuServer线程类以及操作类:
图5图6
●客户端类:
Client类是界面的实现以及发送信息的主类,Student类是实体类,Input是获取键盘输入类,stuClient类是连接服务器类,logFile类是生成日志文件类。
●服务器类:
stuServer类是主服务器类,ServerTread类是服务器线程类,connStu类是连接数据库以及执行sql语句类,StudentBiz类是生成sql语句类;
sLogFile类是生成日志文件类。
2、类的调用关系:
●客户端:
首先启动登录类Client类,其调用输入类Input获取从键盘输入的用户名和密码,然后调用连接服务器类stuClient连接服务器,在服务器校验用户名密码正确后调用Client类显示操作界面,在操作界面操作时Clien类调用Input获取输入的信息然后调用stuClient类通过Socket连接服务器发送信息。
每一步操作都将调用logFlie类生成日志文件。
●服务器:
启动stuServer,当有用户连接时调用ServerTread类接受连接以获取客户端发来的信息,对信息校验是否能处理,能处理则调用SudentBiz类生成相关sql语句,StudentBiz类生成sql语句后调用connStu类的连接数据库方法和执行sql语句的方法,获取结果返回给Server,Server再通过Socket发给客户端。
客服端的每一次请求都会调用sLogFile类生成日志文件,调用关系如下:
图7调用关系图
四、详细设计
(一)、登录模块
登录界面有两个功能选项,一是登录,二是退出,这里只写一个初始化函数,实现的功能是给用户提供登录界面,若不想登录则按退出,若登录,则输入用户名密码,正确后调用客户端操作界面。
(二)、客户端操作界面模块
该模块给用户提供系统功能的操作界面,有5个功能,分别是增加学生信息,查询学生信息,删除学生信息,更新学生信息和退出系统。
其中查询学生信息分为按学号和按姓名查找和全部查找,更新学生信息分为更新姓名,更新学号和更新电话。
对每个功能都分别写出对应的方法,个功能对应的方法如下:
●查询学生信息:
queryStu();queByName();queByID();queAll();
●增加学生信息:
addStu();
●删除学生信息:
delStu();
●更新学生信息:
updStu();updByNa();updByID();updByTel();
(三)、服务端模块
该模块主要给客户端提供各种服务,用一个服务器线程类循环监听是否有客户端的请求,因为要对数据库进行操作,所以创建了两个工具类,一个是根据客户端发来的请求而生成sql语句的StudentBiz类一个是连接数据库和执行StudentBiz类生成的sql语句的connStu类。
其中StudentBiz类的方法是根据客服端具有的功能而建立的方法;
服务端模块工具类的方法如下:
●StudentBiz类:
publicbooleancheckUser(Stringname,Stringpasswd)检查用户;
publicResultSetreadAll()从数据库中读取所有记录;
publicResultSetreadByName(Stringname)按姓名从数据库中读取记录;
publicResultSetreadByID(StringID)按学号从数据库中读取记录;
publicbooleaninsertData(Stringname,Stringid,Stringsex,Stringtel)向数据库中插入一条记录。
publicbooleandelData(StringID)按学号删除数据库中一条记录;
publicbooleanupdDataByName(Stirngname)更新数据库中某记录的姓名
publicbooleanupdDataByTel(StringnewTel,Stringtel)更新数据库中某记录的电话
●connStu类:
connStu();连接数据库
publicResultSetqueryStu(Stringsql)执行查询语句;
publicbooleanupdateStu(Stringsql)执行insert,delete,update语句;
publicvoidconClose()关闭数据库连接;
五、调试与测试
(一)、登录界面测试
登录界面测试提供了以下几组测试方式:
1、输入的用户名或密码为空的情况:
2、输入的用户名或密码错误的情况:
3、输入的用户名和密码正确的情况:
(二)、操作界面的的测试:
操作界面主要测试当输入正确的信息后相应的功能页面是否能正确显示和输入错误的信息后能否正常处理:
1、增加学生信息功能页面的测试:
(1)输入正确信息:
(2)输入错误信息:
2、查询功能页面的测试:
(1)输入正确信息:
(2)输入错误信息:
3、删除功能页面的测试:
4、更新学生信息页面的测试:
(1)输入正确的信息:
(三)、服务端模块的测试
服务端主要测试是否能正常启动和接受客户端的请求而建立连接。
1、启动服务端:
2、与客服端建立连接:
3、建立完成后主线程继续监听是否有客户端连接:
(四)、测试结果的分析:
综合测试下来,系统具有的相关功能页面在输入正确和错误信息都都能给用户做出正确显示和提示,由于测试数据少,可能还有些bug没有检测到,只好等到实际应用出现时再修复。
(五)、测试中遇到的问题及处理方式
1、遇到的问题:
在测试客户端登录界面时遇到了两个问题,一是没有对当输入的用户名和密码为空时的处理,二是当服务端没有开启,客服端登录时抛出的ConnectException:
异常。
三是在机房实际应用测试时配置calsspath变量错误导致程序运行中断。
2、解决方法:
第一个问题好解决,在client类中增加检测用户名和密码为空时返回登录界面的代码。
第二个问题开始我认为是没有catch住这个ConnectException:
异常,可是当我在catch中增加这个异常时编译不能通过。
只能这样做:
要使用客户端之前必须先开启服务端。
第三个问题在指导老师邵国金老师的帮助下正确配置了classpath变量,具体为:
#exportCLASSPATH=usr/share/java/mysql-connector-java.jar。
六、设计中遇到的问题及解决方法
(一)、遇到的问题
在设计中遇到了很多问题,在这里提一下主要的:
●客户端一次发送多个数据的问题,因为socket的getOutputStream和getInputSream方法都只能用一次,不能多次调用该方法,这就造成如果
户端一次需要发送多个数据比如用户名和密码,增加学生信息时,学生的四个属性值,怎么才能一次发送过去而能让服务端理解你所需要的是什么服务。
●服务端查询结果后一次返回学生所有信息的问题,比如查询到某学生的信息后要把这些信息返回给客户端且要让客户端知道那个数据代表什么信息。
●数据库返回结果后用什么变量或者容器去接收。
●客户端到底是要做成连一次后就可以进行各种操作直到断开,还是每操作一次连一次。
(二)、解决方法
1、一次发送多个数据问题可以和服务端建立一个协议,把发送的多个数据间用“,”隔开,并在数据的开头增加操作的标识。
在打包发给服务器,服务器在根据协议对数据进行遇到“,”就拆分。
2、原理如
(1)客户端和服务端先商定协议,规定发送的数据顺序按照姓名,学号,性别,电话的顺序进行打包。
3、开始时想用list集合去装,可是由于对list的使用不是很熟悉,还是用resultSet去装。
然后服务端循环每拆封一个就往客户端发一次。
4、为了降低服务器的处理压力和节约资源,设计成需要操作的时候再连接,操作完就断开,在操作时才又一次连接。
七、源程序清单和执行结果及分析
(一)、客户端源程序清单
1、Client类:
importjava.io.*;
import.*;
publicclassClient{
//privateBufferedReaderbf;
stuClientsc=newstuClient();
Inputin=newInput();
Studentstu=newStudent();
privateStringrecInfo;//用来接收服务端返回的数据;
privateStringchoNum;//选择子菜单的数字
publicvoidmenue(){
System.out.println("==============================================");
System.out.println("欢迎使用本系统,请按数字键选择相应功能");
System.out.println("1-增加学生信息");
System.out.println("2-查询学生信息");
System.out.println("3-删除学生信息");
System.out.println("4-修改学生信息");
System.out.println("5-查询所有学生信息");
System.out.println("6-退出系统");
System.out.println("=============================================");
choNum=in.getString();
if("1".equals(choNum)){
addStu();
}
elseif("2".equals(choNum)){
queryStu();
}
elseif("3".equals(choNum)){
delStu();
}
elseif("4".equals(choNum)){
updStu();
}
elseif("5".equals(choNum)){
queAll();
}
elseif("6".equals(choNum)){
System.out.println("退出本系统");
System.out.println("欢迎下次继续使用本系统");
System.exit(0);
}
else{
System.out.println("没有与"+choNum+"对应的功能,请继续关注我们的产品,"+
"现在将返回主界面");
menue();
}
}
//查询方式
publicvoidqueryStu(){
System.out.println("==============================================");
System.out.println("请选择查询方式");
System.out.println("1-按姓名查找");
System.out.println("2-按学号查找");
System.out.println("3-返回上一层");
System.out.println("==============================================");
try{
choNum=in.getString();
if("1".equals(choNum)){
queByName();
}
elseif("2".equals(choNum)){
queByID();
}
elseif("3".equals(choNum)){
menue();
}
else{
System.out.println("没有与"+choNum+"对应的功能,请继续关注我们的产品"+
"现在将返回");
queryStu();
}
}
catch(Exceptione){
e.printStackTrace();
}
finally{
sc.closeSocket();
}
}
//按姓名查找
publicvoidqueByName(){
System.out.println("==============================================");
System.out.println("查询学生信息页面");
System.out.println("==============================================");
System.out.println("请输入你要查找学生的姓名:
");
try{
stu.name=in.getString();
sc.initSocket();
sc.pwOut.println("queryNa"+","+stu.name);
recInfo=sc.bufIn.readLine();
System.out.println(recInfo);
if("false".equals(recInfo)){
System.out.println("你要查找的姓名为"+stu.name+"的学生不存在");
queryStu();
}
else{
String[]ary=recInfo.split(",");
System.out.println("你所查询的结果为:
");
stu.fromatPrint(ary[0],ary[1],ary[2],ary[3]);//调用Student类的格式化输出方法
queryStu();
}
}
catch(Exceptione){
e.printStackTrace();
}
finally{
sc.closeSocket();
}
}
//按学号查找
publicvoidqueByID(){
System.out.println("==============================================");
System.out.println("查询学生信息页面");
System.out.println("==============================================");
System.out.println("请输入你要查找学生的学号:
");
try{
stu.id=in.getString();
sc.initSocket();
sc.pwOut.println("queryID"+","+stu.id);
recInfo=sc.bufIn.readLine();
if("false".equals(recInfo)){
System.out.println("你要查找的学号为"+stu.id+"的学生不存在");
queryStu();
}
else{
System.out.println(recInfo);
String[]ary=recInfo.split(",");
System.out.println("你所查询的结果为:
");
stu.fromatPrint(ary[0],ary[1],ary[2],ary[3]);//调用Student类的格式化输出方法
queryStu();
}
}
catch(Exceptione){
e.printStackTrace();
}
finally{
sc.closeSocket();
}
}
//查询所有
publicvoidqueAll(){
try{
sc.initSocket();
sc.pwOut.println("queryAll");
recInfo=sc.bufIn.readLine();
System.out.println(recInfo);
menue();
}
catch(Exceptione){
e.printStackTrace();
}
finally{
sc.closeSocket();
}
}
//增加信息
publicvoidaddStu(){
System.out.println("==============================================");
System.out.println("增加学生信息页面");
System.out.println("增加学生信息");
System.out.println("请按如下格式来输入信息");
System.out.println("姓名,学号,性别,电话");
System.out.println("==============================================");
System.out.println("请输入新增学生信息:
按e返回上一层");
try{
//获取键盘录入的学生信息,用于发送给服务器
StringsendInfo=in.getString();
if("e".equals(sendInfo))
menue();
else{
String[]check=sendInfo.split(",");//用于检查输入的信息是等于4来判断输入是否有效
//如果输入有效则发往服务器
if(check.length==4){
sc.initSocket();
sc.pwOut.println("add"+","+sendInfo);
recInfo=sc.bufIn.readLine();
if("false".equals(recInfo)){
System.out.println("插入失败,用户已存在或者插入的数据类型不匹配");
}
else{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- unix 课程设计 java 学生 管理 系统
![提示](https://static.bingdoc.com/images/bang_tan.gif)