【Java】《面向对象与多线程综合实验》报告

说明:这是武汉理工大学计算机学院面向对象与多线程综合实验课程的实验报告


《面向对象与多线程综合实验》报告

1 实验目的

  运用Java语言,以迭代方式逐步编程实现一个小型档案管理系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的具体实现方法。


2 系统功能与描述

1)  用户登录:根据用户输入的登录名、密码进行验证登陆,通过验证后方可登陆系统。将用户的角色分为系统管理人员、档案录入人员,档案浏览人员三类,根据用户的角色,为用户分配不同的可执行操作。

2)  档案浏览员功能:能进行档案的浏览和档案的下载,并且可以自定义文件下载保存的路径;还可以进行个人密码等信息的修改。

3)  档案录入员功能:可进行任意位置的档案的上传,并能够实现档案浏览员的全部功能。

4)  系统管理员功能:可以进行添加新用户、修改某个已存在用户的密码和角色以及删除某个已存在的用户,并且能实现档案浏览员的全部功能。

5)  GUI界面设计:将上述功能使用GUI实现,以达到人机交互的作用,使用户能够轻松使用,轻松实现各项功能。

6) 将用户的信息以及上传的文件信息保存到数据库中,以便系统退出再次登录后,信息保持不变。

 

3 模块设计

 3.1 GUI模块

  3.1.1 登录模块

   1)     功能介绍:提示用户输入登录名和密码,并将密码显示为不可见,然后进行角色匹配,将展示的用户界面中不可用的功能设置为不可访问。

   2)      界面展示:

   3)      流程图:

   4)      登陆窗口的界面设计的伪代码:

