微头条项目补充

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下专门存放和微头条项目相关的测试

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

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

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

相关推荐
不悔哥7 分钟前
vue 案例使用
前端·javascript·vue.js
安科瑞刘鸿鹏23 分钟前
分布式光伏发电系统如何确保电能质量达到并网要求?
服务器·网络·分布式·嵌入式硬件·能源
anyup_前端梦工厂38 分钟前
Vuex 入门与实战
前端·javascript·vue.js
程序员阿鹏1 小时前
ArrayList 与 LinkedList 的区别?
java·开发语言·后端·eclipse·intellij-idea
技术不支持1 小时前
WSL2+Ubuntu 22.04搭建Qt开发环境+中文输入法
linux·运维·服务器·qt·ubuntu
_infinite_1 小时前
Ubuntu 与Uboot网络共享资源
linux·服务器·ubuntu
你挚爱的强哥1 小时前
【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具
前端·javascript·vue.js
米老鼠的摩托车日记1 小时前
【vue element-ui】关于删除按钮的提示框,可一键复制
前端·javascript·vue.js
java_heartLake2 小时前
微服务中间件之Nacos
后端·中间件·nacos·架构
猿饵块2 小时前
cmake--get_filename_component
java·前端·c++