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(删除后)




二、学生信息管理软件增量开发

  • (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();
		}
		
	
	}

}

三、实验总结

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项目的时候花费了很多时间,最终选择换一台电脑。从最初的创建到项目的运行,体会了项目的创建过程,后面的增量开发对我来说太有难度,由小组其它成员完成。博客的撰写已经有些熟悉了,所以完成起来不是很难。
posted @ 2023-05-12 21:00  发际线与你们作队  阅读(165)  评论(0编辑  收藏  举报