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

  • 说明:这是武汉理工大学计算机学院【面向对象与多线程综合实验】课程的实验报告
  • >>点击查看WUTer计算机专业实验汇总
  • 谨记:纸上得来终觉浅,绝知此事要躬行。

【Java】《面向对象与多线程综合实验》报告_第1张图片

 

 

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

1 实验目的

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

 

2 系统功能与描述

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

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

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

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

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

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

 

3 模块设计

 3.1 GUI模块

  3.1.1 登录模块

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

   2)      界面展示:

【Java】《面向对象与多线程综合实验》报告_第2张图片

   3)      流程图:

【Java】《面向对象与多线程综合实验》报告_第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)      界面展示:

【Java】《面向对象与多线程综合实验》报告_第4张图片

   3)      设计伪代码:

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

      publicuserManageFrame() throws SQLException {

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

……

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

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

 

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

             JPanelchangeUserInfo = new JPanel();

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

……

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

             JComboBoxuserNameChoose_change = new JComboBox();

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

             Enumerationd;

             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)      界面展示:

【Java】《面向对象与多线程综合实验》报告_第5张图片

   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)      界面展示:

【Java】《面向对象与多线程综合实验》报告_第6张图片

   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)     流程图:

【Java】《面向对象与多线程综合实验》报告_第7张图片

     3)      运行结果展示:

【Java】《面向对象与多线程综合实验》报告_第8张图片

   4)      逻辑伪代码:

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

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

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

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

             else{

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

      else {

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

else {

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

 

 3.2 数据库模块

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

2)     运行截图:

【Java】《面向对象与多线程综合实验》报告_第9张图片

 

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的类库知道的太少,每个类的方法所实现的功能不熟悉,需要逐个看,所以导致实验的时候,速度提不上去而浪费了时间。总之,就是对知识掌握的不够牢固,知识面比较窄。今后的学习,要巩固基本知识的同时,广泛涉猎各种拓展知识。

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

 

你可能感兴趣的:(Java语言程序设计,武汉理工大学,面向对象与多线程)