利用form表单和利用ajax提供的JSON格式保存数据的区别(更为标准的前后端分离格式)

1.利用form表单

/bbq-v1/index2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表白墙</title>
</head>
<body>
    <div>
        <form method="post" action="/hello/bbq-v1/save">
            <label for="who">谁</label>
            <input type="text" id="who" name="who">
            <label for="target">对谁</label>
            <input type="text" id="target" name="target">
            <label for="what">说什么</label>
            <input type="text" id="what" name="what">
            <button>保存</button>
        </form>

    </div>

    <table border="1">
        <thead>
            <tr>
                <th>谁</th>
                <th>对谁</th>
                <th>说什么</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- script.js 的目标:通过ajax 去后端,查询所有的消息,并展示到tbody中 -->
    <script>
        var tbody = document.querySelector("tbody")
        var xhr = new XMLHttpRequest();
        xhr.open("get", "/hello/bbq-v1/message-list.json");
        xhr.onload = function () {
            var messageList = JSON.parse(xhr.responseText);
            for (var i in messageList) {
                var msg = messageList[i];

                var html = `<tr><td>${msg.who}</td><td>${msg.target}</td><td>${msg.what}</td></tr>`;

                tbody.innerHTML += html;
            }
        }
        xhr.send();

    </script>
</body>
</html>

 链接数据库(/bbqv1/DBUtil)(因为会被用到多次,所以单独拿出来,节约数据库被调用的次数)

package com.MXC.servlet.bbqv1;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DBUtil {
    public final static DataSource dataSource;

    static {
        MysqlDataSource db = new MysqlDataSource();
        db.setServerName("127.0.0.1");
        db.setPort(3306);
        db.setUser("root");
        db.setPassword("123456");
        db.setDatabaseName("db_12_29");
        db.setCharacterEncoding("utf8");
        db.setUseSSL(false);
        db.setServerTimezone("Asia/Shanghai");

        dataSource = db;
    }

    public static Connection connection() throws SQLException {
        return dataSource.getConnection();
    }
}

数据库内容(/bbqv1/Message)

package com.MXC.servlet.bbqv1;

public class Message {
    public String who;
    public String target;
    public String what;



}

前端设置(/bbqv1/MessageListServlet)

package com.MXC.servlet.bbqv1;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/bbq-v1/message-list.json")
public class MessageListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.从数据库中查询所有的消息
        List<Message> messageList = queryFromDB();
        //2.把消息序列化JSON格式
        String jsonText = toJson(messageList);
        //3.填充响应对象
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("application/json");
        resp.getWriter().println(jsonText);
    }


    // Servlet 对象在Tomcat 内部是单例的
    // 所以 Servlet 对象的属性 om 也只有一份
    private final ObjectMapper om = new ObjectMapper();

    private String toJson(List<Message> messageList){
        try {
            return om.writeValueAsString(messageList);
        } catch (JsonProcessingException exc) {
           throw new RuntimeException(exc);
        }

    }

    private List<Message> queryFromDB() {
        List<Message> messageList = new ArrayList<>();
        try (Connection c = DBUtil.connection()) {
            String sql = "SELECT who, target, what FROM messages ORDER BY id DESC";
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        Message msg = new Message();
                        msg.who = rs.getString("who");
                        msg.target = rs.getString("target");
                        msg.what = rs.getString("what");

                        messageList.add(msg);

                    }
                }
            }
        } catch (SQLException exc) {
            throw new RuntimeException(exc);
        }
        return messageList;
    }
}

 后端设置(/bbqv1/SaveServlet)

package com.MXC.servlet.bbqv1;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

@WebServlet("/bbq-v1/save")
public class SaveServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.从响应中读取数据
        req.setCharacterEncoding("utf-8");
        String who = req.getParameter("who");
        String target = req.getParameter("target");
        String what = req.getParameter("what");

        //2.保存到数据库当中
        saveToDB(who, target, what);

        //3.重定向回展示页面
        resp.sendRedirect("/hello/bbq-v1/index2.html");
    }

    private void saveToDB(String who, String target, String what) {
        try(Connection c = DBUtil.connection()) {
            String sql = "INSERT INTO messages (who, target, what) VALUES (?, ?, ?)";
            try (PreparedStatement ps = c.prepareStatement(sql)){
                ps.setString(1,who);
                ps.setString(2,target);
                ps.setString(3,what);

                ps.executeUpdate();
            }

        }catch (SQLException exc) {
            throw new RuntimeException(exc);
        }

    }
}

