H5 FormData 表单数据对象详解 与 Json 对象相互转换

目录

FormData 表单对象概述

FormData 表单常用方法

添加、获取数据

修改、删除数据

判断是否含有指定 key

entries 遍历数据

forEach 循环取值

Json 与 FromData 相互转换

前后台 formData 数据传输示例


FormData 表单对象概述

1、FormData 是 Html5 新加进来的一个类,可以模拟表单数据

2、利用 FormData 对象,可以通过JavaScript键值对来模拟一系列表单控件,可以使用 JQuery 的 $.Ajax 结合 FormData 异步上传二进制文件

3、可以先通过 new 关键字创建一个空的 FormData 对象,然后使用 append() 方法向该对象里添加字段(字段的值可以是一个 File对象或者字符串,剩下其他类型的值都会被自动转换成字符串),也可以 new 的同时直接传入表单对象,从而创建有值的FormData对象。

构造函数解释
FormData (optional HTMLFormElement form)(可选) 一个HTML表单元素,可以包含任何形式的表单控件,包括文件输入框.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $("#refresh").click(function () {
                /**新建空的 FormData 对象*/
                let formData1 = new FormData();
                formData1.append("name", "华安");
                console.log(formData1.has("name") + ":" + formData1.get("name"));//输出:true:华安

                /**根据表单创建 FormData 对象,注意构造器参数是DOM对象,而不是JQuery对象*/
                let formData2 = new FormData($("#form")[0]);
                console.log(formData2.get("name"));//默认输出:请输入姓名...
                console.log(formData2.get("age"));//默认输出:0
                console.log(formData2.get("info"));//默认输出:请输入描述...
                console.log(formData2.get("address"));//因为不存在,所以输出:null
            });
        });
    </script>
</head>
<body>
<button id="refresh">刷新</button>
<form id="form" method="post">
    姓名:<input type="text" name="name" value="请输入姓名...">
    年龄:<input type="number" name="age" value="0">
    描述:<textarea name="info">请输入描述...</textarea>
</form>
</body>
</html>

FormData 表单常用方法

添加、获取数据

1、添加数据:通过append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾

void append(DOMString name, DOMString value)
name 表单元素名称,已经存在时,以数组形式追加值
value 表单元素要传递的值

2、获取数据:可以通过 get(key)、getAll(key) 来获取对应的 value

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $("#refresh").click(function () {
                let formData = new FormData();
                formData.append("name", "华安");
                formData.append("number", 9527);
                formData.append("name", "宁王");
                console.log(formData.get("name"));//默认取第一个,输出:华安
                console.log(formData.get("number"));//输出:9527
                console.log(formData.getAll("name"));//输出:["华安", "宁王"]
                console.log(formData.getAll("name")[0]);//输出:华安
                console.log(formData.getAll("name")[1]);//输出:宁王
            });
        });
    </script>
</head>
<body>
<button id="refresh">刷新</button>
</body>
</html>

修改、删除数据

1、修改数据:可以通过 set(key, value) 来设置修改数据,如果指定的 key 不存在则会新增一条,如果存在,则会修改对应的value值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $("#refresh").click(function () {
                let formData = new FormData();
                formData.append("name", "华安");
                console.log(formData.get("name"));//输出:华安
                formData.set("name", "宁王");
                console.log(formData.get("name"));//输出:宁王
                formData.set("age", 35);
                console.log(formData.get("age"));//输出:35
            });
        });
    </script>
</head>
<body>
<button id="refresh">刷新</button>
</body>
</html>

2、删除数据:通过 delete(key),来删除数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $("#refresh").click(function () {
                let formData = new FormData();
                formData.append("name", "华安");
                console.log(formData.has("name")+":"+formData.get("name"));//输出:true:华安
                formData.delete("name");
                console.log(formData.has("name")+":"+formData.get("name"));//输出:false:null
            });
        });
    </script>
</head>
<body>
<button id="refresh">刷新</button>
</body>
</html>

判断是否含有指定 key

1、可以通过 has(key) 来判断是否对应的 key 值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        $(function () {
            $("#refresh").click(function () {
                let formData = new FormData();
                formData.append("name", "华安");
                console.log(formData.has("name")+":"+formData.get("name"));//输出:true:华安
                console.log(formData.has("age")+":"+formData.get("age"));//输出:false:null
            });
        });
    </script>
</head>
<body>
<button id="refresh">刷新</button>
</body>
</html>

entries 遍历数据

1、可以通过 entries() 来获取一个迭代器,然后遍历所有的数据,迭代器规则:

1)每调用一次 next() 返回一条数据对象,数据的顺序与添加的顺序一致
2)返回的数据对象,当其done属性为true时,说明已经遍历完所有的数据,value 值为 undefined
3)返回的数据对象的value属性以数组形式存储了一对key/value,数组下标0为key,下标1为value,如果一个key对应多个value,则会多对key/value返回

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- BootCDN提供了很多如JQuery、Chart.js、ECarts.js等等,BootCDN官网地址:http://www.bootcdn.cn/-->
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

    <script type="text/javascript">
        let formData = new FormData();
        formData.append("k1", "v1");
        formData.append("k1", "v2");
        formData.append("k2", "v1");

        eachFormData(formData);

        /**
         * 遍历 FormData 表单数据对象
         * @param formData
         */
        function eachFormData(formData) {
            let entriesObj = formData.entries();
            let loopEntrie = entriesObj.next();
            let loopValue = "";
            /** done 为 true 时 表示已经遍历完毕*/
            while (!loopEntrie["done"]) {
            //loopEntrie对象的value属性以数组形式存储了一对key/value,数组下标0为key,下标1为value
                loopValue = loopEntrie["value"];
                console.log(loopValue[0] + "=" + loopValue[1]);
                loopEntrie = entriesObj.next();
            }
        }
    </script>
</head>
<body>
</body>
</html>

forEach 循环取值

    <script type="text/javascript">
        var formData = new FormData();
        formData.set("code", "200");
        formData.set("msg", "请求成功");
        formData.set("data", null);

        //forEach 循环
        formData.forEach(function (value, key) {
            console.log(key + "=" + value);
        });
    </script>

Json 与 FromData 相互转换

    <script type="text/javascript">
        /**
         * json 对象转 FormData 对象
         * @param jsonObj
         * @return {FormData}
         */
        function jsonObjToFormObj(jsonObj) {
            var formData = new FormData();
            Object.keys(jsonObj).forEach(function (key) {
                formData.append(key, jsonObj[key]);
            });
            return formData;
        }
        //转换测试
        var jsonObj = {"code": "200", "msg": "请求成功", "data": null};
        var formData = jsonObjToFormObj(jsonObj);
        formData.forEach(function (value, key) {
            console.log(key + "=" + value);
        });
    </script>
    <script type="text/javascript">
        //测试数据
        var formData = new FormData();
        formData.set("code", "200");
        formData.set("msg", "上传成功");
        formData.set("data", null);

        //formData 转 json 对象
        var jsonObj = {};
        formData.forEach(function (value, key) {
            jsonObj[key] = value;
        });
        console.log(jsonObj);
    </script>

前后台 formData 数据传输示例

1、FormData 实际就是一个表单对象,所以可以用来直接封装表单数据,前台页面如下:

    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#uploadButton").click(function(){

                /** 模拟一个简单的用户信息提交
                 * 这些数据平时都会放在页面让用户填写的
                 * 下面完全等价于<form>标签**/
                var formData = new FormData();
                formData.append("name","李四");
                formData.append("age",33);
                formData.append("sex",true);

                /**下面两个设置很关键,和平时使用时略有不同
                 * contentType: false->告诉jQuery不要去设置Content-Type请求头
                 * processData: false->告诉jQuery不要去处理发送的数据
                 */
                $.ajax({
                    url : "resourceController/test.action",
                    type: 'POST',
                    data: formData,
                    dataType:"JSON",
                    contentType: false,
                    processData: false,
                    success : function(data) {
                        console.log(JSON.stringify(data));
                        alert("上传成功")
                    },
                    error : function(data) {
                        console.log(JSON.stringify(data));
                        alert("上传失败");
                    }
                });
            });
        });

    </script>
</head>
<body>
<input type="button" id="uploadButton" value="提交">

2、后台代码

/** 测试使用,请删除
 * 后台接收和平时没有任何区别,可以单个命名接收,或者POJO对象直接自动封装接收
 * 下面是SpringMVC的接收方式,参数名必须与前台表单的name属性一致
 * @param name
 * @param age
 * @param sex
 * @param response
 */
@RequestMapping("test.action")
public void test(String name,String age,String sex, HttpServletResponse response) {
    try {
        response.setContentType("text/json;charset=UTF-8");
        PrintWriter printWriter = response.getWriter();
        JsonObject jsonObject = new JsonObject();

        System.out.println(name+":"+age+"::"+sex);

        printWriter.write(jsonObject.toString());
        printWriter.flush();
        printWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

测试结果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值