`

JQuery Ajax向后台传递数组

阅读更多
需求:

在JS中向后台传递数组参数

分析:

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了。我使用jsontools-core-1.7.jar,此jar包依赖antlr-2.7.7.jar,自行到代码库中下载,下载完毕,导入classpath,写一个简单的工具类,主要有这么2个方法:
/**
	 * 将对象转换为JSON格式的字符串
	 * @param obj
	 * @return 返回JSON字符串
	 */
	public static String toJSONAsString(Object obj){
		try {
			return JSONMapper.toJSON(obj).render(false);
		} catch (MapperException 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;
	}
}
分享到:
评论
5 楼 tigerl 2014-07-17  
天助者自助 写道
我对底层jar包不是很了解  报的错给你看看  
line 1:16: unexpected char: 'a'
	at com.sdicons.json.parser.impl.JSONLexer.nextToken(JSONLexer.java:168)
	at antlr.TokenBuffer.fill(TokenBuffer.java:69)
	at antlr.TokenBuffer.LA(TokenBuffer.java:80)
	at antlr.LLkParser.LA(LLkParser.java:52)
	at com.sdicons.json.parser.impl.JSONParserAntlr.value(JSONParserAntlr.java:54)
	at com.sdicons.json.parser.impl.JSONParserAntlr.object(JSONParserAntlr.java:112)
	at com.sdicons.json.parser.impl.JSONParserAntlr.value(JSONParserAntlr.java:57)
	at com.sdicons.json.parser.JSONParser.nextValue(JSONParser.java:96)
	at com.fz.disk.util.JsonUtil.jsonToObject(JsonUtil.java:30)
	at com.fz.disk.file.action.DataNodeAction.addDataNode(DataNodeAction.java:69)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)


你的确保你的json字符串是合法的,仔细看我的例子
4 楼 天助者自助 2014-07-13  
我对底层jar包不是很了解  报的错给你看看  
line 1:16: unexpected char: 'a'
	at com.sdicons.json.parser.impl.JSONLexer.nextToken(JSONLexer.java:168)
	at antlr.TokenBuffer.fill(TokenBuffer.java:69)
	at antlr.TokenBuffer.LA(TokenBuffer.java:80)
	at antlr.LLkParser.LA(LLkParser.java:52)
	at com.sdicons.json.parser.impl.JSONParserAntlr.value(JSONParserAntlr.java:54)
	at com.sdicons.json.parser.impl.JSONParserAntlr.object(JSONParserAntlr.java:112)
	at com.sdicons.json.parser.impl.JSONParserAntlr.value(JSONParserAntlr.java:57)
	at com.sdicons.json.parser.JSONParser.nextValue(JSONParser.java:96)
	at com.fz.disk.util.JsonUtil.jsonToObject(JsonUtil.java:30)
	at com.fz.disk.file.action.DataNodeAction.addDataNode(DataNodeAction.java:69)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
3 楼 天助者自助 2014-07-13  
楼主   我按照你上面的包写的 当字符串数组传递到后台后  我将字符串分别转换为对象时报TokenStreamException 这个异常了   这是怎么回事额   谢谢   代码如下:
try {
			Host hosts = JsonUtil.jsonToObject(inte[0], Host.class);
			System.out.println(hosts.getHost());
		} catch (TokenStreamException e) {
			e.printStackTrace();
		} catch (RecognitionException e) {
			e.printStackTrace();
		} catch (MapperException e) {
			e.printStackTrace();
		}  
2 楼 tigerl 2014-04-10  
liuweihug 写道
Jquery ajax传递对象(数组)到后台并解析的实现 - 前端编程 - IT工作生活这点事。Just Such So!
http://www.suchso.com/UIweb/jquery-ajax-post-array-csharp-json.html


什么意思?怎么了??
1 楼 liuweihug 2014-04-08  
Jquery ajax传递对象(数组)到后台并解析的实现 - 前端编程 - IT工作生活这点事。Just Such So!
http://www.suchso.com/UIweb/jquery-ajax-post-array-csharp-json.html

相关推荐

    jquery ajax 向后台传递数组参数示例

    本文将深入讲解如何在jQuery AJAX中向后台传递数组参数,并提供示例代码。 首先,理解问题的关键在于JavaScript数组在传递给后台时,如果数组内包含的是对象,会被转化为`[object Object]`的字符串形式。这是因为...

    jQuery.ajax向后台传递数组问题的解决方法

    当使用jQuery的/ajax()方法向后端传递数组时,可能会遇到后台无法正确接收数组的问题。通常情况下,JavaScript在对象中作为值传递数组时,并不会改变其作为数组的特性。但在某些后端技术中,比如Spring MVC,会因为...

    AJAX和struts2传递JSON数组

    总结来说,通过这种方式,我们可以利用AJAX向Struts2 Action传递JSON数组,实现异步数据交互。这在动态更新页面内容、处理表单提交等场景下非常有用。同时,使用JSON作为数据交换格式,使得前后端的数据交换变得更加...

    jquery 向后台传 数组对象

    在这个场景中,我们特别关注的是如何使用jQuery传递数组对象到后台。下面我们将详细探讨这个主题。 1. **JSON对象与数组** 在JavaScript中,数组是存储一系列值的数据结构,而对象则是一组键值对。为了将数组或...

    ajax传递list对象数组

    ### AJAX传递List对象数组知识点详解 #### 一、前言 在Web开发中,前后端交互是必不可少的一个环节。AJAX作为一种实现异步加载数据的技术,可以有效地提升用户体验。本篇将详细介绍如何通过AJAX来传递一个List对象...

    jquery向后台提交数组的代码分析

    下面详细探讨jquery向后台提交数组时涉及到的各个知识点。 ### jQuery向后台提交数组 #### 1. 使用$.post()方法提交数组 jQuery提供了多种方式来发送HTTP请求,其中包括$.post()方法。在需要向后台提交数组时,...

    jQuery中ajax请求后台返回json数据并渲染HTML的方法

    jQuery中的AJAX请求是一种非常常见的前端异步数据交互方式,它的作用是使得页面无需重新加载即可向服务器请求数据,并将数据动态地加载到页面中。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它...

    Asp.net中JQuery、ajax调用后台方法总结

    Asp.net 中 jQuery、ajax 调用后台方法总结 在 Asp.net 中,使用 jQuery 和 Ajax 调用后台方法是一种常见的做法。下面总结了几种常见的调用方法。 有参数的方法调用 在前台使用 jQuery 代码调用后台方法时,需要...

    jQuery的Ajax实现异步传输List、Map

    通过正确配置Ajax请求和服务器接口,你可以轻松地传递和处理List、Map等复杂数据结构,提升Web应用的交互体验。在实际项目中,确保对错误处理和安全性有充分考虑,这将有助于构建健壮和安全的Web应用。

    springMvc 前端用json的方式向后台传递对象数组方法

    本示例中,前端使用JSON格式向后台传递对象数组,这是一个常见的Ajax异步请求。以下将详细讲解实现这个功能的关键步骤和涉及的技术点。 首先,前端部分: 1. 创建一个JavaScript数组`vipFee`来存储待传递的对象: ...

    jquery利用ajax调用后台方法实例

    返回的是JSON格式的数据,可以被jQuery的Ajax请求接收并传递给回调函数。 总结一下,这个实例展示了以下关键知识点: 1. **jQuery的Ajax功能**:`$.get`方法用于发起GET请求,`callback`函数处理响应数据。 2. **...

    jquery ajax 分页 前端

    **jQuery AJAX 分页技术在前端应用详解** 在Web开发中,分页是一种常见的用户界面功能,用于处理大量数据的展示,提高页面加载速度并优化用户体验。本篇文章将深入探讨如何利用jQuery和AJAX技术实现纯前端的分页...

    jsp中利用jquery+ajax在前后台之间传递json格式参数.docx

    总结来说,通过jQuery的AJAX功能,前后台间可以方便地传递JSON数据。在实际应用中,这允许开发人员实现动态数据交互,提高用户体验,同时减少了不必要的页面刷新。需要注意的是,确保JSON格式的正确性以及在前后端...

    php基于jquery的ajax技术传递json数据简洁实例_.docx

    在这个实例中,我们将探讨如何使用jQuery库结合PHP来通过AJAX传递JSON数据。jQuery简化了JavaScript的DOM操作和AJAX调用,使得开发更为便捷。 首先,我们来看HTML部分。HTML页面包含一个表单,用户可以输入姓名、...

    jQuery AJAX实现调用页面后台方法

    通过以上步骤,我们可以实现使用jQuery AJAX从页面前端调用后台方法,获取数据并更新页面内容,从而实现页面的动态更新,提高用户体验。在实际开发中,可以根据需求调整这些方法,例如添加请求前后的加载动画,或者...

    Ajax-json.rar_JSON_ajax json_java Jquery ajax_javascript_json aj

    由于其语法与JavaScript对象的语法几乎相同,因此在AJAX中,JSON成为传递数据的理想选择。JSON格式有以下特点: 1. **键值对**:数据以键值对的形式存储,键用引号括起,冒号分隔键和值,逗号分隔各个键值对。 2. *...

    jquery post方式传递多个参数值后台以数组的方式进行接收

    在使用jQuery发起AJAX请求时,我们经常会遇到需要向服务器端传递多个参数的情况。标准的$.post方法并不直接支持数组类型的参数,但是我们可以通过特定的方式来实现这一需求。下面,我会详细介绍如何使用jQuery的$....

Global site tag (gtag.js) - Google Analytics