快捷搜索:

Java项目-表白墙(前后端分离+数据库)已开源

 ⭐相关阅读推荐⭐

🌙 🌙

Servlet :

Tomcat :

前端网络:


① 环境搭建

  1. 创建 Maven 项目
  2. pom.xml 中引入 servlet 依赖,刷新Maven
  3. 创建目录结构(src -> main -> webapp -> WEB-INF -> web.xml) <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app>
  4. 在 webapp 目录下编写 html 文件 xxx.html
  5. 新建 Java 文件编写代码(extends HttpServlet,重写方法,@WebServlet("/Path"))
  6. 打包部署()

② 约定接口

约定好浏览器都发啥请求,对应的服务器都返回啥响应

MessageServlet.java 文件

1. 从服务器获取全部留言(writeValueAsString 把Java对象转成字符串)

请求:GET/message 响应:HTTP/1.1 200 OK body (json形式,{ }是一个json对象,[ ]多个数组)
// 这个类表示一条消息的详细情况
class Message {
    public String from;
    public String to;
    public String message;
}

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    // 通过这个数组,来表示所有的消息
    private List<Message> messages = new ArrayList<>();

    // 把这个服务器存储的消息列表返回到浏览器
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/html;charset=utf-8");
        // 获取到消息列表
        // 此处要做的是:把当前 messages 这个数组,转成 JSON 格式,返回给浏览器
        ObjectMapper objectMapper = new ObjectMapper();
        // 把 Java 代码中的对象,转成 JSON 字符串
        String jsonString = objectMapper.writeValueAsString(messages);
        resp.getWriter().write(jsonString);
    }
}

2. 实现新增消息(readValue 把字符串转成 Java 对象)

// 实现新增消息
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 读取请求中的 JSON 字符串,转成 Message 对象,然后往 messages 进行添加即可
        ObjectMapper objectMapper  = new ObjectMapper();
        Message message = objectMapper.readValue(req.getInputStream(), Message.class);
        messages.add(message);
        resp.getWriter().write("insert ok");
    }

3. html修改

引入 jQuery

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
// onclick中的代码:

            // 4. 把当前拿到的消息给发到服务器这边
            let body = {
                from: from,
                to: to,
                message: message
            };
            $.ajax({
                url:"message",
                method:"post",
                contentType:"application/json;charset=utf-8",
                // 此处的 JSON.stringify 相当于 Java objectMapper.writeValue
                data: JSON.stringify(body),
                success: function(data, status) {
                    console.log(data);
                }
            })
// 单独代码:
        // 1. 在页面加载的时候,去从服务器获取消息列表,并显示在网页上
        function load () {
            $.ajax({
                method: "get",
                url: "message",
                success: function(data, status) {
                    // 此处得到的响应 data 其实已经被 jquery 给转成一个对象数组了,就可以直接进行操作
                    // 但是这里的自动转换有一个前提,服务器响应的 header 中的 Content-Type 是 application/json
                    let container = document.querySelector(.container);
                    for (let message of data) {
                        // 遍历每个元素,针对每个元素创建一个 div 标签,并给这个标签加载到页面中
                        let row = document.createElement(div);
                        row.className = row;
                        row.innerHTML = message.from + 对 + message.to + 说: + message.message;
                        container.append(row);
                    }
                }
            })
        }
        load();

4. 创建并连接数据库(DBUtil.java 文件 :)

引入数据库第三方库,

在 main 文件夹下新建 db.sql 文件,准备好sql语句,在MySQL中运行,完成数据库创建

drop database if exists java101_messagewall;
create database java101_messagewall;

use java101_messagewall;

create table message (
    `from` varchar(50),
    `to` varchar(50),
    `message` varchar(1024)
);

改写 MessageServlet.java文件 中的两个方法

// 这个方法从数据库获取到消息列表
    private List<Message> getMessages() {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Message> messages = new ArrayList<>();
        try {
            // 1. 和数据库建立连接
            connection = DBUtil.getConnection();
            // 2. 构造 SQL
            String sql = "select * from message";
            statement = connection.prepareStatement(sql);
            // 3. 执行 SQL
            resultSet = statement.executeQuery();
            // 4. 遍历结果集合
            while (resultSet.next()) {
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
                messages.add(message);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, resultSet);
        }
        return messages;
    }

    // 这个方法往数据库里写一个消息
    private void addMessage(Message message) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "insert into message value(?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1,message.from);
            statement.setString(2,message.to);
            statement.setString(3,message.message);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, null);
        }
    }

③ HTML文件源码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表白墙</title>
</head>
<body>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .container {
            width: 600px;
            margin: 0 auto;
        }
        h1 {
            text-align: center;
            padding: 20px 0;
        }
        p {
            font-size: 12px;
            color: #666;
            padding: 10px 0;
            text-align: center;
        }
        .row {
            display: flex;
            height: 40px;
            align-items: center;
            justify-content: center;
        }
        .row span {
            width: 100px;
        }

        .row .edit {
            width: 200px;
            height: 36px;
        }

        .row .submit {
            width: 300px;
            height: 40px;
            color: #fff;
            background-color: orange;
            /* 去掉边框 */
            border: none;
        }

        .row .submit:active {
            background-color: green;
        }
    </style>
    <div class="container">
        <h1>表白墙</h1>
        <p>输入后点击提交,将会把消息显示在墙上</p>
        <div class="row">
            <span>谁:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>对谁:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>说什么:</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <input type="button" value="提交" class="submit">
        </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    <script>
        let submitButton = document.querySelector(.submit);
        submitButton.onclick = function() {
            // 1. 获取到输入框里面的内容
            let edits = document.querySelectorAll(.edit);
            let from = edits[0].value;
            let to = edits[1].value;
            let message = edits[2].value;
            console.log(from + ", " + to + ", " + message);
            if (from ==  || to ==  || message == ) {
                return;
            }
            // 2. 根据输入框的内容,构造 HTML 元素,添加到页面中
            //      接下来的每个消息,都使用 div.row 来去表示
            let row = document.createElement(div);
            row.className = row;
            row.innerHTML = from + 对 + to + 说: + message;

            let container = document.querySelector(.container);
            container.appendChild(row);

            // 3. 把上次输入的内容清空
            for (i = 0; i < 3; i++) {
                edits[i].value = ;
            }

            // 4. 把当前拿到的消息给发到服务器这边
            let body = {
                from: from,
                to: to,
                message: message
            };
            $.ajax({
                url:"message",
                method:"post",
                contentType:"application/json;charset=utf-8",
                // 此处的 JSON.stringify 相当于 Java objectMapper.writeValue
                data: JSON.stringify(body),
                success: function(data, status) {
                    console.log(data);
                }
            })
        }

        // 原有的逻辑不变,下面重写来写
        // 1. 在页面加载的时候,去从服务器获取消息列表,并显示在网页上
        function load () {
            $.ajax({
                method: "get",
                url: "message",
                success: function(data, status) {
                    // 此处得到的响应 data 其实已经被 jquery 给转成一个对象数组了,就可以直接进行操作
                    // 但是这里的自动转换有一个前提,服务器响应的 header 中的 Content-Type 是 application/json
                    let container = document.querySelector(.container);
                    for (let message of data) {
                        // 遍历每个元素,针对每个元素创建一个 div 标签,并给这个标签加载到页面中
                        let row = document.createElement(div);
                        row.className = row;
                        row.innerHTML = message.from + 对 + message.to + 说: + message.message;
                        container.append(row);
                    }
                }
            })
        }
        load();
        // 2. 用户点击提交的时候,把当前的消息发给服务器
    </script>
</body>
</html>
经验分享 程序员 职场和发展