微头条项目补充

1. 各层的接口和实现类

1.1 实体类和VO对象

NewsUser

复制代码
package com.atguigu.headline.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class NewsUser implements Serializable {
    private Integer uid;
    private String username;
    private String userPwd;
    private String nickName;
}

NewsType

复制代码
package com.atguigu.headline.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class NewsType implements Serializable {
    private Integer tid;
    private String tname;
}

NewsHeadline

复制代码
package com.atguigu.headline.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class NewsHeadline implements Serializable {
    private Integer hid;
    private String title;
    private String article;
    private Integer type;
    private Integer publisher;
    private Integer pageViews;
    private Date createTime;
    private Date updateTime;
    private Integer isDeleted;

}

HeadlineQueryVo

复制代码
package com.atguigu.headline.pojo.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class HeadlineQueryVo implements Serializable {
    private String keyWords;
    private Integer type ;
    private Integer pageNum;
    private Integer pageSize;
}

HeadlinePageVo

复制代码
package com.atguigu.headline.pojo.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class HeadlinePageVo implements Serializable {
    private Integer hid;
    private String title;
    private Integer type;
    private Integer pageViews;
    private Long pastHours;
    private Integer publisher;
}

HeadlineDetailVo

复制代码
package com.atguigu.headline.pojo.vo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class HeadlineDetailVo implements Serializable {
    private Integer hid;
    private String title;
    private String article;
    private Integer type;
    private String typeName;
    private Integer pageViews;
    private Long pastHours;
    private Integer publisher;
    private String author;
}

1.2 DAO层接口和实现类

BaseDao基础类,封装了公共的查询方法和公共的增删改方法

  • 注意,所有的Dao接口的实现类都要继承BaseDao

    package com.atguigu.headline.dao;

    import com.atguigu.headline.util.JDBCUtil;
    import java.lang.reflect.Field;
    import java.sql.*;
    import java.time.LocalDateTime;
    import java.util.ArrayList;
    import java.util.List;

    public class BaseDao {
    // 公共的查询方法 返回的是单个对象
    public <T> T baseQueryObject(Class<T> clazz, String sql, Object ... args) {
    T t = null;
    Connection connection = JDBCUtil.getConnection();
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    int rows = 0;
    try {
    // 准备语句对象
    preparedStatement = connection.prepareStatement(sql);
    // 设置语句上的参数
    for (int i = 0; i < args.length; i++) {
    preparedStatement.setObject(i + 1, args[i]);
    }

    复制代码
              // 执行 查询
              resultSet = preparedStatement.executeQuery();
              if (resultSet.next()) {
                  t = (T) resultSet.getObject(1);
              }
          } catch (Exception e) {
              throw new RuntimeException(e);
          } finally {
              if (null != resultSet) {
                  try {
                      resultSet.close();
                  } catch (SQLException e) {
                      throw new RuntimeException(e);
                  }
              }
              if (null != preparedStatement) {
                  try {
                      preparedStatement.close();
                  } catch (SQLException e) {
                      throw new RuntimeException(e);
                  }
    
              }
              JDBCUtil.releaseConnection();
          }
          return t;
      }
      // 公共的查询方法  返回的是对象的集合
    
      public <T> List<T> baseQuery(Class clazz, String sql, Object ... args){
          List<T> list =new ArrayList<>();
          Connection connection = JDBCUtil.getConnection();
          PreparedStatement preparedStatement=null;
          ResultSet resultSet =null;
          int rows = 0;
          try {
              // 准备语句对象
              preparedStatement = connection.prepareStatement(sql);
              // 设置语句上的参数
              for (int i = 0; i < args.length; i++) {
                  preparedStatement.setObject(i+1,args[i]);
              }
    
              // 执行 查询
              resultSet = preparedStatement.executeQuery();
    
              ResultSetMetaData metaData = resultSet.getMetaData();
              int columnCount = metaData.getColumnCount();
    
              // 将结果集通过反射封装成实体类对象
              while (resultSet.next()) {
                  // 使用反射实例化对象
                  Object obj =clazz.getDeclaredConstructor().newInstance();
    
                  for (int i = 1; i <= columnCount; i++) {
                      String columnName = metaData.getColumnLabel(i);
                      Object value = resultSet.getObject(columnName);
                      // 处理datetime类型字段和java.util.Data转换问题
                      if(value.getClass().equals(LocalDateTime.class)){
                          value= Timestamp.valueOf((LocalDateTime) value);
                      }
                      Field field = clazz.getDeclaredField(columnName);
                      field.setAccessible(true);
                      field.set(obj,value);
                  }
    
                  list.add((T)obj);
              }
    
          } catch (Exception e) {
              throw new RuntimeException(e);
          } finally {
              if (null !=resultSet) {
                  try {
                      resultSet.close();
                  } catch (SQLException e) {
                      throw new RuntimeException(e);
                  }
              }
              if (null != preparedStatement) {
                  try {
                      preparedStatement.close();
                  } catch (SQLException e) {
                      throw new RuntimeException(e);
                  }
              }
              JDBCUtil.releaseConnection();
          }
          return list;
      }
      
      // 通用的增删改方法
      public int baseUpdate(String sql,Object ... args) {
          // 获取连接
          Connection connection = JDBCUtil.getConnection();
          PreparedStatement preparedStatement=null;
          int rows = 0;
          try {
              // 准备语句对象
              preparedStatement = connection.prepareStatement(sql);
              // 设置语句上的参数
              for (int i = 0; i < args.length; i++) {
                  preparedStatement.setObject(i+1,args[i]);
              }
    
              // 执行 增删改 executeUpdate
              rows = preparedStatement.executeUpdate();
              // 释放资源(可选)
    
    
          } catch (SQLException e) {
              throw new RuntimeException(e);
          } finally {
              if (null != preparedStatement) {
                  try {
                      preparedStatement.close();
                  } catch (SQLException e) {
                      throw new RuntimeException(e);
                  }
    
              }
              JDBCUtil.releaseConnection();
          }
          // 返回的是影响数据库记录数
          return rows;
      }

    }

