202309-发际线与你们作队 实验五:软件开发案例(2)(团队作业)
项目 | 内容 |
---|---|
课程班级博客链接 | 2020卓越工程师班 |
这个作业要求链接 | 实验五 软件开发案例(2) |
团队名称 | 发际线与你们作队 |
我的课程学习目标 | 完成软件开发案例(2) |
这个作业在哪些方面帮助我实现学习目标 | 1.理解MVC软件设计模式。 2.练习并掌握JSP+JavaBean+Servlet技术实现的MVC设计模式。 3.练习UML建模技术。 4.通过团队内部交流感受完成软件开发过程,总结团队未注意到的细节。 |
团队博客链接 | 发际线与你们作队 |
一、创建学生信息管理的Java web项目
-
在IDEA上创建JavaWeb项目
-
(1)在MySQL中创建数据库:students
-
(2)在students数据库中创建学生信息表:student
-
(3)创建Web项目,项目名称为:studentmanager
![]
-
(4)在项目的src包中创建包model、control、在WebRoot下创建JSP文件夹
-
在src包中创建包model、control
-
在WebRoot下创建JSP文件夹
-
-
(5)在项目中添加MySQL数据库驱动包
-
(6)在src包中创建entity包存放实体类,创建实体类Student.java,其属性与数据库表的student的字段对应,程序中获取的数据库表student的记录就可存储到Student.java类的对象实例中
-
(7)在src包中创建dbutil包存放数据库连接工具类Dbconn.java
-
(8)分别对案例中四个模块的M、V、C层进行编码,并在项目中的WebRoot/WEB-INF/webWeb.xml中配置control包的6个Servelet控制器。学生信息列表模块:studentlist.jsp(V)、SearchStudent.java(M)、ListStudentServelet.java(C)。新增学生信息模块:studentinsert.jsp(V)、InsertStudent.java(M)、InsertStudentServlet.java(C)。修改学生信息模块:studentupdate.jsp(V)、SelectStudent.java+UpdateStudent.java(M)、UpStudentServlet.java(修改前)、DoStudentServlet.java(修改后)。删除学生信息模块:studentshow.jsp(V)、SelectStudent.java+DeleteStudent.java(M)、ShowStudentServlet.java(删除前)、DeleteStudentServlet.java(删除后)
-
(9)将项目部署在Tomcat服务器,在浏览器输入:http://localhost:8080/studentmanager/ListStudentServlet.do,测试运行学生信息的增加、更新、删除、显示等操作
-
将项目部署在Tomcat服务器(1)
-
将项目部署在Tomcat服务器(2)
-
显示学生信息列表
-
插入学生信息
-
插入后的学生信息列表
-
修改学生信息列表
-
修改后的学生信息列表
-
删除学生信息
-
删除后的学生信息列表
-
二、学生信息管理软件增量开发
-
(1)为案例软件开发一个新功能,可将excel文件的学生信息批量导入数据库。
-
excel上传前学生信息列表
-
excel上传后学生信息列表
-
接受excel加入数据库(代码部分)
-
点击查看代码
public class UpFileServlet extends HttpServlet {
/**
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
private void process(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding(request.getCharacterEncoding());
ExcelHelper helper = new ExcelHelper();
StudentModel model = new StudentModel();
try {
List<FileItem> list = upload.parseRequest( request);
for (int i = 0; i < list.size(); i++) {
FileItem item = list.get(i);
if (item.getName().endsWith(".xls") || item.getName().endsWith(".xlsx")) {
// 说明是文件,不过这里最好限制一下
//ExcelHelper.importXls(item.getInputStream());
ArrayList<Student> students = helper.importXlsx(item.getInputStream());
out.write("{\"result\":\"OK\"}");
for (Student student:students) {
//System.out.println(users.toString());
model.insert(student.getId(),student.getName(),student.sex,student.getAge(),student.getGrade(),student.getScore());
}
response.sendRedirect("/ListStudentServlet.do");
} else {
// 说明文件格式不符合要求
out.write("{\"result\":\"Invalid\"}");
}
}
out.flush();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
-
(2)在项目的WebRoot文件夹下创建一个upload文件夹用于存放用户上传的文件,增加学生信息字段:相片,根据相片字段的信息存储和维护完善案例软件,要求学生相片文件存放在服务器上项目的upload文件夹中,数据库中存放相片的文件名,显示相片时是根据文件名到该文件夹中访问图片文件而实现。
-
显示相片
-
学生信息列表显示(有相片)
-
接收头像并且将其加入到数据库的类(代码部分)
-
点击查看代码
public class IMGFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
// 处理文件上传
int id= Integer.parseInt(request.getParameter("id"));
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items;
StudentModel studentModel = new StudentModel();
Student student = studentModel.load(id);
try {
items = upload.parseRequest(request);
int sum=0;
String avatarFilePath = null;
for (FileItem item : items) {
// 处理文件上传
String fileName = item.getName();
if (!fileName.isEmpty()) {
sum++;
String uploadPath = getServletContext().getRealPath("/") + "uploads/";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
File uploadedFile = new File(uploadPath + fileName);
item.write(uploadedFile);
avatarFilePath = "uploads/" + fileName;
System.out.println("图片名:"+fileName);
System.out.println("图片保存的路径:"+uploadPath+fileName);
student.setImgUrl(fileName);
//studentImgs.add(student);
}
}
studentModel.addPhoto(id,student.imgUrl);
request.setAttribute("student", student);
//request.setAttribute("imgList", studentImgs);
request.setAttribute("error", sum);
//request.getRequestDispatcher("UpdateStudentservlet.to").forward(request, response);
request.getRequestDispatcher("/jsp/studentupdate.jsp").forward(request, response);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-
(3)将任务1与任务2的完成的学生信息管理软件源码上传到团队github仓库。
-
上传至GitHub
-
点击此处进入GitHub仓库
-
三、实验总结
1. 任务时间列表(单位:min)
任务内容 | 预计花费时长 | 实际花费时长 |
---|---|---|
在MySQL中创建数据库:students | 1 | 1 |
在students数据库中创建学生信息表:student | 1 | 4 |
创建Web项目,项目名称为:studentmanager | 5 | 40 |
将在项目的src包中创建包model、control、在WebRoot下创建JSP文件夹 | 2 | 2 |
在项目中添加MySQL数据库驱动包 | 1 | 1 |
在src包中创建entity包存放实体类 | 3 | 3 |
在src包中创建dbutil包存放数据库连接工具类Dbconn.java | 2 | 2 |
分别对案例中四个模块的M、V、C层进行编码,并在项目中的WebRoot/WEB-INF/webWeb.xml中配置control包的6个Servelet控制器。 | 8 | 8 |
将项目部署在Tomcat服务器,在浏览器测试运行学生信息的增加、更新、删除、显示等操作 | 10 | 150 |
为案例软件开发一个新功能,可将excel文件的学生信息批量导入数据库。 | 30 | 50 |
在项目的WebRoot文件夹下创建一个upload文件夹用于存放用户上传的文件,增加学生信息字段:相片,根据相片字段的信息存储和维护完善案例软件 | 70 | 250 |
将任务1与任务2的完成的学生信息管理软件源码上传到团队github仓库 | 10 | 20 |
完成《实验五 软件开发案例(2)团队作业》团队博文作业 | 50 | 120 |
2. 成员分工
成员 | 分工 |
---|---|
张*国 | Tomcat部署以及博客编写 |
邓*超 | 实现将包导入IDEA以及运行调试 |
马*财 | 完成增量开发内容以及改bug |
潘*荣 | Java web项目初步创建以及博客编写 |
3.总结Servlet技术的工作原理
-
当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。
-
针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。
-
Tomcat与Servlet的工作流程(如下图)
-
1.Web Client 向Servlet容器(Tomcat)发出Http请求;
-
2.Servlet容器接收Web Client的请求;
-
3.Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中;
-
4.Servlet容器创建一个HttpResponse对象;
-
5.Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象;
-
6.HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息;
-
7.HttpServlet调用HttpResponse对象的有关方法,生成响应数据;
-
8.Servlet容器把HttpServlet的响应结果传给Web Client;
-
4.总结MVC设计模式的特点
-
1.低耦合性
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
-
2.高重用性和可适用性
随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。
-
3.较低的生命周期成本
MVC使开发和维护用户接口的技术含量降低。
-
4.快速的部署
使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
-
5.可维护性
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
-
6.有利于软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
5. 本次实验心得
成员 | 心得 |
---|---|
张*国 | 本次实验我将项目部署在Tomcat服务器,在浏览器测试运行学生信息的增加、更新、删除、显示等操作,但是由于电脑数据库一直不正确,一直无法实现在浏览器上的增删改查,在这里浪费了大量的时间,最后换了一台电脑进行调试,得以调试成功。后期博客的撰写还是比较熟悉。 |
邓*超 | 本次实验中,我负责将源程序导入工程以及配置相应设置确保程序的正常运行,本次实验我采用了Maven技术直接进行项目管理,在配置文件中直接写入相应依赖,在实验过程中回顾了相应知识。 |
马*财 | 本次实验我负责增量开发,在部署项目时数据库拒绝连接,后使用之前已经验证过可以连接数据库的Dbconn类以及驱动包,依然无法连接,遂使用舍友电脑,成功连接数据库,增量开发头像功能时,因修改数据库后未修改sql语句报错,而后因未将imgUrl加入session找不到图片资源,以上bug都一一被解决。此次实验学会了使用idea的debug功能排查错误,了解了团队合作在项目开发中的重要性,回顾了javaweb中的session知识点,以及sql语句,提升了对软件工程项目开发的理解。 |
潘*荣 | 本次实验中我完成刚开始的项目创建,在创建过程中由于自己的idea有问题导致在创建web项目的时候花费了很多时间,最终选择换一台电脑。从最初的创建到项目的运行,体会了项目的创建过程,后面的增量开发对我来说太有难度,由小组其它成员完成。博客的撰写已经有些熟悉了,所以完成起来不是很难。 |