开发流程
需求分析
跟项目经理交流和分析需求文档。
课程信息相关的展示,查询,以及操作。
数据库表分析
数据库表和需求文档进行匹配,如分析哪些字段需要被使用。
需要使用数据库的课程信息表 - course。
实体类设计
根据数据库中的 Course 表对应创建 Course.java
@Data
public class Course implements Serializable {
// 使用 @JSONField(ordinal = int 类型的值) 指定排序的值,生成 JSON 时会按照指定顺序进行排序
// 使用 @JSONField(serialize = false) 排除不需要转换的字段
// 另外 fastjson 还会自动排除为空的字段
// 课程 ID
@JSONField(ordinal = 1)
private int id;
//课程名称
@JSONField(ordinal = 2)
private String course_name;
//课程介绍
@JSONField(ordinal = 3)
private String brief;
//讲师名称
@JSONField(ordinal = 4)
private String teacher_name;
//讲师介绍
@JSONField(ordinal = 5)
private String teacher_info;
//课程原价
@JSONField(ordinal = 6)
private double price;
//原价标签
@JSONField(ordinal = 7)
private String price_tag;
//课程优惠价
@JSONField(ordinal = 8)
private double discounts;
//课程概述
@JSONField(ordinal = 9)
private String preview_first_field;
//课程概述第二个字段
@JSONField(ordinal = 10)
private String preview_second_field;
//分享图片 url
@JSONField(ordinal = 11)
private String course_img_url;
//分享标题
@JSONField(ordinal = 12)
private String share_title;
//分享描述
@JSONField(ordinal = 13)
private String share_description;
//课程描述
@JSONField(ordinal = 14)
private String course_description;
//排序
@JSONField(ordinal = 15)
private int sort_num;
//课程状态,0 - 草稿,1 -上架
@JSONField(ordinal = 16)
private int status;
//创建时间
@JSONField(ordinal = 17)
private String create_time;
//修改时间
@JSONField(ordinal = 18)
private String update_time;
//是否删除
@JSONField(ordinal = 19)
private int isDel;
@JSONField(ordinal = 20)
private String share_image_title; //分享图 title
@JSONField(serialize = false)
private int total_course_time; //课时数
@JSONField(serialize = false)
private int sales; //显示销量
@JSONField(serialize = false)
private int actual_sales; //真实销量
@JSONField(serialize = false)
private int is_new; //是否新品
@JSONField(serialize = false)
private String is_new_des; //广告语
@JSONField(serialize = false)
private int last_operator_id; //最后操作者
@JSONField(serialize = false)
private int total_duration; //总时长
@JSONField(serialize = false)
private long course_type; //课程类型
@JSONField(serialize = false)
private String last_notice_time; //最后课程最近通知时间
@JSONField(serialize = false)
private long is_gray; //是否是灰度课程
@JSONField(serialize = false)
private long grade; //级别
}
Dao 接口及实现类编写
/**
* 课程模块 DAO 层接口
* */
public interface CourseDao {
...
}
/**
* 课程模块 DAO 层实现类
* */
public class CourseDaoImpl implements CourseDao {
...
}
Service 接口及实现类编写
/**
* 课程模块 Service 层 接口
* */
public interface CourseService {
...
}
/**
* 课程模块 Service 层 实现类
* */
public class CourseServiceImpl implements CourseService {
...
}
CourseServlet
编写
CourseServlet
继承通用的 BaseServlet
@WebServlet(name="courseServlet", value="/course")
public class CourseServlet extends BaseServlet {
...
}
功能一:查询课程列表信息
需求分析
分析需求文档的对应页面,查看需要展示课程列表的哪些数据。
编写代码
Dao 层
修改 CourseDao
,添加 findCourseList
方法。
/**
* 查询课程列表信息
*/
public List<Course> findCourseList();
实现类 CourseDaoImpl
。
/**
* 查询课程列表信息
*/
@Override
public List<Course> findCourseList() {
try {
// 创建 Query Runner
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
// 编写 SQL:判断是否删除,取出 is_del = 0 的数据,即未删除的数据
String sql = "SELECT `id`, `course_name`, `price`, `sort_num`, `status` FROM `course` WHERE is_del = ?";
// 执行查询
return qr.query(sql, new BeanListHandler<Course>(Course.class), 0);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
补充说明
逻辑删除:逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识做修改操作;比如 0 是未删除,1 是删除;在逻辑上数据是被删除的,但数据本身依然存在库中。
物理删除:物理删除就是真正的从数据库中做删除操作了。
Service 层
修改 CourseService
添加 findCourseList
方法。
/**
* 查询课程列表
*/
public List<Course> findCourseList();
实现类 CourseServiceImpl
/**
* 创建 CourseDao
*/
CourseDao courseDao = new CourseDaoImpl();
/**
* 查询课程列表
*/
@Override
public List<Course> findCourseList() {
return courseDao.findCourseList();
}
接口开发说明
接口文档:
前端的开发基于服务端编写的接口,如果前端人员等待服务端人员将接口开发完毕再去开发前端内容这样做效率是 非常低下的;所以当接口定义完成,可以使用工具生成接口文档,前端人员查看接口文档即可进行前端开发;这样 前端和服务人员并行开发,大大提高了生产效率。
开发规范:
- Get 请求时,采用 key / value 格式请求,Servlet中可以使用
getParameter()
获取。 - Post 请求时有三种数据格式:JSON 数据,JSON 类型的数据 Servlet 中使用
fastJson
进行解析;提交 form 表单数据;文件等多部件类型 multipart / form-data。 - 响应结果统一格式为 JSON。因为 JSON 数据格式比较简单,易于读写;JSON 格式能够直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,但是完成的任务不变,易于维护。
编写 CourseServlet
在 CourseServlet
中添加 findCourseList
方法。
@WebServlet("/course")
public class CourseServlet extends BaseServlet {
/**
* 查询课程信息列表
*/
public void findCourseList(HttpServletRequest req, HttpServletResponse resp) {
try {
// 业务处理
CourseService courseService = new CourseServiceImpl();
List<Course> courseList = courseService.findCourseList();
// 响应结果
// FastJson 的 SimplePropertyPreFilter 指定要转换的 JSON 字段
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Course.class,
"id", "course_name", "price", "sort_num", "status");
String result = JSON.toJSONString(courseList, filter);
resp.getWriter().print(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Postman
Postman 介绍
Postman 是一款功能强大的 http 接口测试工具,使用 postman 可以完成 http 各种请求的功能测试。
官方地址:https://www.getpostman.com/
Postman 使用
使用 postman 创建请求来测试接口;创建课程模块,将请求保存到对应模块中。
功能二:多条件查询课程信息
需求分析
根据课程名称和课程状态进行查询。
要查询的字段:id, course_name, price, sort_num, STATUS
查询条件:is_del, course_name, statuts
编写代码
Dao 层
因为是多条件查询,所以要注意多个参数情况下 SQL 的编写
CourseDao
public List<Course> findByCourseNameAndStatus(String courseName, String status);
CourseDaoImpl
/**
* 根据课程名和课程状态条件查询课程信息
*/
@Override
public List<Course> findByCourseNameAndStatus(String courseName, String status) {
try {
// 创建 QueryRunner
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
// 编写 SQL:当前的查询为多条件不定项查询
// 创建 StringBuffer 对象,将 SQL 字符串添加进缓冲区
StringBuffer stringBuffer = new StringBuffer("SELECT `id`, `course_name`, `price`, `sort_num`, `status` FROM `course` WHERE 1 = 1 AND `is_del` = ?");
// 创建 list 集合保存参数
List<Object> list =