JavaWeb开发中form、ajax提交数据Model转化

JavaWeb开发中form、ajax提交数据Model转化

问题

最近学习MongoDB数据库,作为java开发的我,当然需要做个小的web程序来测试一番了。在html中我采取ajax提交方式,因为我要模拟各种类型的数据,基础数据类型、数组、对象等。然而,最终发现了个不同的地方:Form和ajax提交数据,在HttpServletRequest中尽然参数名有所不同。

数据类型 form ajax
基础数据 para=value para=value
数组 para[]={“aaa”,”bbb”} para[][]={“aaa”,”bbb”}
对象 obj.sex=女(和基础数据一样,只不过用了obj.) obj[sex]=女
对象数组 obj[0].sex obj[0][sex]=女

form提交,以上的参数方式,需要在input的name属性定义,常用的都是springmvc的数据绑定;ajax提交,参数来自data提交的对象的属性。


$.ajax({
    type: "post",
    dataType: "json",
    url: "${ctx}/api/manage/save",
    data: {
        test: [‘aab‘, ‘bbb‘, ‘ccc‘],
        table: ‘tableName‘,
        fields: [{
                ‘field‘: ‘f‘,
                ‘type‘: ‘t‘,
                ‘desc‘: ‘d‘
                },
                {
                ‘field‘: ‘f1‘,
                ‘type‘: ‘t1‘,
                ‘desc‘: ‘d1‘
                ]
    }
}).success(function(data) {
    alert(data.msg);
});

如上,就是一个ajax提交。


解决

发现了这个差异化,起始也没什么。但是在提交的时候,获取数据并解析有时候确实有些麻烦,即是spring等框架能够完美支持,但是还是应该搞懂原理。所以我也不打算去看spring的原理了,我会晕掉的。

为了彻底解决这个问题,我就自己写了一个类,采用递归方式。下来来分析下

  1. 首先需要一个通过参数获取T的一个方法,如下
public static <T> T getModel(Map<String, String[]> map, Class<T> clazz) {
    Map<String, Object> jsonMap = new HashMap<String, Object>();
    for (String key : map.keySet()) {
        String[] values = map.get(key);
        //$.ajax提交data:{arr:[‘aaa‘,‘bbb‘]},到这里key是arr[][]
        if (key.endsWith("[]"))
            key = key.substring(0, key.length() - 2);
        parseKey(key, values, clazz, jsonMap);
    }
    return JSON.parseObject(JSON.toJSONString(jsonMap), clazz);
}

在这个方法中有两点:

1、ajax提交数组[][],需要去掉一个保持key的一致性

2、将Map转化为T对象,这里是通过fastjson来做的转化(现将Map转成json,然后再讲json转回T,因为直接转化有点难度)

parseKey方法

private static void parseKey(String key, String[] values, Class<?> clazz,
        Map<String, Object> jsonMap) {
    if (hasSubClass(key)) {//数组或对象的对象
        String field = key.substring(0, key.indexOf("["));
        String classField = "";
        if (key.contains(".")) { //将form中的. 统一转化为[]来操作
            key = key.replace("].", pattern).replace(".", pattern);
            key = key + "]";
        }
        if (key.indexOf(pattern) != key.lastIndexOf(pattern)) {//可能是数组对象
            classField = key.substring(key.indexOf(pattern) + 2,
                    key.length()).replaceFirst("]", "");
        } else {
            classField = key.substring(key.indexOf(pattern) + 2,
                    key.length() - 1);
        }
        if (jsonMap.get(field) == null) {
            jsonMap.put(field, new ArrayList<Map<String, Object>>());
        }
        List<Map<String, Object>> list = (List) jsonMap.get(field);
        int i = Integer.parseInt(key.substring(field.length() + 1,
                field.length() + 2)) + 1;
        for (int j = 0; j < i; j++) {
            try {
                list.get(j);
                continue;
            } catch (Exception e) {
                list.add(j, new HashMap<String, Object>());
            }
        }
        Class<?> subClass = null;
        try {
            ParameterizedType cl = (ParameterizedType) clazz
                    .getDeclaredField(field).getGenericType();
            subClass = (Class<?>) cl.getActualTypeArguments()[0];
            parseKey(classField, values, subClass, list.get(i - 1));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    } else {//基本数据或对象
        try {
            load(key, values, clazz, jsonMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个方法主要就是根据参数的规则,然后判断数据的类型,然后进行对应的转化,这个里面用了递归,原因大家应该知道,我就不多说了。

最后

大概的思路就是这样:判断参数+反射;反射是为了数据的准确性。

最终版本:下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 14:45:53

JavaWeb开发中form、ajax提交数据Model转化的相关文章

MVC中使用Ajax提交数据 Jquery Ajax方法传值到action

Jquery Ajax方法传值到action <script type="text/javascript"> $(document).ready(function(){ $("#btn").click(function(){ $.ajax({ type: 'POST', url: "/Home/MyAjax", data: { val1: $("#txt1").val(), val2: $("#txt2&

jQuery 中 ajax 提交数据应用的一个小demo

举一个jquery中ajax的应用小 demo 便于以后的更多项目拓展 ,这里要注意的是保存的文件名问题 ... ajax02.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="form&qu

解决部分浏览器ajax提交数据,数据已改变,却后台数据接收数据还是上一次值的问题

最近在工作中遇到了QQ浏览器ajax提交数据,表单数据改变,却后台数据接收数据还是上一次值的问题,但是在其它浏览器中是正常的. 代码如下: $.ajax({ url : "<%=path%>/secretkey/uploadKey", async:false, type : 'post', data : { merKey : $('#merKey').val(), keyType : $('#keyType').val(), type : $('#type').val()

在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ,我们就可以不用在服务器上开发SharePoint解决方案了,开发的方式更加多元化,这又加速了SharePoint 更大范围的应用. 现在,我们可以在任一台PC上安装Visual Studio 然后使用类似于 Object Model的模型来访问服务器上的列表.网站或是其它任何东东. 那么 ,如何使

Mock.js开发中拦截Ajax

Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢,答案是肯定的.应该有人通过编写json文件来模拟后台数据,但是很局限,比如增删改查这些接口怎么实现呢,于是今天我们来介绍一款非常强大的插

ios开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

               在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文本框内容的创建.修改,退出后台,再重新回到后台,来认识这两种持久化数据的方式.效果图如下[图1]: [图1 GUI界面效果图] [本次开发环境: Xcode:7.2     iOS Simulator:iphone6S plus   By:啊左]     一.数据库SQL

ajax提交数据问题

加入traditional:true属性 traditional 类型:Boolean 如果你想要用传统的方式来序列化数据,那么就设置为 true.请参考工具分类下面的 jQuery.param 方法. $.ajax({ type: "POST", url: url, traditional:true, data:{ data:[0,1] }, dataType: "json", async:false }); ajax提交数据问题

AJAX提交数据成功但不会跳转页面

HTML页面通过ajax提交数据成功,但是会执行多次success方法,不会跳转到指定页面 解决办法;把button的type改为button即可 1 <button type="button" id="addBtn" class="btn btn-primary btn-lg">添加</button> 2 3 <script type="text/javascript"> 4  $(&qu

向后台提交数据:通过form表单提交数据需刷新网页 但通过Ajax提交数据不用刷新网页可通过原生态Ajax或jqueryAjax。Ajax代码部分

原生态Ajax提交表单:需要借助XMLHttpRequest对象的open,要收通过post发送请求还要setRequsetHeader,然后把数据发送给后端,代码如下 目录结构 index.py代码 1 #index.py 2 #!/usr/bin/env python 3 #-*- coding:utf-8 -*- 4 import tornado.web 5 import tornado.ioloop 6 class indexHandler(tornado.web.RequestHand