一、总览:
1.目标
熟悉数据库相关知识,数据库表的设计,基本CRUD操作,JDBC操作,Servlet处理HTTP请求,HTTP相关知识,请求方法,响应状态码,Session的基本使用,理解项目开发流程
2.开发环境与技术栈
- Windows10
- Maven
- Servlet
- MySql
- Jackson
- ajax
- UEditor
3.功能说明
输入URL访问到登录页面,成功登陆之后对文章进行一系列操作
- 用户登录
- 显示文章列表
- 对文章列表进行增删改查操作
- 上传图片操作
4.前后端接口
要实现功能,需要先明确前后端约定好的接口,此项目主要实现对博客文章内容的增删查改操作,所以只实现了相应的接口,需要说明的是,接口的定义一般是前后端约定好的,所以和前端代码息息相关.前端需要什么数据以及需要什么格式的数据,也会在接口中体现
4.数据库的设计
本项目采用了两个表,1是用户表实现对用户的管理,2是文章列表实现对文章的管理,源码如下:
drop database if exists servlet_blog;
create database servlet_blog character set utf8mb4;
use servlet_blog;
create table user(
id int primary key auto_increment,
username varchar(20) not null unique,
password varchar(20) not null,
nickname varchar(20),
sex bit,
birthday date,
head varchar(50)
);
create table article(
id int primary key auto_increment comment'账号',
title varchar(20) not null,
content mediumtext not null,
create_time timestamp not null default now(),
view_count int default 0,
user_id int,
foreign key(user_id) references user(id)
);
insert into user(username,password) values('a','1');
insert into user(username,password) values('b','2');
insert into user(username,password) values('c','3');
insert into article(title,content,user_id) values ('快速排序','public ...',1);
insert into article(title,content,user_id) values ('冒泡排序','public ...',1);
insert into article(title,content,user_id) values ('选择排序','public ...',1);
insert into article(title,content,user_id) values ('归并排序','public ...',2);
insert into article(title,content,user_id) values ('插入排序','public ...',2);
5.待改进
- 数据库连接池,通过双重校验所的单例模式来完成
- Filter过滤器完成用户会话的统一管理
- 富文本编辑器实现博客文章的展示,及图片上传
- 没有做用户会话管理
- 没有做注册新用户功能
- 没有做文章列表接口的统计访问量(内存实现)
- …
6.项目的执行流程
7.详细说明
1.请求网页
浏览器封装请求为http协议格式,响应内容,会渲染为网页,浏览器自动请求网页上的资源(css,js,img)
2.js发送ajax请求
绑定网页的用户事件,写js代码完成ajax异步请求,服务端响应的数据由js代码解析,并完成功能(如弹出框,动态生成网页等等)
4.tomcat
提供服务:接收请求的http数据,解析为Servlet的对象(request,response).接收的http数据,url,请求方法,header,body在request中,通过api操作(封装),设置要响应的内容,返回给客户端由Tomcat自动封装成响应内容
5.Servlet
每次客户端请求.如果映射到资源,如果是Servlet资源,就调用Servlet对象的service方法
步骤:
(1)获取请求数据: 一定要检查请求数据格式及数据类型queryString及请求体表单数据类型: request.getParameter()请求数据类型为application/json,请求体就是json字符串:通过输入流获取request.getInputStream()
(2)如果请求数据是json,反序列化为java对象
(3)业务逻辑处理:校验,业务条件逻辑,jdbc数据库操作(使用请求数据)
(4)业务操作的结果(数据库操作的结果:结果集)一返回对象, 至少有一一个是否成功的标识
目前的实现:没有抛异常就是成功抛异常:父类模版方法处理异常
(5)由Servlet父类, 统一处理: 响应数据格式,异常处理
要明确,每个代码中的对象,到底是请求解析后的,还是返回给客户端响应的数据