迪士尼在逃公组 实验五 软件开发案例(2)团队作业

项目 内容
课程班级博客链接 2020级卓越工程师班
这个作业要求链接 实验五 软件开发案例(团队作业)
团队名称 迪士尼在逃公组
分工 宋晔婷:任务一
何欣娜:任务二
米乐文:任务三
我的课程学习目标 1.理解MVC软件设计模式。
2. 练习并掌握JSP+JavaBean+Servlet技术实现的MVC设计模式。
3.练习UML建模技术。
这个作业在哪些方面帮助我实现学习目标 1.在理解MVC设计模式的过程中学习到它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,具有代码复用性高等特点。
2.通过练习JSP+JavaBean+Servlet的实验项目,实现MVC的设计模式,提升自己对MVC模式的理解。
团队博客链接 迪士尼在逃公组
团队Github链接 Github

任务一 :创建学生信息管理的Java web项目

(1)在MySQL中创建数据库:students

(2)在students数据库中创建学生信息表:student

(3)创建Web项目,项目名称为:studentmanager

(4)在项目的src包中创建包model、control、在WebRoot下创建JSP文件夹

src包中创建包model

src包中创建包control

WebRoot下创建JSP文件夹

添加成功

(5)在项目中添加MySQL数据库驱动包

(6)在src包中创建entity包存放实体类,创建实体类Student.java,其属性与数据库表的student的字段对应,程序中获取的数据库表student的记录就可存储到Student.java类的对象实例中。

在src包中创建entity包存放实体类

创建实体类Student.java

(7)在src包中创建dbutil包存放数据库连接工具类Dbconn.java

在src包中创建dbutil包

数据库连接工具类Dbconn.java

(8)分别对案例中四个模块的M、V、C层进行编码,并在项目中的WebRoot/WEB-INF/webWeb.xml中配置control包的6个Servelet控制器。

(9)将项目部署在Tomcat服务器,测试运行学生信息的增加、更新、删除、显示等操作。

将项目部署在Tomcat服务器

测试运行学生信息的增加操作

学生信息的增加成功

测试运行学生信息的删除操作

学生信息的删除成功

测试运行学生信息的显示操作

学生信息显示成功

测试运行学生信息的修改操作

学生信息的修改成功

任务二 :学生信息管理软件增量开发

(1)为案例软件开发一个新功能,可将excel文件的学生信息批量导入数据库。


说明
点击选择文件按钮,选择对应.xml文件



说明
点击上传按钮,跳转到ListStudentServlet

(2)在项目的WebRoot文件夹下创建一个upload文件夹用于存放用户上传的文件,增加学生信息字段:相片,根据相片字段的信息存储和维护完善案例软件,要求学生相片文件存放在服务器上项目的upload文件夹中,数据库中存放相片的文件名,显示相片时是根据文件名到该文件夹中访问图片文件而实现。

在项目的WebRoot文件夹下创建一个upload文件夹

说明
增加studentupload.jsp,提供相片上传功能,使用id作为主键检索对于学生用户信息。

studentuploadpic.jsp(点击查看代码)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传相片信息</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
    
</head>
<body>
  
 <center>
                <h1>插入相片信息</h1>
                <h1 id="msg"></h1>
                        
                        <form action="PicUploadServlet.do" method="post" enctype="multipart/form-data">

                                <p>学号: <input type="text" name="id"></p>
                                <p>  相片:
                                        <img width="100" height="100"  alt="当前尚未上传头像"> 
                                  <input type="file" name="picpath" />
                                  <input type="submit" value="上传">
                                <br></p>
                                
                        </form>
     </center>
   
</body>

</html>

说明
编写处理上传的相片的工具,判断文件类型,同时重新对相片名称进行编码,使用id_相片名.后缀名格式,防止反复上传与命名覆盖问题。

MyPicUtiles.java(点击查看代码)
package utils;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.*;

public class MyPicUtiles {
 private static final long serialVersionUID = 1L;
 