public loginFrame() {

             super("欢迎使用档案管理系统");  ……

             //定义【输入账号】的 【文本框】

             TextFieldinputUserName_Field = new TextField();  ……

             //定义【输入密码】的【文本框】

             JPasswordFieldinputUserPassword_Field = new JPasswordField(); 

                   ……

/*监听输入密码的文本框,判断输入的内容是否为回车,以实现快速登陆*/

             inputUserPassword_Field.addKeyListener(newKeyAdapter() {

                    publicvoid keyPressed(KeyEvent e) {

//如果按下回车,将当前用户名、密码文本框的文本长度、内容传递给successLogin(……)方法进行登陆判断

                           if(e.getKeyChar()== KeyEvent.VK_ENTER )  {

                                  successLogin(inputUserName_Field.getText().length(),

inputUserPassword_Field.getText().length(),

inputUserName_Field.getText(),

inputUserPassword_Field.getText());

                           }}

             });

/*【登陆】按钮及其【监听】*/

             JButton login = new JButton("登陆");

             login.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                           successLogin(……同上); }

             });                              ……
      }

   successLogin方法:

       publicvoid successLogin(int namelength,int passwordlength,String userName,StringuserPassword) {

              //如果用户没有输入任何信息,就点击【登陆】按钮,进行提示

              if(namelength==0|| passwordlength==0) {  

                     JOptionPane.showMessageDialog(null,"用户名或密码为空! ");}

              //用户正常输入用户名和密码,点击【登陆】按钮,程序正常进行 

              else{

                     Userusr = DataProcessing.searchUser(userName, userPassword);

……

                     //如果没有找到

                     if(usr== null) {

                            JOptionPane.showMessageDialog(null,"用户名或密码错误!");

                     }else{

                            userRole = usr.getRole();    //得到当前用户的角色

                            userName= usr.getName();    //从数据库中获取当前用户名

                            loginFrame.this.setVisible(false);   //将当前登陆界面设置不可见

                            userFramef2 = new userFrame(userName,userRole);                 

    f2.setVisible(true);//显示登陆之后的界面

                     ………………

                     }//else

              }//else

       }//successLogin()

 

  

  3.1.2用户管理模块

   1)     功能介绍:此模块为系统管理员专属的界面,共分为添加、删除、修改用户三个版面。添加用户界面,提供新用户名、新密码的文本输入框和新用户角色选择的下拉框;删除用户界面,通过下拉菜单展示全部当前数据库中的全部用户名,通过鼠标的当前选择来确定要删除的用户;修改用户界面,可以实现某个用户的密码和角色的修改,同样通过下拉菜单显示全部信息。

   2)      界面展示:

   3)      设计伪代码:

      //**用户管理界面**//

      publicuserManageFrame() throws SQLException {

             setTitle("用户管理界面");

……

             //**通过tabbedPane来建立可跳转的标签***//

             JTabbedPanetabbedPane = new JTabbedPane(JTabbedPane.TOP); ……

 

             /*****【修改用户】标签以及其可执行操作***/

             JPanelchangeUserInfo = new JPanel();

             tabbedPane.addTab("修改用户", null, changeUserInfo, null);

……

             //******使用【下拉标签】展示全部【用户名】************//

             JComboBox<String>userNameChoose_change = new JComboBox();

             //****将表中的 用户信息添加到 下拉菜单中***************

             Enumeration<User>d;

             d =DataProcessing.getAllUser();

             intindex = DataProcessing.users.size();

             for(int i = 0; i < index; i++) {

                    Usera2 = d.nextElement();

                    userNameChoose_change.addItem(a2.getName());

             }

             //userNameChoose_change.setSelectedItem(null);

             userNameChoose_change.setBounds(166,27, 132, 24);

             changeUserInfo.add(userNameChoose_change);

……

             //****使用【下拉标签】展示全部【角色】*//

             JComboBoxuserRoleChoose_change = new JComboBox();

             userRoleChoose_change.setModel(newDefaultComboBoxModel(new String[] {"administrator","operator", "browser"}));

             userRoleChoose_change.setBounds(166,111, 132, 24);

             changeUserInfo.add(userRoleChoose_change);

            

             //**点击【修改】按钮,执行用户信息修改操作****//

             JButtonsuer_change = new JButton("修改");  //“修改”用户信息按钮

             suer_change.addActionListener(newActionListener() {

                    publicvoid actionPerformed(ActionEvent e) {

                    Stringrole = userNameChoose_change.getSelectedItem().toString();

                          if(/*如果输入的信息正确,非空*/){   

 if(change.changeUserInfo(/*相关参数*/)) { //如果通过修改

                                  JOptionPane.showMessageDialog(null,"信息修改成功!");

                                  //  插入刷新方法,刷新用户管理界面的用户信息};

                            }

                           else{

                                  JOptionPane.showMessageDialog(null,"请输入口令!!!");

                           }           

                    }

             });

            

             //**【删除用户】标签以及其可执行操作**//

             JPaneldeleteUser = new JPanel();

             tabbedPane.addTab("删除用户", null, deleteUser, null);

……

             JButtonsure_del = new JButton("删除"); //确认“删除”用户按钮

             sure_del.addActionListener(newActionListener() {

                    publicvoid actionPerformed(ActionEvent e) {

                           Stringabc = null;

                           Administratordel = new Administrator(abc, abc, abc);

                           if(del.delUser(userDelNameList.getSelectedItem().toString())){

                              JOptionPane.showMessageDialog(null, "用户删除成功!");

                                  //添加刷新方法,将界面刷新   

……

             //**【添加用户】标签以及其可执行操作****//

             JPaneladdUser = new JPanel();

             tabbedPane.addTab("新增用户", null, addUser, null);

             userName_input= new JTextField();              ……

             userPassword_input= new JTextField();           ……

             JComboBoxuserRole_list = new JComboBox();     ……

             addUser.add(userRole_list);

             JButtonsure_add = new JButton("添加"); //“添加”用户按钮

             sure_add.addActionListener(newActionListener() {

                    publicvoid actionPerformed(ActionEvent e) {

                    if(/*用户输入的信息无误,非空*/ ) {

                           if(add.addUser(/*相关参数*/) {

                                  JOptionPane.showMessageDialog(null,"用户添加成功!");

                                  //添加刷新方法,将当前界面刷新 }

                           elseJOptionPane.showMessageDialog(null, "用户已存在!!!");

                    }

                    else JOptionPane.showMessageDialog(null,"用户添加失败!");

             }

      });

………………


  3.1.3 文件下载模块

   1)     功能介绍:首先通过列表展示当前已存在的全部文件信息,然后根据用户的需求,点击下载按钮,输入要下载的文件档案号,再选择要保存的路径,点击下载即可实现下载。

    2)      界面展示:

   3)      上传文件方法代码:

       publicboolean downloadFile(String ID,String downloadpath) throws IOException,SQLException{

              try{

                     byte[]buffer=new byte[1024];

                     Docdoc=DataProcessing.searchDoc(ID);                

                     if(doc==null)      return false;

                     String  uploadpath=uploadpaths+doc.getFilename();

                  Stringdownloadpaths=downloadpath+"\\"+doc.getFilename();

BufferedInputStream infile=new BufferedInputStream(newFileInputStream(uploadpath) );

                     BufferedOutputStreamtargetfile=new BufferedOutputStream(new FileOutputStream(downloadpaths) );

                     while(true)

                     {     int byteRoad=infile.read(buffer);//从文件数据给字节数组

                            if(byteRoad==-1)//在文件尾,无数据可读

                                   break;

                            targetfile.write(buffer,0, byteRoad);//将读到的数据写入目标文件

                     }

                     infile.close();      targetfile.close();       return true;

              }catch(Exceptione) {

                     System.out.println("下载文件操作出错"+e.toString());        }

              returnfalse;

       }

      


  3.1.4 文件上传模块

   1)     功能描述:提示用户输入档案号,从资源管理器中选择要上传的文件,以及输入文件描述等信息,执行确认上传操作。

   2)      界面展示:

   3)      上传文件代码:

public boolean uploadFile(String ID,Stringfilename,String description,String filepath) throws IOException, SQLException{

      try { 

               int byteread = 0; 

               File oldfile = new File(filepath); 

               String targetfile = uploadpaths +File.separator +  oldfile.getName(); 

                  if (oldfile.exists()) { //文件存在时 

                    InputStream inStream = newFileInputStream(filepath); //读入 

                    FileOutputStream fs = newFileOutputStream(targetfile); 

                    byte[] buffer = new byte[1444]; 

                    while ((byteread =inStream.read(buffer)) != -1) { 

                       fs.write(buffer, 0, byteread);  } 

                    inStream.close();

                    fs.close();

       Timestamp timestamp = newTimestamp(System.currentTimeMillis());

       DataProcessing.insertDoc(ID, userName,timestamp, description, filename);

                    return true;

                    } 

             else return false;

                     } catch (Exception e) { 

                          System.out.println("上传文件操作出错"+e.toString());

                     }

                  return false;

             }

 

  

  3.1.4 个人信息修改模块

   1)     功能介绍:仅供每个用户修改自己的密码。需要核实当前密码是否正确才能进行修改,否则不给予通过。

   2)     流程图:

     3)      运行结果展示:

   4)      逻辑伪代码:

