课程管理模块开发1


前言

文章内容输出来源:拉勾教育JAVA就业训练营


1. 开发流程

1.1 需求分析

1.2 数据库表分析

1.3 实体类设计

1.4 Dao接口及实现类编写

1.4 Dao接口及实现类编写

1.6 CourseServlet编写

  • CourseServlet 要继承通用的BaseServlet.

2. 功能一: 查询课程列表信息

2.1 需求分析

页面分析,需要展示哪些数据
在这里插入图片描述

2.2 编写代码

2.2.1 Dao层编写

  1. 修改CourseDao,添加 findCourseList 方法
接口 CourseDao
  //查询课程列表信息
public List<Course> findCourseList();
实现类 CourseDaoImpl
@Override
  public List<Course> findCourseList() {
    try {
      //1.创建QueryRunner
      QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
      //2.编写SQL
   String sql = "SELECT id,course_name,price,sort_num,STATUS FROM course
where id_del = ?";
      //3.执行查询
     List<Course> courseList = qr.query(sql, new BeanListHandler<Course>
(Course.class), 0);
      return courseList;
   } catch (SQLException e) {
      e.printStackTrace();
      return null;
   }
 }
  • 逻辑删除
    • 逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识,做修改操作。
    • 比如: 0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。
  • 物理删除
    • 物理删除就是真正的从数据库中做删除操作了。

2.2.2 Service层编写

修改CourseService 添加 findCourseList 方法

接口 CourseService
public List<Course> findCourseList();
实现类 CourseServiceImpl
//创建 CourseDao
  CourseDao courseDao = new CourseDaoImpl();
  @Override
  public List<Course> findCourseList() {
    //调用Dao 进行查询
    return courseDao.findCourseList();
 }

2.2.3 Servlet编写

2.2.3.1 接口开发规范
  • 我们在做的是一个前后端分离项目、需要通过接口文档对接的项目. 所以开发过程中要仔细查看前端所需的api接口和参数字段
  • 为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。
    在这里插入图片描述
2.2.3.2 接口文档

前端的开发基于服务端编写的接口,如果前端人员等待服务端人员将接口开发完毕再去开发前端内容这样做效率是 非常低下的,所以当接口定义完成,可以使用工具生成接口文档,前端人员查看接口文档即可进行前端开发,这样 前端和服务人员并行开发,大大提高了生产效率.

2.2.3.3 编写CourseServlet

在CourseServlet中添加 findCourseList方法

@WebServlet(name = "CourseServlet",urlPatterns = "/course")
public class CourseServlet extends BaseServlet {
    
