zoukankan      html  css  js  c++  java
  • SpringBoot Ajax请求Json数据

    SpringBoot Ajax请求Json数据

    使用ajax技术从服务器请求数据, 在不刷新整个页面的情况下, 展示到页面

    前期准备

    创建springboot项目, 引入依赖:

    spring web, thymeleaf, mybatis, jdbc api, mysql Driver, lombok

    编写配置文件

    编写实体类

    Activity实体类

    这里用到两个注解

    @DateTimeFormat(pattern = "yyy-MM-dd")

    此注解用于描述属性或set方法, 告诉spring mvc按指定格式接收数据, 默认格式为yyyy/MM/dd HH:mm:ss

    例如:

    public class Activity {
    	private Long id;
    	private String title;
    	// 次注解用于描述属性或set方法, 告诉spring mvc按指定格式接收数据
    	@DateTimeFormat(pattern = "yyy-MM-dd")
        private Date startTime;
    	@DateTimeFormat(pattern = "yyy-MM-dd")
        private Date endTime;
    }
    

    前端显示指定日期的格式, thymeleaf支持日期格式化:

    格式: ${#calendars.format(日期对象,格式)}

    格式: 年-月-日 时:分:秒 -> yyyy-MM-dd HH:mm:ss

    Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span>
    

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")

    此注解用来告诉日期类型数据转为json字符串的时候, 日期指定的格式, 对应其get方法

    pattern: 格式

    timezone: 时区, 必须设置, 否则可能差8小时

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Activity {
    	private Long id;
    	private String title;
    	private String category;
    	// 次注解用于描述属性或set方法, 告诉spring mvc按指定格式接收数据
    	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") // 应用场景对应set方法
    	@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") // 注解用于描述属性的get方法
    	private Date startTime;
    	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    	@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
    	private Date endTime;
    	private String remark;
    	private Integer state;
    	private Date createdTime;
    	private String createdUser;
    }
    

    并完成完成对应的增, 删, 查操作

    包括service, dao代码略

    编写前端

    用来展示数据

    <table class="table">
        <thead>
            <tr>
                <th><input type="checkbox">全选</th>
                <th>名称</th>
                <th>开始时间</th>
                <th>结束时间</th>
                <th>状态</th>
                <th colspan="2">操作</th>
            </tr>
        </thead>
        <tbody id="tbodyId">
            <tr>
                <!-- 一个加载中的动态图 -->
                <td colspan="6"><img alt="" src="/img/loading.gif"
                                     style="display: block; margin: 80px auto;"></td>
            </tr>
        </tbody>
    </table>
    

    编写js代码发送ajax请求

    // 基于ajax技术向服务端发送异步请求, 获取数据, 然后更新到页面上
    function doGetActivitys() {
        // 1. 定义url
        var url = "doFindActivitys";
        // 2. 请求参数
        // 3. 发送异步请求, 处理响应结果
        // 向服务器发送Get请求
        $.get(url, function(result) { // 用于处理结果
            // 获取tbody对象
            var tBody = $("#tbodyId");
            // 清空tbody的内容
            tBody.empty();
            // 迭代result对象, 将数据填充到tbody
            result.forEach(item => {
                tBody.append(doCreateRow(item));
            });
            // 第二种遍历方式
            /*
            for(var i = 0; i < result.length; i ++) {
                // 创建行
                var tr = doCreateRow(result[i]);
                // 将行追加到tbody
                tBody.append(tr);
            }
            */
        }, "json");
    }
    
    // 创建一行数据
    function doCreateRow(item) {
        return `<tr>
                    <td> <input type='checkbox' value=${item.id}> </td>
                    <td> ${item.title} </td>
                    <td> ${item.startTime} </td>
                    <td> ${item.endTime} </td>
                    <td> ${item.state} </td>
                    <td> <button type='button' class='btn btn-danger btn-sm' onclick='doDeleteById(${item.id})'>delete</button> </td>
                </tr>`;
        // 第二种方式
        /*
        return "<tr>" +
                    "<td><input type='checkbox' value=" + item.id + "></td>" +
                    "<td>" + item.title + "</td>" + 
                    "<td>" + item.startTime + "</td>" + 
                    "<td>" + item.endTime + "</td>" + 
                    "<td>" + item.endTime + "</td>" + 
                    "<td>" + item.state + "</td>" + 
                "</tr>";
        */
    }
    

    Controller处理请求

    springboot自带了json处理, 返回List对象的时候自动转位json字符串, 但是需要加上@ResponseBody注解

    @RequestMapping("/activity/doFindActivitys")
    @ResponseBody 
    // 假如方法返回值为对象(不包含字符串, 直接量),
    // spring MVC可以将其装换为json格式字符串
    public List<Activity> doFindActivitys() {
        return activityService.findActivity();
    }
    

    这样访问我们的页面的时候就会出现数据了

    同理, 我们也可以实现新增或删除的操作

    新增

    编写前端

    新增的时候我们可以使用bootstrap的模态框, 不需要新建页面

    <div class="modal fade" id="myModal" tabindex="-1" role="dialog"
         aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                            aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="myModalLabel">Modal title</h4>
                </div>
                <div class="modal-body">
                    <!-- 模态框内容 -->
                    <form action="" method="post" id="myform">
                        <input type="text" name="id" hidden="true">
                        <div class="form-group">
                            <label for="titleId">标题</label> <input type="text"
                                                                   class="form-control" id="titleId" name="title"
                                                                   placeholder="please input title">
                        </div>
                        <div class="form-group">
                            <label for="categoryId">类型</label> <input type="text"
                                                                      class="form-control" id="categoryId" name="category"
                                                                      placeholder="please input category">
                        </div>
    				
                     <!-- ...等表单 -->
                        
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary" onclick="doSaveOrUpdate()">Save changes</button>
                </div>
            </div>
        </div>
    </div>
    

    打开模态框的按钮

    <button type="button" class="btn btn-primary" data-toggle="modal"
    			data-target="#myModal">创建活动</button>
    

    js发送请求

    function doSaveOrUpdate() {
        // 1. 定义url
        var url = "/activity/doSaveObject";
        // 2. 获取表单数据
        var params = $("form").serialize(); // 直接获取表单中input元素的name属性的值, 并构建字符串
        console.log("params", params);
        // 3. 异步提交数据并处理返回结果
        $.post(url, params, function(result){
         	$('#myform')[0].reset();
            // 给出信息
            alert(result);
            // 手动隐藏模态框
            $("#myModal").modal('hide');
            // 重新查询, 刷新页面
            doGetActivitys();
        })
        /*
        $.ajax({
        	"url": url, // 请求url
        	"method": "post", // 请求方式
        	"dataType": "text", // 服务端相应数据类型
        	"data": params, // 向服务器传递参数
        	"success": function(result) { // xhr.readyState==4&&xhr.status.statue==200
        		alert(result);
        		$("#myModal").modal('hide');
        		doGetActivitys();
        	}
        });
        */
    }
    

    controller处理请求

    @RequestMapping("/activity/doSaveObject")
    @ResponseBody
    public String doSaveObject(Activity a) {
        activityService.insertObject(a);
        return "save ok";
    }
    

    现在新增请求就写好了

    删除

    编写前端

    js发送请求

    function doDeleteById(id) {
        if (!confirm("确定删除吗?")) return;
        // 定义url
        var url = "doDeleteById";
        // 定义参数
        var params = "id=" + id;
        // 发送异步请求操作
        // 基于JQuery中的post函数发送异步请求
        $.post(url, params, function(result){
            // 处理结果
            alert(result);
            doGetActivitys();
        });
    }
    

    controller处理请求

    @RequestMapping("/activity/doDeleteById")
    @ResponseBody
    public String doDeleteById(Integer id) {
        activityService.doDeleteById(id);
        return "delete ok";
    }
    

    删除也实现了

    JSON扩展

    json本质是一个字符串

    springboot会帮你把对象转为json格式

    JQuery在前端也会帮你自动把json转为js对象

    对象转json注意

    如果说, 有一个实体类

    class User {
        private String name,
        private String age
    }
    

    假如我们controller中方法的返回值是User对象, 那么json格式为

    {
        "name": "张三",
        "age": 34
    }
    

    如果返回的是一个User对象的集合呢, 就是如下的形式

    [
        {
            "name": "sam",
         	"age": 32
        },
        {
            "name": "jack",
            "age": 31
        },
        {
            "name": "bob",
            "age": 23
        }
    ]
    

    甚至你可以生成更加复杂的形式

    {
        "name": "张三",
        "age": 23,
        "teachers": [
            {"name":"张老师", "age": 45},
            {"name":"李老师", "age": 55}
        ]
    }
    

    我相信看到这种形式的json, 你可能已经想象到后台返回的对象是什么样子了

    扩展: js ES6拼接字符串

    之前我们拼接字符串最常用的是使用+加号拼接或者斜杠

    javascript ES6 提供了`` 号拼接字符串, 例如:

    var user = {
    	name: "sam",
    	age: "11"
    }
    var str = `我的名字是${user.name'}, 我的年龄是${user.age}`;
    

    ajax发送请求时, 声明返回的数据是json还是text, 如果写错的话, 可能不会执行回调函数

    扩展: ajax发送请求

    $,ajax()

    格式: $.ajax(url, [setting])

    通过 HTTP 请求加载远程数据。

    jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。

    最简单的情况下,$.ajax()可以不带任何参数直接使用。

    注意,所有的选项都可以通过$.ajaxSetup()函数来全局设置。

    如果要处理$.ajax()得到的数据,则需要使用回调函数。beforeSend、error、dataFilter、success、complete。

    • beforeSend 在发送请求之前调用,并且传入一个XMLHttpRequest作为参数。
    • error 在请求出错时调用。传入XMLHttpRequest对象,描述错误类型的字符串以及一个异常对象(如果有的话)
    • dataFilter 在请求成功之后调用。传入返回的数据以及"dataType"参数的值。并且必须返回新的数据(可能是处理过的)传递给success回调函数。
    • success 当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。
    • complete 当请求完成之后调用这个函数,无论成功或失败。传入XMLHttpRequest对象,以及一个包含成功或错误代码的字符串。

    例如:

    $.ajax({
        "url": url, // 请求url
        "method": "post", // 请求方式
        "dataType": "text", // 服务端相应数据类型常用json或text
        "data": params, // 向服务器传递参数
        "success": function(result) { // xhr.readyState==4&&xhr.status.statue==200回调函数
            // 执行内容
        }
    });
    

    $.get()

    格式: $.get(url, [data], [callback], [type])

    通过远程 HTTP GET 请求载入信息。

    这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。

    参数url,[data],[callback],[type]

    • url:待载入页面的URL地址

    • data:待发送 Key/value 参数。

      可以是字符串, 例如: id=3%name=sam

      也可以是键值对: { name: "John", time: "2pm" }

    • callback:载入成功时回调函数。

    • type:返回内容格式,xml, html, script, json, text, _default。

    例如:

    $.get("/findAll", { name: "John", time: "2pm" },function(data){
    	alert("Data Loaded: " + data);
    });
    

    $.post()

    格式: $.post(url, [data], [callback], [type])

    和get请求类似, 只是提交方式不同而已

    案例:

    $.post("/findAll", { name: "John", time: "2pm" },function(data){
    	alert("Data Loaded: " + data);
    });
    
  • 相关阅读:
    阅读笔记09
    阅读笔记08
    阅读笔记07
    阅读笔记06
    阅读笔记05
    有关eclipse连接SQL Server 2008的问题
    每周进度条05
    软件需求模式阅读笔记04
    每周进度条04
    软件需求模式阅读笔记03
  • 原文地址:https://www.cnblogs.com/zpKang/p/13273059.html
Copyright © 2011-2022 走看看