迪士尼在逃公组 实验五 软件开发案例(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 服务器上的数据库或应用程序之间的中间层是如何工作的。同时,在我们遇到问题时,积极讨论,查阅资料,最终顺利的完成本次实验。