2.利用ajax提供JSON格式保存数据(更为标准的前后分离方案)(相对性能更好)

/bbq-v2/index2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>表白墙</title>
</head>
<body>
    <div>
        <label for="who">谁</label>
        <input type="text" id="who" name="who">
        <label for="target">对谁</label>
        <input type="text" id="target" name="target">
        <label for="what">说什么</label>
        <input type="text" id="what" name="what">
        <button>保存</button>
    </div>

    <table border="1">
        <thead>
            <tr>
                <th>谁</th>
                <th>对谁</th>
                <th>说什么</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- script.js 的目标:通过ajax 去后端,查询所有的消息,并展示到tbody中 -->
    <script>
        var tbody = document.querySelector("tbody")
        var xhr = new XMLHttpRequest();
        xhr.open("get", "/hello/bbq-v2/message-list.json");
        xhr.onload = function () {
            var messageList = JSON.parse(xhr.responseText);
            for (var i in messageList) {
                var msg = messageList[i];

                var html = `<tr><td>${msg.who}</td><td>${msg.target}</td><td>${msg.what}</td></tr>`;

                tbody.innerHTML += html;
            }
        }
        xhr.send();

        //通过ajax提交JSON数据到后端进行保存,不在使用form表单的形式
        var whoInput = document.querySelector("#who");
        var targetInput = document.querySelector("#target");
        var whatInput = document.querySelector("#what");
        document.querySelector("button").onclick = function() {
            //1. 从input 中读取用户的数据
            var msg = {
                who: whoInput.value,
                target: targetInput.value,
                what: whatInput.value
            };

            whoInput.value = targetInput.value = whatInput.value = '';

            //2.通过ajax发送数据到后端进行保存
            var jsonText = JSON.stringify(msg);

            var xhr = new XMLHttpRequest();
            xhr.open("post", "/hello/bbq-v2/save.json");
            xhr.setRequestHeader("Content-Type", "application/json")
            xhr.onload = function () {
                var result = JSON.parse(xhr.responseText);
                if (result.success === true) {
                    //保存成功,我们在前端,自己更新页面
                    var html = `<tr><td>${msg.who}</td><td>${msg.target}</td><td>${msg.what}</td></tr>`;
                    tbody.innerHTML = html + tbody.innerHTML;
                }

            };
            xhr.send(jsonText);
        };


    </script>
</body>
</html>

 链接数据库(/bbqv2/DBUtil)(因为会被用到多次,所以单独拿出来,节约数据库被调用的次数)

package com.MXC.servlet.bbqv2;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DBUtil {
    public final static DataSource dataSource;

    static {
        MysqlDataSource db = new MysqlDataSource();
        db.setServerName("127.0.0.1");
        db.setPort(3306);
        db.setUser("root");
        db.setPassword("123456");
        db.setDatabaseName("db_12_29");
        db.setCharacterEncoding("utf8");
        db.setUseSSL(false);
        db.setServerTimezone("Asia/Shanghai");

        dataSource = db;
    }

    public static Connection connection() throws SQLException {
        return dataSource.getConnection();
    }
}

数据库内容(/bbqv2/Message)

package com.MXC.servlet.bbqv2;

public class Message {
    public String who;
    public String target;
    public String what;



}

前端设置(/bbqv2/MessageListServlet)