    public void findCourseList(HttpServletRequest request,HttpServletResponse response){
        try {
            CourseService courseService = new CourseServiceImpl();
            List<Course> courseList = courseService.findCourseList();
            
            SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Course.class, "id", "course_name", "price", "sort_num", "status");
            String jsonString = JSON.toJSONString(courseList,filter);
            response.getWriter().print(jsonString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.3 Postman

2.3.1 postMan介绍

Postman是一款功能强大的http接口测试工具,使用postman可以完成http各种请求的功能测试。

3. 功能二: 多条件查询课程信息

4. 功能三: 新建课程营销信息

4.1 文件上传

4.1.1 图片上传分析

在添加课程营销信息的表单中,有一个图片上传项
在这里插入图片描述

4.5.2 文件上传介绍

文件上传的实质:文件的拷贝

  • 文件上传:从本地将文件拷贝到服务器磁盘上
    - 客户端: 需要编写文件上传表单
    - 服务端: 需要编写代码接受上传的 文件

4.5.3 客户端编码

  1. 文件上传三要素:
    1.表单提交方式: post (get方式提交有大小限制,post没有)
    2.表单的enctype属性:必须设置为 multipart/form-data.enctype就是encodetype就是编码类型的意思.multipart/form-data是多部件文件上传 , 指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
    3.表单必须有文件上传项: file ,必须要有name属性和值
    在这里插入图片描述
  • 注意: 默认情况下,表单的enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
  <%--
    表单提交必须是POST ,
    表单的enctype属性:必须设置为  multipart/form-data.
    input的type类型必须指定为: file, 一定要有name属性
    --%>
  <form action="${pageContext.request.contextPath}/upload" method="post"
enctype="multipart/form-data">
    <input type="file" name="upload">
    <br>
    <input type="text" name="name">
    <input type="text" name="password">
    <input type="submit" value="文件上传">
  </form>
</body>
</html>

4.5.5 FileUpload工具类

  1. 导入依赖
    FileUpload包可以很容易地将文件上传到你的Web应用程序.
    IOUtils封装了Java中io的常见操作,使用十分方便 ,需要下载 commons-io-1.4.jar 包
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>1.4</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.2.1</version>
</dependency>
  1. FileUpload 核心类介绍
类名介绍
DiskFileItemFactory磁盘文件项工厂, 读取文件时相关的配置,比如: 缓存的大小 , 临时目录的位置
ServletFileUplaod文件上传的一个核心类
FileItem代表每一个表单项
  1. 文件上传的API的详解
  • ServletFileUpload
方法说明
isMultipartContent(request);判断是否是一个文件上传的表单
parseRequest(request);解析request获得表单项的集合
setHeaderEncoding(“UTF-8”);设置上传的文件名的编码方式
  • FileItem
方法说明
isFormField()判断是否是普通表单项
getFieldName()获得表单的name属性值
item.getString()获得表单的value值
getName()获得上传文件的名称
getInputStream()获得上传文件
delete()删除临时文件
  1. 文件上传后台代码编写
    FileUpload使用步骤:
    1、创建磁盘文件项工厂
    2、创建文件上传的核心类
    3、解析request—获得文件项集合
    4、遍历文件项集合
    5、判断普通表单项/文件上传项
@WebServlet(name = "UpdateLoadServlet",urlPatterns = "/upload")
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //2.创建文件上传核心类
            ServletFileUpload upload = new ServletFileUpload(factory);
            //2.1 设置上传文件的编码
            upload.setHeaderEncoding("utf-8");
            //2.2 判断表单是否是 文件上传表单
            boolean multipartContent = upload.isMultipartContent(request);
            if(multipartContent) {
                List<FileItem> list = upload.parseRequest(request);
                if(list != null) {
                    
                    for (FileItem item : list) {
                        //普通表单
                       if( item.isFormField() ){
                           //获取属性
                           String fieldName = item.getFieldName();
                           //获取值并设置编码
                           String value = item.getString("UTF-8");
                           System.out.println(fieldName + " : " + value);
                       }else {
                           //获取文件名
                           String fileName = item.getName();
                           //通过获得uuid使得文件名的唯一性
                           String newFileNAme = UUIDUtils.getUUID() + fileName;
                           //获取输入流
                           InputStream in = item.getInputStream();
                           //获取路径
                           String realPath = this.getServletContext().getRealPath("/");
                           String webAppPath = realPath.substring(0, realPath.indexOf("linle_home"));
                           //获取文件输出流
                           FileOutputStream out = new FileOutputStream(webAppPath + "/upload/" + newFileNAme);
                           System.out.println(webAppPath);
                           //使用common-io工具实现数据的复制
                           IOUtils.copy(in,out);
                           out.close();
                           in.close();
    
                       }
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

4.5.6 将图片上传到tomcat服务器

  1. 将项目部署到webapps
    将部署方式改变为 war模式,把项目部署在tomcat的webapps下.
    idea中部署项目两种方式
    • war模式:将项目以war包的形式上传真实到服务器的webapps目录中;
    • war exploded模式:仅仅是目录的映射,就相当于tomcat在项目源文件夹中启动一样;

2.在webapps中创建upload目录
upload目录专门用来保存上传过来的图片
3.修改代码,将图片上传到服务器

  • 修改图片的输出路径
    1. 获取到项目的运行目录信息
    2. 截取到webapps的 目录路径
    3. 拼接输出路径,将图片保存到upload

4.6 BeanUtils工具类

  1. 介绍
    BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。可以将一个表单提交的所有数据封装到JavaBean中。
<dependency>
  <groupId>commons-beanutils</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.8.3</version>
</dependency>
  1. BeanUtils 对象常用方法
方法描述
populate(Object bean, Map properties)将Map数据封装到指定Javabean中,一般用于将表单的所有数据封装到javabean
setProperty(Object obj,String name,Object value)设置属性值
getProperty(Object obj,String name)获得属性值

4.7 Servlet编写

4.7.1 CourseSalesInfoServlet

  • 创建CourseSalesInfoServlet类,继承HttpServlet , 完成保存课程营销信息操作.
  • 因为上传的信息包含文件信息,无法直接通过request直接获取参数,所以不能继承BaseServlet
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值