if(/*读取数据库成功并且原密码正确*/)

      if( (/*新密码文本框内容一致并且不为空*/) {

             if(/*调用修改密码方法,返回值为true*/)

                    /*显示提示框:密码修改成功*/

             else{

                    /*显示提示框:密码修改失败*/  }                                                     }

      else {

             /*显示提示框:新密码不一致或为空!*/}    

else {

      /*显示文本框:原密码错误!!*/              }


 3.2 数据库模块

1)     功能介绍:将添加的用户信息、上传的文件信息等数据改为储存在数据库中,后期直接从数据库中读取数据。

2)     运行截图:


4 开发难点与体会

  1)刚开始实验的时候,已经提供了DataProcessing类和User类,并将信息保存在Hashtable中。除了理解提供的两个类、对类中的方法实现的功能的理解和如何调用之外,并没有多大的难点。

  2)输入输出流的难点:这是在第三次实验中实现的功能。由于当时做实验的时候,刚开始学这一部分,对课本上的内容也是一知半解,并没有深刻理解,所以做实验的时候难度比较大。特别是两个文件流outputstream和inputstream的用法以及它们的方法,都不是很熟悉,做实验的时候,理想与现实的差距有点大。

  最终,除了仔细研究课本之外,通过网上CSDN博客的实例,也学到了不少关于文件处理的方法,更加深刻理解了输入输出流的使用。

  3)GUI开发难点:前三次实验都是类似于命令行的基本操作,功能实现相对较简单。然而,到了GUI设计的时候,要求改写成窗口界面,瞬间感觉难度挺大。比如,各种文本框的布局如何安排,文件列表怎么写……不过,通过老师教我们使用的windowbuilder来构建窗口界面,瞬间感觉难度降低了。不过,面对各种容器与组件,又无从下手。在预览窗口左侧显示的各种组件,每一个是做什么的,大部分不是很清楚。所以,只好逐个测试。为了使界面面板的每个文本框、按钮等组件可随意调节大小,发现使用绝对布局可以实现。但是,文件列表缺无法显示列表头,只能显示列表中的信息。只好通过网上的实例,发现加上一句话,就可以实现了。

  4)除此之外,实验并不是只做一个窗口界面,而是需要登陆界面、文件管理界面、用户管理界面、个人信息界面……问题就是,如何通过一个界面的按钮,调用出另一个界面?当某个列表的信息修改了之后,如何刷新列表的信息?对于界面之间的调用,刚开始准备在一个类里边实现,但发现难度太大,而且好多内容不是很理解,所以,就为每一个界面创建一个类,全部界面的类编写完毕之后,从登陆界面的类开始,为其他界面的类创建对象来实现窗口的调用,这样难度减小了,各种逻辑关系也可以得到很好的处理。对于刷新界面,可以采用将当前需要刷新信息的界面关闭,重新创建一个该界面类的对象,再次打开这个界面即可实现刷新。

  5)数据库开发难点:主要是因为对于数据库并不熟悉,改写Dataprocessing类的时候,出现各种各样的错误,像语法错误,或者是某个类的调用错误。还有就是以前在其他类可以直接获取本类中的信息的参数错误,只能通过本类的方法返回值来获取相关信息。


