刚刚学完Javaweb的部分,目前对前后端分离的感觉是,前端发送请求,然后将后端发过来的数据展示到页面上。后端部分的开发流程大致是:
一、Java-Bean
根据数据库的表结构,创建相对应的类实体类(pojo)对象,数据库的下划线后面的字母在类对象中要大写,且去除下划线;
二、Controller、Service、Dao接口及其实现类
1.Controller类
从请求携带的JSON串中获取响应数据,获取响应数据时,当前的实体类可能不满足响应数据对应的类,可以单独创建一个匹配的类对象(vo)用以接收数据:
public static <T> T readJson(HttpServletRequest request, Class<T> clazz) {
T t = null;
BufferedReader reader;
try {
reader = request.getReader();
StringBuilder buffer = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
buffer.append(line);
t = objectMapper.readValue(buffer.toString(), clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
return t;
}
后端查询的数据转换成JSON串返回给前端:
public static void writeJson(HttpServletResponse response, Result result) {
response.setContentType("application/json;charset=UTF-8");
try {
String json = objectMapper.writeValueAsString(result);
response.getWriter().write(json);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
JSON串转换的代码可以封装成一个工具类,并放在utils文件夹下面;
将数据转换成JSON时需要用到result对象,该对象是封装后端数据的较为通用的类:
public class Result<T> {
// 返回状态码
private Integer code;
// 返回消息
private String message;
// 返回数据
private T data;
public Result() {
}
}
该类的两个方法(ok、build)也较为简单,build有很多重构方法,要返回的数据是成功的用ok方法,失败的则用build方法;
“成功”方法
protected static <T> Result<T> build(T data) {
Result<T> result = new Result<>();
if (data != null)
result.setData(data);
return result;
}
public static <T> Result<T> ok(T data){
Result<T> result=build(data);
return build(data,ResultCodeEnum.SUCCESS);
}
“失败”方法
protected static <T> Result<T> build(T data) {
Result<T> result = new Result<>();
if (data != null)
result.setData(data);
return result;
}
public static <T> Result<T> build(T body, Integer code, String message) {
Result<T> result = build(body);
result.setCode(code);
result.setMessage(message);
return result;
}
public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
Result<T> result = build(body);
result.setCode(resultCodeEnum.getCode());
result.setMessage(resultCodeEnum.getMessage());
return result;
}
如果后端返回给前端的数据是失败的,一般会加上一个响应码,响应码放在一个枚举类中:
public enum ResultCodeEnum {
SUCCESS(200, "success"),
USERNAME_ERROR(501, "usernameError"),
PASSWORD_ERROR(502, "passwordError"),
NOTLOGIN(504, "notLogin"),
USERNAME_USED(505, "usernameUsed");
private final Integer code;
private final String message;
}
Controller类中处理的事情可以概括为:从请求中获取数据
req.getParameter、req.getHeader、readJson
然后经过service层获取数据,根据数据的结果(失败、成功)判断,封装数据,然后返回给前端。
2.Service类
service层处理数据,如:Controller层传过来的密码可能需要加密,Dao层查询到的密码可能需要解密等,且查询的数据类对象可能当前的实体类也不满足,也需要单独创建一个类用以接收Dao层查询的数据,创建完之后调用Dao层的方法查询需要的数据,然后将查询道的数据封装成刚刚创建的类,并返回
Map<String,ObLect> pageInfo =new HashMap<>();
// 分页查询本页数据
List<HeadlinePageVo> pageData =newsHeadLineDao.findPageList(headLineQueryVo);
// 分页查询满足记录的总数据量
int totalSize = newsHeadLineDao.findPageCount(headLineQueryVo);
// 页大小
int pageSize =headLineQueryVo.getPageSize();
// 总页码数
int totalPage=totalSize%pageSize == 0 ! totalSize/pageSize :
totalSize/pageSize+1;
// 当前页码数
int pageNum= headLineQueryVo.getPageNum();
pageInfo.put("pageData",pageData);
pageInfo.put("pageNum",pageNum);
pageInfo.put("pageSize",pageSize);
pageInfo.put("totalPage",totalPage);
pageInfo.put("totalSize",totalSize);
return pageInfo;
3.Dao类
Dao层几乎是编写sql语句,连接数据库,运行sql语句获取数据,然后返回;
3.1在连接数据库之前,要先检查自己电脑安装的数据库服务是否开启了(很重要),win+r,services(我的电脑运行没反应,不知道什么原因),或者点击win图标,直接搜索服务也可;
3.2连接数据库的代码,如果是原生的jdbc代码可以封装在BaseDao类,直接调用即可,因为Dao层几乎每个方法都会用(后面用了Mybatis就不需要了,原理还是要知道的)
3.3Dao层最难的部分就是sql语句的编写,写的sql语句先运行下看看得到的数据是否符合要求,不然后面找bug就麻烦,目前对sql语句还不算熟练(多刷题~~)
三、其他
后端部分最核心的就是三层结构了,至于Filter过滤器、resource目录,jar包依赖也很重要;
总结:
只要有了接口文档,后端部分实现起来感觉不算特别难,如果知道了前端的逻辑,感觉接口文档也不难写了。。。