• 技术文章 >web前端 >js教程

    jquery ajax 向后台传递数组以及如何在后台接收数组代码详解

    伊谢尔伦伊谢尔伦2017-07-17 14:06:26原创2449
    JS中的数组是弱类型的可以放任何类型(对象、基本类型),但是如果数组中放的是对象类型,传递到后台是显示的只能是对象字符串--[object Object],原因如下:

    在后台接收的时候,只能用request来接收,request.getParameterValues()方法返回的是一个String[],所以,应该是在前台传输的时候调用了对象的toString()方法,那么如果依然想传递对象怎么办?但是可以使用JSON字符串来实现,在后台把JSON字符串解析成JAVA对象。
    也许,你要说如果是复合对象怎么办,比如如下:

    public class Person { 
    private String username; 
    private String password; 
    private Address addr; 
    }

    Person对象里有个Address类型的addr属性,没关系,任何对象最终用到的属性值都是基本数据类型,只需要使用对应的包装类型parseInt、或者parseXXX解析即可。
    实现:
    OK,原理就是这么个。先看JS如何写:

    var as = []; 
    var temp = []; 
    for ( var int = 0; int < 5; int++) { 
    temp.push('{"k":'); 
    temp.push(int); 
    temp.push(',"v":'); 
    temp.push(int); 
    temp.push('}'); 
    as.push(temp.join("")); 
    } 
    //Jquery中的方法,具体参考Jquery API 
    $.post( "servlet/AjaxServlet?m=putWarningRule",{"aa":as} );

    最终拼成的串就是如下样式,(只作举例)

    {"k":0,"v":0}

    后台接收,不讨论任何框架,只需要HttpServletRequest即可

    String[] jsonArr = request.getParameterValues("aa[]");

    有一点需要注意,在js中传参的时候参数名叫"aa",而在后台接收的时候却是"aa[]",这里应该是Jquery做了转换,所以最好的方式就是在JS中就改为"aa[]",之所以这里没有写"[]"是为了说明问题。可以使用如下方式打印request中的所有参数

    Enumeration<String> names = request.getParameterNames(); 
    while (names.hasMoreElements()) { 
    String string = (String) names.nextElement(); 
    System.out.println(string); 
    }

    OK,至此为止,已经接收完毕,剩下的就是如何将一个JSON字符串转成一个POJO了。

    /** 
    * 将对象转换为JSON格式的字符串 
    * @param obj 
    * @return 返回JSON字符串 
    */ 
    public 
    static
     String toJSONAsString(Object obj){ 
    try { 
    return JSONMapper.toJSON(obj).render(false); 
    } catch (Mapper
    Exception
     e) { 
    e.printStackTrace(); 
    } 
    return null; 
    } 
    @SuppressWarnings("unchecked") 
    public static <T> T jsonToObject(String jsonStr, Class<T> targetClass) throws TokenStreamException, RecognitionException, MapperException{ 
    JSONValue jv = new JSONParser(new StringReader(jsonStr)).nextValue(); 
    return (T) JSONMapper.toJava(jv,targetClass); 
    } 
    //test 
    public static void main(String[] args) throws Exception { 
    Person p = new Person(); 
    p.setK("a"); 
    p.setV("v"); 
    String json = toJSONAsString(p); 
    Person np = jsonToObject(json,Person.class); 
    System.out.println(np.getK()+"=="+np.getV()); 
    }

    request取到值后,遍历数组,挨个转换

    Person p = JSONUtils.jsonToObject(jsonArr[0], Person.class);

    Person类如下:

    public class Person { 
    private String k; 
    private String v; 
    public String getK() { 
    return k; 
    } 
    public void setK(String k) { 
    this.k = k; 
    } 
    public String getV() { 
    return v; 
    } 
    public void setV(String v) { 
    this.v = v; 
    } 
    }

    有时候会出现问题,后台接收不到该值。

    解决办法:

    设置jQuery.ajax的tradional属性

    $.ajax({
      url: "/xxx",
      type: "GET",
      data: {
        "boxIds": boxIds,
        "boxType": 0,
        "time": new Date().getTime()
      },
      traditional: true,//这里设置为true
      success: function(data) {
        //do sth...
      }
    });

    请求参数2

    这次参数不带”[]”了,并且后台可以成功接收到该数组。

    以上就是jquery ajax 向后台传递数组以及如何在后台接收数组代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:jquery ajax 数组
    上一篇:关于Vue.js如何操作单页面多路由区域的实例分析 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Angular学习之聊聊Http ( 错误处理 / 请求拦截 )• 一文详解多版本node的安装和管理• 浅析Angular中的Change Detection机制• 一文聊聊node中的path模块• 浅析Angular变更检测中的订阅异步事件
    1/1

    PHP中文网