5 实验总结

  首先是巩固了基本的Java知识。

  本学期的Java语言程序设计课程所学的众多的内容,仅仅通过两次的Java实验是不能够全面覆盖的。所以,通过本次的面向对象与多线程综合实验,基本上覆盖了课堂所学的知识,将理论知识付诸实践当中,熟悉知识的同时,深刻理解了Java语言的魅力,还体会到了Java语言与C++编程的不同之处。

  其次是深刻理解了面向对象编程的基本思想。

  在以前,编程的时候喜欢将代码全部写进一个函数中,或者直接写进主函数中。这样,不仅代码看起来混乱。而且容易造成代码上的逻辑关系错误。通过本次多线程实验的迭代开发,我深刻的体会到封装的重要性。将每个部分,将要实现什么功能写成一个方法,只进行参数之间的传递,这样,如果出现错误,容易修改。而且,特别是一次次的迭代开发,每次的功能增加,修改的代码可以大大减少,提高了编写效率。

  再次,懂得了理论联系实际的重要性。

  课堂上,我们学到的仅仅是理论,只知道这个类是做这个的,这个方法实现的是这样的功能,可能当堂记住了,可是课后再来看的时候,又多了几分陌生。仅仅有理论是远远不够的,等到实践的时候,却发现现实并没有那么简单。这其中会遇到各种各样的困难,各种各样的错误。当然,还有随着开发软件的更新换代,旧的方法可能并不适用了。还有就是,基本的理论并不能满足当前实验的需求,这就要求我们自主学习。通过本次使用,从课外也学到了不少知识。

  最后,发现了自己的不足之处,对下一步学习起到了警示。

  通过这次实验,发现自己的不足之处。Java很强大,可是自己了解的还是太少,对其中的很多简单的可以直接调用的方法,却要自己去写。对Java的类库知道的太少,每个类的方法所实现的功能不熟悉,需要逐个看,所以导致实验的时候,速度提不上去而浪费了时间。总之,就是对知识掌握的不够牢固,知识面比较窄。今后的学习,要巩固基本知识的同时,广泛涉猎各种拓展知识。

  通过本次实验,收获知识的同时,也发现了自己的不足之处。虽然实验结束,但学习的脚步一直未停歇。今后的学习,不仅要将实验中学到的知识再次升华,还有积极改进学习中的不足之处,争取在今后的学习中更进一步!


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cxh_1231/article/details/79889115
个人分类: Java语言程序设计
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