 public static  boolean isPic(String fileName) {
		String type = ".jpg";
		// 文件的后缀名
		String fileType = fileName.substring(fileName.lastIndexOf("."));

		if (type.equalsIgnoreCase(fileType)) {
			return true;
		}

		return false;
	}
 public Map<String,String> File_upload(HttpServletRequest request,String filepath) {
     //判断上传的表单是否为multipart/form-data类型
     if (ServletFileUpload.isMultipartContent(request)) {

         try {
             //1.创建DiskFileItemFactory对象,设置缓冲区大小和临时目录文件
             DiskFileItemFactory factory = new DiskFileItemFactory();
             //2.创建对象,并设置上传文件的大小限制
             ServletFileUpload sfu = new ServletFileUpload(factory);
             sfu.setSizeMax(10 * 1024 * 1024);//以byte为单位 1024byte->1KB*1024=1M->1M*10=10M
             sfu.setHeaderEncoding("utf-8");

             //3.调用ServletFileUpload.parseRequest方法来解析对象,得到一个保存了所有上传内容的List对象
             List<FileItem> fileItemList = sfu.parseRequest(request);
             Iterator<FileItem> fileItems = fileItemList.iterator();

             //创建一个Map集合,用于添加表单元素
             Map<String, String> map = new TreeMap<String, String>();

             //4.遍历fileItems,每迭代一个对象,调用其isFormField方法判断是否是上传文件
             while ((fileItems.hasNext())) {
                 FileItem fileItem = fileItems.next();
                 try{
                     //普通的表单元素
                     if (fileItem.isFormField()) {
                         String name = fileItem.getFieldName();//name的属性值
                         String value = fileItem.getString("utf-8");//name对应的value值
                         //添加进Map集合中
                         map.put(name, value);
                     } else {//否则即为<input type="file">上传的文件
                         if(fileItem.getName()==null||fileItem.getFieldName()==null){
                             map.put("fileName","empty");
                             map.put("newFileName","empty");
                         }else {
                             String fileName = fileItem.getName();// 文件名称
                             System.out.println("原文件名:" + fileName);// Koala.jpg

                             String suffix = fileName.substring(fileName.lastIndexOf('.'));
                             System.out.println("扩展名:" + suffix);// .jpg

                             // 新文件名(唯一)
                             String newFileName = new Date().getTime() + suffix;
                             System.out.println("新文件名:" + newFileName);// image\1478509873038.jpg

                             //将文件名存入到数组中
                             map.put("fileName", fileName);
                             map.put("newFileName", newFileName);


                             // 5. 调用FileItem的write()方法,写入文件
                             String context = filepath+newFileName ;
                             System.out.println("图片的路径为"+context);
                             File file = new File(context);
                             System.out.println(file.getAbsolutePath());
                             fileItem.write(file);

                             //判断该文件是否为head_img下默认的头像,如果不是才执行删除
                             if(!fileName.contains("empty")|| !newFileName.contains("empty")){
                                 // 6. 调用FileItem的delete()方法,删除临时文件
                                 fileItem.delete();
                             }

                         }

                     }
                 }catch (StringIndexOutOfBoundsException e ){
                     //若为空指指针
                     //未上传图片则按原来的图片显示
                     //设置为false,在进行数据库操作时不对图片进行操作
                     System.out.println("出现异常");
                     map.put("fileName","empty");
                     map.put("newFileName","empty");
                     e.printStackTrace();
                 }

             }
             return map;
         } catch (FileUploadException e) {
             e.printStackTrace();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
     return  null;
 }

}



说明
同时在studentinsert中加入上传相片的功能,实现同步更新相片。

说明
增加相片上传输入框

插入学生信息展示

PicUploadServlet.java(点击查看代码)
package control;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import model.StudentModel;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import utils.MyPicUtiles;

@MultipartConfig
@WebServlet("/PicUploadServlet")
public class PicUploadServlet extends HttpServlet {
    //为类可持久化
    private static final long serialVersionUID = 1L;
    public PicUploadServlet(){
		super();
		// TODO Auto-generated constructor stub
	}
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	  Part picPart = request.getPart("pic");
    	  int id = Integer.parseInt(request.getParameter("id"));
    	  StudentModel model = new StudentModel();
	 	    
          if (picPart != null){
              String fileName = picPart.getSubmittedFileName();
              if (MyPicUtiles.isPic(fileName)) {
                  //为了避免文件重名,给它重新命名
                  fileName = id + "_" + fileName;
                  //获取文件存放目录的真实路径
                  String dirPath = this.getServletContext().getRealPath("/img");
                  //保存文件
                  picPart.write(dirPath + "/" + fileName);
                  model.addPic(id, fileName);
              }
          }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

42号同学增加成功,跳转到此页面

查看数据库,增加图片信息

(3)将任务1与任务2的完成的学生信息管理软件源码上传到团队github仓库。

Disney_Test5 Github

任务三 :学生信息管理软件增量开发

1.总结Servlet技术的工作原理

  servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。Servlet只有放在容器中才能执行,最常见的容器为Tomcat。

(1)浏览器向服务器发送GET请求,请求服务器ServletA
(2)服务器上的Servlet 容器接收到该URL,根据该URL判断为Servlet请求,此时Servlet 容器将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)
(3)Servlet 容器对请求的 URL 进行解析并根据web.xml配置文件找到处理该请求的Servlet(ServletA),并创建一个线程A
(4)Servlet 容器将刚才创建的请求对象和响应对象传递给线程A
(5)Servlet 容器调用Servlet的service()方法
(6)service()方法根据请求类型(本示例为GET请求)调用doGet() (本示例调用doGet()) 或doPost()方法
(7)doGet()执行完后,将结果返回给Servlet 容器,线程A被销毁或被放在线程池中

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
  Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。

2.总结MVC设计模式的特点

  MVC 是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。

优点:
  (1) 降低代码耦合性。在 MVC 模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
  (2) 有利于分工合作。在 MVC 模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可进行开发视图层中的 JSP,而对业务熟悉的人员可开发业务层,而其他开发人员可开发控制层。
  (3) 有利于组件的重用。如控制层可独立成一个能用的组件,表示层也可做成通用的操作
缺点:
  (1) 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循 MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。界面。可以为一个模型在运行时同时建立和使用多个视图。
  (2) 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

记录完成《实验四 软件开发案例(1)团队作业》各项任务实际花费的时间和成员分工

  • 完成各项任务花费的时间
任务内容 预计花费时间 (min) 实际花费时间 (min)
任务一:创建学生信息管理的Java web项目 90 130
任务二:学生信息管理软件增量开发 60 100
任务三 :完成《实验五 软件开发案例(2)团队作业》团队博文作业 130 230
  • 成员分工
成员 分工
米*文 1.完成团队博客的撰写
2.在src包中创建dbutil包存放数据库连接工具类Dbconn.java
3.将项目部署在Tomcat服务器,测试运行学生信息的增加、更新、删除、显示等操作。
4.将任务1与任务2的完成的学生信息管理软件源码上传到团队github仓库
5.撰写个人心得并汇总
何*娜 1.为案例软件开发一个新功能,可将excel文件的学生信息批量导入数据库。
2.在项目的WebRoot文件夹下创建一个upload文件夹用于存放用户上传的文件,增加学生信息字段:相片,根据相片字段的信息存储和维护完善案例软件,学生相片文件存放在服务器上项目的upload文件夹中,数据库中存放相片的文件名,显示相片时是根据文件名到该文件夹中访问图片文件而实现。
3.在src包中创建entity包存放实体类,创建实体类Student.java,其属性与数据库表的student的字段对应,程序中获取的数据库表student的记录就可存储到Student.java类的对象实例中。
4.撰写个人心得
宋*婷 1.在MySQL中创建数据库:students
2.在students数据库中创建学生信息表:student
3.创建Web项目,项目名称为:studentmanager
4.在项目的src包中创建包model、control、在WebRoot下创建JSP文件夹
5.在项目中添加MySQL数据库驱动包
6.撰写个人心得
7.完成实验三的两个题目
  • 每位团队成员总结实验学习心得。
    何*娜
      本次实验,有上次实验作为我们的经验,例如将excel文件的学生信息批量导入数据库这个功能,在上个实验也有完成,所有本次实验在做这个任务时就没有之前那么迷茫,也让我们充分认识到积累经验的重要性。也通过对案例中四个模块的M、V、C层进行编码,配置服务器,充分体会到了MVC软件的设计模式,在做实验的过程中也遇到了很多的问题,但通过小组交流合作成功解决,我们之间的配合也越来越默契。
    米*文
     通过本次实验,主要体会到了MVC模式是软件工程中常见的一种软件架构模式,它把软件系统分为三个基本部分:模型、视图和控制器,理解了MVC软件设计模式,也充分体会到了该模式的优缺点,它实现了显示模块与功能模块的分离,提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度,对我们开发项目提供了可靠的支持。同时,我们团队互相配合、团队协作,顺利完成本次任务,收获颇丰。
    宋*婷
     本次实验主要练习并掌握JSP+JavaBean+Servlet技术实现的MVC设计模式,总结了MVC设计模式的特点和Servlet技术的工作原理,更清楚的知道了MVC设计模式的优缺点以及具体的应用步骤,以及Servlet技术的工作原理,了解了Servlet作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层是如何工作的。同时,在我们遇到问题时,积极讨论,查阅资料,最终顺利的完成本次实验。

posted @ 2023-05-13 14:07  迪士尼在逃公组  阅读(135)  评论(0编辑  收藏  举报