package com.MXC.servlet.bbqv2;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/bbq-v2/message-list.json")
public class MessageListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.从数据库中查询所有的消息
        List<Message> messageList = queryFromDB();
        //2.把消息序列化JSON格式
        String jsonText = toJson(messageList);
        //3.填充响应对象
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("application/json");
        resp.getWriter().println(jsonText);
    }


    // Servlet 对象在Tomcat 内部是单例的
    // 所以 Servlet 对象的属性 om 也只有一份
    private final ObjectMapper om = new ObjectMapper();
    
    private String toJson(List<Message> messageList){
        try {
            return om.writeValueAsString(messageList);
        } catch (JsonProcessingException exc) {
           throw new RuntimeException(exc);
        }

    }

    private List<Message> queryFromDB() {
        List<Message> messageList = new ArrayList<>();
        try (Connection c = DBUtil.connection()) {
            String sql = "SELECT who, target, what FROM messages ORDER BY id DESC";
            try (PreparedStatement ps = c.prepareStatement(sql)) {
                try (ResultSet rs = ps.executeQuery()) {
                    while (rs.next()) {
                        Message msg = new Message();
                        msg.who = rs.getString("who");
                        msg.target = rs.getString("target");
                        msg.what = rs.getString("what");

                        messageList.add(msg);

                    }
                }
            }
        } catch (SQLException exc) {
            throw new RuntimeException(exc);
        }
        return messageList;
    }
}

后端设置(/bbqv2/SaveServlet)

package com.MXC.servlet.bbqv2;


import com.MXC.servlet.bbqv1.DBUtil;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/bbq-v2/save.json")
public class SaveServlet extends HttpServlet {
    private final ObjectMapper om = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 读取并解析请求体中的JSON格式的消息
        Message message = om.readValue(req.getInputStream(), Message.class);

        //保存打数据库中
        saveToDB(message);

        // 告诉前端返回成功了,通过返回一个固定的JSON数据
        //{success: true}
        Map<String, Object> result = new HashMap<>();
        result.put("success",true);
        String jsonText = om.writeValueAsString(result);

        //发送JSON数据
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("application/json");
        resp.getWriter().println(jsonText);
    }

    private void saveToDB(Message message) {
        try(Connection c = DBUtil.connection()) {
            String sql = "INSERT INTO messages (who, target, what) VALUES (?, ?, ?)";
            try (PreparedStatement ps = c.prepareStatement(sql)){
                ps.setString(1,message.who);
                ps.setString(2,message.target);
                ps.setString(3,message.what);

                ps.executeUpdate();
            }

        }catch (SQLException exc) {
            throw new RuntimeException(exc);
        }
    }


}

3.两者之间的区别

 

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用jQuery和JSON格式数据实现表单的Ajax验证的示例代码: HTML代码: ```html <form id="myForm" action="#" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username"><br> <label for="password">密码:</label> <input type="password" id="password" name="password"><br> <input type="submit" value="提交"> </form> ``` jQuery代码: ```javascript $(function() { $('#myForm').submit(function(event) { event.preventDefault(); // 阻止表单的默认提交行为 var formData = $(this).serialize(); // 将表单数据序列化为字符串 $.ajax({ type: 'POST', url: 'validate.php', // 后台处理验证的PHP文件 data: formData, dataType: 'json', // 声明返回的数据类型为JSON success: function(data) { // 请求成功时的回调函数 if (data.status === 'success') { alert('验证通过!'); } else { alert('验证失败:' + data.message); } }, error: function(jqXHR, textStatus, errorThrown) { // 请求失败时的回调函数 alert('请求失败:' + textStatus + ',错误信息:' + errorThrown); } }); }); }); ``` PHP代码: ```php <?php // 模拟验证用户名和密码的函数 function validate($username, $password) { if ($username === 'admin' && $password === '123456') { return true; } else { return false; } } // 获取表单数据 $username = $_POST['username']; $password = $_POST['password']; // 进行验证 if (validate($username, $password)) { $result = array('status' => 'success'); } else { $result = array('status' => 'fail', 'message' => '用户名或密码错误'); } // 返回JSON格式数据 header('Content-Type: application/json'); echo json_encode($result); ?> ``` 以上代码实现了一个简单的表单验证功能,当用户点击提交按钮时,jQuery会将表单数据通过Ajax方式提交给后台PHP文件进行验证。后台PHP文件根据表单数据进行验证,并将验证结果以JSON格式返回给前端页面,前端页面根据返回数据进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值