dao层的所有接口

复制代码
package com.atguigu.headline.dao;
public interface NewsHeadLineDao {
    
}

package com.atguigu.headline.dao;
public interface NewsTypeDao {
    
}


package com.atguigu.headline.dao;
public interface NewsUserDao {

}

dao层的所有实现类

复制代码
package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadLineDao;
public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadLineDao{
    
}

package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsTypeDao;
public class NewsTypeDaoImpl extends BaseDao implements NewsTypeDao{
    
}

package com.atguigu.headline.dao.impl;
import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsUserDao;
public class NewsUserDaoImpl extends BaseDao implements NewsUserDao{
    
}

1.3 Service层接口和实现类

service层所有接口

复制代码
package com.atguigu.headline.service;
public interface NewsHeadlineService {
    
}

package com.atguigu.headline.service;
public interface NewsTypeService {
    List<NewsType> findAll();
}

package com.atguigu.headline.service;
public interface NewsUserService {
    
}

1.4 Controller层接口和实现类

BaseController 用于将路径关联到处理方法的基础控制器

  • 所有的Controller都要继承该类

    package com.atguigu.headline.controller;

    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;

    import java.io.IOException;
    import java.lang.reflect.Method;

    public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 响应的MIME类型和乱码问题
    resp.setContentType("application/json;charset=UTF-8");

    复制代码
          String requestURI = req.getRequestURI();
          String[] split = requestURI.split("/");
          String methodName =split[split.length-1];
          // 通过反射获取要执行的方法
          Class clazz = this.getClass();
          try {
              Method method=clazz.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
              // 设置方法可以访问
              method.setAccessible(true);
              // 通过反射执行代码
              method.invoke(this,req,resp);
          } catch (Exception e) {
              e.printStackTrace();
              throw new RuntimeException(e.getMessage());
          }
      }

    }

所有的Controller类

复制代码
package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/headline/*")
public class NewsHeadlineController extends BaseController {
    
}

package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/type/*")
public class NewsTypeController {
    
}

package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/user/*")
public class NewsUserController extends BaseController{
    
}

package com.atguigu.headline.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/portal/*")
public class PortalController extends BaseController{
    
}

2.PostMan测试工具

2.1什么是PostMan

  • Postman是一个**接口测试工具**,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。 它主要是用来模拟各种HTTP请求的(如:get/post/delete/put..等等),Postman与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果。

2.2 怎么安装PostMan

  • 官网下载地址: https://www.getpostman.com ,或者使用资料中提供的安装包

  • 安装过程简单,一路next即可

  • 第一次启动postman 会要求输入用户名和密码,如果没有的话,关闭,再次启动就可以直接进入了

2.3 怎么使用PostMan

启动PostMan后,创建一个collection,在该collection下专门存放和微头条项目相关的测试

创建完毕后,增加新的接口测试

填写要测试的接口相关的路径,参数,请求体内容等信息

测试完毕后,可以选择将该接口的测试进行保存,方便后续随时再次测试

相关推荐
刘一说5 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
Victor35610 分钟前
Redis(14)Redis的列表(List)类型有哪些常用命令?
后端
Victor35610 分钟前
Redis(15)Redis的集合(Set)类型有哪些常用命令?
后端
卷福同学12 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
yzzzzzzzzzzzzzzzzz12 分钟前
初识javascript
前端·javascript
excel1 小时前
硬核 DOM2/DOM3 全解析:从命名空间到 Range,前端工程师必须掌握的底层知识
前端
海绵不是宝宝8178 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
专注API从业者8 小时前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
大数据·运维·前端·数据挖掘·自动化
bobz9659 小时前
小语言模型是真正的未来
后端
烛阴9 小时前
TypeScript高手密技:解密类型断言、非空断言与 `const` 断言
前端·javascript·typescript