上一章结束了 Servlet 的学习,ok,现在我们已经学会了 1 + 1 了,现在开始我们要学会 百以内的加减乘除法。
本章就做一个最简单的 小小项目:表白墙。
在开始表白墙项目开始之间,我们先提前说好,这里主要跟关注 后端的代码,前端的代码。我们不重点讲解,只是一笔带过罢了。
前后端约定:
前端传输给后端的数据是啥样的 例如:前端的数据格式是 jackson,后端不认识啊,按照 jackson 的格式接收全乱码了,这不是搞人心态吗?
所以啊,这个约定的意义就在这里,两边相互通知一声,都是啥格式啊,让对面自己去转换格式。
接口一:从服务器获取到所有的消息数据
请求:
GET / message
GET 是前端发送至后端的get方法,获取数据库的数据,message 就是个格式类型,这个是要我们自己写的。
响应:
HTTP/1.1 200 ok
Content-Type:aplication/json
这些都在HTTP 那一张提到过,就不再细讲了。
回到上述的 message 这个格式,我们来约定一下 message 格式:
接口二:往服务器提交一个新的信息
请求:
POST / message
POST 用于提交数据。
响应:
HTTP/1.1 200 ok
我们先来看看最终写出来的效果:
我们再来开看看约定的代码是怎么写的:
这里能理解就理解,理解不了也没事。
通过ajax 就可以将约定全部设置好;
在Java中使用 jackson 完成对象和 json 字符串的转换,:
通过 ObjectMapper.writerValue 来把 Java 对象转换为 json格式字符串
通过 ObjectMapper.readValue 来把 json 对象转换为 Java格式字符串
而js中使用 JSON 这个特殊对象,完成对象和 json 字符串的转换
JSON.stringify 将js 对象转换为 json 格式字符串,
JSON.parse 将json 对象转换为 js格式字符串,
前端稍稍介绍一下就好,重点在于后端的介绍。
后端详解
数据库的引入
我们把数据存储在 ArrayList 中(内存中),每当服务器重启,内存数据就全都没有了。
将数据库存储在硬盘上,可以让数据更好的持久化的办法!!这里有两种方法
- 写到文件里
- 写道数据库中
我们选择第二种;
- 你存文本和存数据库,不一定数据库会节省空间,但是可预见的,大部分情况下数据库会更节省空间,尤其是在大数据量的情况下;
- 读写文本文件和数据库速度差别肯定非常大;
这里就需要引用 JDBC;
1. 引入 JDBC 的依赖
在maven 中央仓库搜索:mysql :
找自己对应的大版本,大版本不对,那么后续操作肯定会出问题;小版本无所谓,找个用的人最多的就好。
2. 创建库、表
这一步,应该问题不大,实在不会可以参考这一章:
(282条消息) MySQL数据库基础_我可是ikun啊的博客-CSDN博客
3. JDBC 操作
这里就是那经典的几步操作,多写几次就记住了,等到正式写代码就可以看到了。
正式开始写后端代码
1. 约定
前端和后端有约定,后端也要和前端有约定。
2. 核心代码
这个类本质上还是继承了 HttpServlet 类,主要实现的功能有两个,一个是 doGet() 方法,另一个是 doPost()方法。
一个个来看。
doGet 方法
- 我们将数据库中所有的数据存放到一个链表中(这个链表可以很大),
- 随后将这个链表格式转换为 jackson ,
- 再设置一个 返回客户端的响应格式,最后发送给客户端
这就是整个 doGet()方法的作用。
当然,这里还需要完成 laod()方法。
// 该方法用于遍历数据库中所有的数据
private List<Message> load() {
// 这个list 用于存储遍历出来的数据
List<Message> messageList = new ArrayList<Message>();
// 建立链接、经典操作:
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
try {
// 构建 sql语句
Connection connection = dataSource.getConnection();
String sql = "select * from message";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
//遍历 resultSet
while (resultSet.next()) {
Message message = new Message();
message.from = resultSet.getString("from");
message.to = resultSet.getString("to");
message.message = resultSet.getString("message");
messageList.add(message);
}
// 关闭链接
// 越晚创建越早关闭
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
return messageList;
}
其实,本质上就是个 JDBC 的连接,连接操作,构建sql 语句,关闭连接 都是常用的操作;
只有遍历 resuktSet 这个操作需要我们看看,其实也不难。
无非就是将数据库中的数据拿出来,构造成 一个 message 格式,随后添加至链表中,最终返回这个链表。
doPost 方法
doPost 需要做的事情也很简单,就是将数据保存在数据库中。
// 该方法用于保存 输入的信息,这个保存主要是存放在数据库,本质就是个连接数据库操作
private void save(Message message) {
// 链接数据库
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("");
try{
// 构建 sql语句
Connection connection = dataSource.getConnection();
String sql = "insert into message values(?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,"from");
statement.setString(2,"to");
statement.setString(3,"message");
// 执行 sql 语句
statement.executeUpdate();
// 关闭链接
statement.close();
connection.close();
}catch (Exception e) {
e.printStackTrace();
}
}
这里也是个jdbc 的操作,多谢就熟悉了,这一块以前也介绍过,可以参考:
MySQL:JDBC_我可是ikun啊的博客-CSDN博客
ok,代码写道这里就写完了。我们可以来测试一下。
部署那一步我就跳过了,我们也可以下载一个插件 smart tomcat ,随后配置一下,这个可以上网查一下具体操作流程。
3. 测试
这就是个很简单的程序,我们就不使用在 测试中讲的那些了,随便测试测试就好。
我们再重新打开,看看数据是否被保存在了数据库。
如果发现数据库不存在,一定要去看看日志中报了啥错误,我也就遇到过几个错误,数据库中没有保存数据:
最后发现是我数据库连接错了:
ok,到这里这个表白墙项目就结束了。
完全的代码,在我的码云中:
Projects: 项目仓库 (gitee.com)
这里的代码中还有个错误:
将save 方法中的 构建sql 语句改为上图的代码。
先熟悉一下简单的小项目,马上下一章就是另一个新项目:博客系统