练习java基础的SMS 项目.docx
《练习java基础的SMS 项目.docx》由会员分享,可在线阅读,更多相关《练习java基础的SMS 项目.docx(19页珍藏版)》请在冰点文库上搜索。
![练习java基础的SMS 项目.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/c6cda773-e417-493d-83a1-88eb73ac8de5/c6cda773-e417-493d-83a1-88eb73ac8de51.gif)
练习java基础的SMS项目
CoreJava
任务一完成管理员管理模块中实体类的封装
1任务描述
完成管理员管理模块涉及的实体类的封装,为后续完成这个模块打下基础。
2所用知识点
类的封装
3作业
按照如下要求完成Admin.java文件:
1.封装Admin类,该类用于封装管理员的信息,此类包括如下几个私有成员:
成员名
类型
含义
id
java.lang.Long
管理员的唯一标识
name
java.lang.String
管理员的真实姓名
loginName
java.lang.String
管理员本系统的用户名
loginPassword
java.lang.String
管理员本系统的密码
phone
java.lang.String
管理员的联系电话
email
java.lang.String
管理员的电子邮箱
enrollDate
java.sql.Date
管理员的注册日期
2.在Admin类中添加如下几个公开方法:
✧一个无参的构造方法
✧所有成员的set和get方法
✧提供toString方法
任务二完成管理员管理模块相关接口的封装,为在后续课程中完成这个模块做好基础工作。
1任务描述
完成本系统管理员管理模块中相关接口的封装。
2所用知识点
接口的定义
3作业
1.封装AdminManagementBIZ接口,此接口用于封装管理员管理模块的业务逻辑,此接口中包括如下几个方法:
✧CollectiongetAllAdmin()
✧voidaddAdmin(Adminadmin)
✧AdmingetAdminById(LongadminId)
✧voidmodifyAdmin(Adminadmin)
✧voidremoveAdmin(LongadminId)
2.封装AdminDAO接口,此接口用于封装对管理员执行的各种操作,此接口中包括如下几个方法:
✧CollectionselectAllAdmin()
✧voidinsertAdmin(Adminadmin)
✧voidupdateAdmin(Adminadmin)
✧voiddeleteAdmin(LongadminId)
✧AdminselectAdminById(LongadminId)
✧AdminselectAdminByLoginName(StringloginName)
任务三完成管理员管理模块所需异常的封装,为在后续课程中继续完成这个模块做好基础工作。
1任务描述
完成本系统管理员管理模块中相关异常的封装。
2所用知识点
异常的定义和使用
3作业
按照如下要求完成InfrastructureException.java文件:
1.封装InfrastructureException异常类,代表对各种数据进行操作时发生的异常,程序对于这种异常是不能恢复的,如网络异常,数据库连接异常。
按照如下要求完成RepeatIdException.java文件:
2.封装RepeatIdException异常类,代表唯一标识重复异常,程序对于这种异常是可以恢复的。
按照如下要求完成RepeatLoginNameException.java文件:
3.封装RepeatLoginNameException异常类,代表登陆名重复异常,程序对于这种异常是可以恢复的。
按照如下要求完成ObjectNotFoundException.java文件:
4.封装ObjectNotFoundException异常类,代表查找的对象找不到异常,程序对于这种异常是可以恢复的。
按照如下要求完成RemoveSuperAdminException.java文件:
5.封装RemoveSuperAdminException异常类,代表删除超级管理员异常,程序对于这种异常是可以恢复的。
6.修改[任务二]中完成的AdminManagementBIZ,为接口中定义的方法添加异常,每个方法抛的异常如下:
✧addAdmin方法抛出RepeatIdException,RepeatLoginNameException异常
✧getAdminById方法抛出ObjectNotFoundException异常
✧removeAdmin方法抛出RemoveSuperAdminException异常
任务四掌握对文件的操作,并使用文件来存储数据完成管理员管理模块
1任务描述
使用文件作为数据的存储方式,使用文本作为和用户交互的界面,完成管理员管理模块。
2所用知识点
对文件的操作
3作业
修改[任务一]中完成的Admin.java文件:
1.修改代码,使得Admin实现java.io.Serializable接口.
修改[任务二]中完成的AdminDAO.java文件:
2.修改AdminDAO接口中定义的所有方法的签名,为所有的方法添加InfrastructureException异常.
按照如下要求完成FileAdminDAOImpl.java文件,将Admin对象用对象序列化的方式存入一个文件
3.封装FileAdminDAOImpl类,这个类实现了[任务二]中完成的AdminDAO接口
4.在该类中添加一个构造方法
方法签名:
publicFileAdminDAOImpl()throwsInfrastructureException
方法描述:
该方法首先要构造超级管理员对象,并将其存入指定的文件中,超级管理员信息如下:
成员名
值
id
0
name
kettas
loginName
kettas
loginPassword
kettas
phone
62790000
email
kettas@
enrollDate
null
注意:
id和loginName的值不能有重复的。
5.实现接口中的所有方法,注意实现这些方法时不要掺杂任何业务逻辑相关的代码,不要掺杂任何与交互有关的代码,这些方法只用于单纯地操作文件中的数据,当操作文件出现任何异常时都将这个异常转化为InfrastructureException异常抛出。
修改[任务二]中完成的AdminManagementBIZ.java文件:
6.修改AdminManagementBIZ接口中定义的所有方法的签名,为所有的方法添加InfrastructureException异常.
任务五分层来实现管理员管理模块
1任务描述
在本任务中我们要将管理员管理模块按照三层结构来实现。
DAO层负责对数据操作进行封装,BIZ层负责对业务逻辑进行封装,View层负责与用户进行交互,并使用接口来衔接各层。
2所用知识点
软件分层
3作业
根据[任务二]中完成的AdminDAO和AdminManagementBIZ接口,提供这些接口的实现,完成DAO层和BIZ层的代码,然后再完成View层的代码,并提供测试代码。
(在这个任务中还会使用到之前封装的Admin和异常类)具体的操作步骤如下:
按照如下要求完成OrdinaryAdminManagementBIZImpl.java文件:
1.封装OrdinaryAdminManagementBIZImpl类,这个类实现了[任务二]中完成的AdminManagementBIZ接口
2.在OrdinaryAdminManagementBIZImpl类,在该类中添加1个私有的成员
成员名
类型
含义
adminDAO
AdminDAO
用于保存AdminDAO的引用
3.在该类中添加一个构造方法
方法签名:
publicOrdinaryAdminManagementBIZImpl(AdminDAOadminDAO)
方法描述:
为adminDAO这个成员变量赋值。
4.实现接口中的所有方法,注意实现这些方法时不要掺杂任何与交互有关的代码,这些方法用于封装业务逻辑,如需要操作数据就调用adminDAO中的相关方法来完成。
按照如下要求完成TextAdminView.java文件:
5.封装TextAdminView类,在该类中添加1个私有的成员
成员名
类型
含义
adminBIZ
AdminManagementBIZ
用于保存AdminManagementBIZ的引用
6.在该类中添加一个构造方法
方法签名:
publicTextAdminView(AdminManagementBIZadminBIZ)
方法描述:
为adminBIZ这个成员变量赋值。
7.实现如下方法,完成管理员管理模块各个功能的交互代码:
✧publicvoidgetAllAdmin()
✧publicvoidaddAdmin()
✧publicvoidgetAdminById()
✧publicvoidmodifyAdmin()
✧publicvoidremoveAdmin()
添加以下提供的方法。
publicvoidlistComand(){
System.out.println("==============管理员管理系统命令列表====================");
System.out.println("|1---------显示所有的管理员|");
System.out.println("|2---------添加管理员|");
System.out.println("|3---------根据admin唯一标识查询管理员并显示|");
System.out.println("|4---------根据admin唯一标识修改管理员信息|");
System.out.println("|5---------根据admin唯一标识删除管理员|");
System.out.println("|6---------退出系统|");
System.out.println("|7---------显示命令列表|");
System.out.println("===============================================================");
}
publicvoidmainView(){
listComand();
l1:
while(true){
System.out.print("请输入你要执行的命令对应的数字>");
intc=SystemIn.readInt();
switch(c){
case1:
getAllAdmin();break;
case2:
addAdmin();break;
case3:
getAdminById();break;
case4:
modifyAdmin();break;
case5:
removeAdmin();break;
case6:
breakl1;
case7:
listComand();break;
}
}
}
按照如下要求完成AdminTest.java文件:
8.封装AdminTest类,在该类中添加主方法,代码如下:
publicclassAdminTest{
publicstaticvoidmain(String[]arg){
AdminDaoadminDAO=null;
try{
adminDAO=newFileAdminDAOImpl();
}catch(InfrastructureExceptione){
System.out.println("系统异常"+e.getMessage());
}
AdminManagementBIZadminBIZ=newOrdinaryAdminManagementBIZImpl(adminDAO);
TextAdminViewadminView=newTextAdminView(adminBIZ);
adminView.mainView();
}
}
9.运行AdminTest,测试管理员管理模块的所有功能。
任务六掌握使用Socket编写客户机/服务器方式的应用程序,并完成管理员管理模块的网络版
1任务描述
采用Socket完成管理员管理模块的网络版,其中客户端完成与用户的交互,服务器端完成业务逻辑和对数据的操作。
2所用知识点
Socket编程
3作业
1.封装Command,这个类实现了java.io.Serializable接口。
在之前写单机版程序时,各层之间通过方法调用衔接在一起;现在要使用Socket开发网络程序,客户端和服务器端的交互就不能再使用方法调用了,而要改为发送消息。
在java中这些消息就可以封装为对象来发送,在此作业中要求学员封装Command类,这个类就是用来封装消息的,包括客户端给服务器端发送的请求消息和服务器端执行后的结果消息。
这个类是一个抽象类,并且在客户端和服务器端都要使用。
✧这个类包含两个私有的成员,如下:
成员名
类型
含义
isSuccessful
boolean
服务器端处理是否成功
Reason
String
服务器端处理失败的原因
✧提供私有成员的set和get方法
✧这个类包含一个公开的抽象的方法:
方法签名:
publicabstractvoidexecute(AdminManagementBIZadminBIZ);
方法描述:
这个方法是一个抽象方法,会由Command的子类去实现,这个方法由服务器端调用业务类中的方法来完成业务逻辑。
2.封装Command的子类:
GetAllAdminCommand:
此类继承了Command,用于对查询所有管理员这个请求进行封装和对处理结果进行封装。
✧在这个类中添加一个私有的成员,如下:
成员名
类型
含义
Admins
Collection
保存服务器端查询出来的所有管理员
✧提供私有成员的set和get方法
✧在这个类中实现父类中定义的抽象方法execute,用于完成业务逻辑。
AddAdminCommand:
此类继承了Command,用于对添加管理员这个请求的封装和对处理结果的封装。
✧在这个类中添加一个私有的成员,如下:
成员名
类型
含义
Admin
Admin
保存客户端要添加的管理员
✧提供私有成员的set和get方法
✧在这个类中实现父类中定义的抽象方法execute,用于完成业务逻辑。
GetAdminByIdCommand:
此类继承了Command,用于对根据唯一标识查询管理员这个请求的封装和对处理结果的封装。
✧在这个类中添加一个私有的成员,如下:
成员名
类型
含义
Admin
admin
有两个作用:
1.用于保存客户端要查询的管理员的唯一标识。
2.用于保存服务器端查询出的管理员
✧提供私有成员的set和get方法
✧在这个类中实现父类中定义的抽象方法execute,用于完成业务逻辑。
ModifyAdminCommand:
此类继承了Command,用于对修改管理员这个请求的封装和对处理结果的封装。
✧在这个类中添加一个私有的成员,如下:
成员名
类型
含义
Admin
admin
用于保存客户端要修改的管理员信息
✧提供私有成员的set和get方法
✧在这个类中实现父类中定义的抽象方法execute,用于完成业务逻辑。
RemoveAdminCommand:
此类继承了Command,用于删除管理员这个请求的封装和对处理结果的封装。
✧在这个类中添加一个私有的成员,如下:
成员名
类型
含义
adminId
Long
用于保存客户端要删除的管理员的唯一标识
✧提供私有成员的set和get方法
✧在这个类中实现父类中定义的抽象方法execute,用于完成业务逻辑。
ExitCommand:
此类继承了Command,用于对客户端向服务器端发送的退出请求进行封装。
3.封装SocketClient,完成具体Command对象的封装和发送,在客户端的所有Socket代码都封装在此类中。
✧这个类包含三个私有的成员,如下:
成员名
类型
含义
S
.Socket
保存与服务器端交互的Socket的引用
Oos
java.io.ObjectOutputStream
保存Socket中用于发送Command对象的对象输出流
Ois
java.io.ObjectInputStream
保存Socket中用于接收Command对象的对象输入流
✧提供如下构造方法:
方法签名:
publicSocketClient(StringserverIp,intport)throwsException
方法描述:
在该方法中初始化成员变量s,oos和ois。
✧提供close方法:
方法签名:
publicvoidclose()
方法描述:
该方法用于关闭s,oos和ois。
✧提供exit方法:
方法签名:
publicvoidexit()throwsException
方法描述:
该方法用于构造一个ExitCommand对象,并将这个对象发送到服务器端。
✧提供getAllAdmin方法:
方法签名:
publicCollectiongetAllAdmin()throwsException
方法描述:
该方法用于将获取所有管理员的请求封装到GetAllAdminCommand对象中,并把这个对象发送到服务器端,然后接收服务器端返回的结果对象。
返回值:
从服务器端获取的结果对象中取出isSuccessful的值,如果为真,说明服务器端执行成功,获取结果对象(GetAllAdminCommand类型的对象)中的admins的值作为此方法的返回值;否则,说明服务器端执行时出现异常,在此方法中使用结果对象的reason的值来构造Exception对象,并抛出构造好的Exception。
✧提供addAdmin方法:
方法签名:
publicvoidaddAdmin(Adminadmin)throwsException
方法描述:
该方法用于将添加管理员的请求封装到AddAdminCommand对象中,并把这个对象发送到服务器端,然后接收服务器端返回的结果对象。
返回值:
从服务器端获取的结果对象中取出isSuccessful的值,如果不为真,说明服务器端执行时出现异常,在此方法中使用结果对象的reason的值来构造Exception对象,并抛出构造好的Exception。
✧提供getAdminById方法:
方法签名:
publicAdmingetAdminById(LongadminId)throwsException
方法描述:
该方法用于将根据唯一标识查询管理员的请求封装到GetAdminByIdCommand对象中,并把这个对象发送到服务器端,然后接收服务器端返回的结果对象。
返回值:
从服务器端获取的结果对象中取出isSuccessful的值,如果为真,说明服务器端执行成功,获取结果对象(GetAdminByIdCommand类型的对象)中的admin的值作为此方法的返回值;否则,说明服务器端执行时出现异常,在此方法中使用结果对象的reason的值来构造Exception对象,并抛出构造好的Exception。
✧提供modifyAdmin方法:
方法签名:
publicvoidmodifyAdmin(Adminadmin)throwsException
方法描述:
该方法用于将修改管理员的请求封装到ModifyAdminCommand对象中,并把这个对象发送到服务器端,然后接收服务器端返回的结果对象。
返回值:
从服务器端获取的结果对象中取出isSuccessful的值,如果不为真,说明服务器端执行时出现异常,在此方法中使用结果对象的reason的值来构造Exception对象,并抛出构造好的Exception。
✧提供removeAdmin方法:
方法签名:
publicvoidremoveAdmin(LongadminId)throwsException
方法描述:
该方法用于将删除管理员的请求封装到RemoveAdminCommand对象中,并把这个对象发送到服务器端,然后接收服务器端返回的结果对象。
返回值:
从服务器端获取的结果对象中取出isSuccessful的值,如果不为真,说明服务器端执行时出现异常,在此方法中使用结果对象的reason的值来构造Exception对象,并抛出构造好的Exception。
4.修改TextAdminView.java
✧删除成员变量adminBIZ,增加成员变量client:
成员名
类型
含义
client
SocketClient
用于保存SocketClient的引用
✧删除构造方法TextAdminView(SocketClientclient),增加构造方法publicTextAdminView(SocketClientclient),在这个方法中初始化成员变量client。
✧修改其他方法,将对AdminManagementBIZ的调用转换为对SocketClient中方法的调用。
✧增加exit方法
方法签名:
publicvoidexit()
方法描述:
客户端退出。
✧修改mainView方法,修改后的代码入下:
publicvoidmainView(){
listComand();
l1:
while(true){
System.out.print("请输入你要执行的命令对应的数字>");
charc=MyReader.readChar();
switch(c){
case'1':
getAllAdmin();break;
case'2':
addAdmin();break;
case'3':
getAdminById();break;
case'4':
modifyAdmin();break;
case'5':
removeAdmin();break;
case'6':
exit();breakl1;