`
tigerl
  • 浏览: 97121 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 向后台传递数组参数示例

    需求: 在JS中向后台传递数组参数 分析: JS中的数组是弱类型的可以放任何类型(对象、基本类型),但是如果数组中放的是对象类型,传递到后台是显示的只能是对象字符串–[object Object],原因如下: 在后台接收的...

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

    主要为大家详细介绍了jQuery.ajax向后台传递数组问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring MVC不能直接接收list类型参数的问题

    前端使用jquery向后台传递数组类型的参数,Java后台直接通过List类型接收,会发现无法取到参数。

    JQuery的Ajax请求实现局部刷新的简单实例

    请求的ajax路径传递的参数(data)会到action中被一个同样名字的变量(附带set get方法)接收,返回的data是一个JQuery的数组对象,在被调用的action中涉及到的数据变量会对象,都会封装到data中最终返回给页面。...

    js对ajax返回数组的处理介绍

    引言:ajax异步传输,可以传输字符串,但是数组这样的数据,就不太好传递了,这个时候怎么办呢? 答案是可以通过json来处理,后台将数据数据进行json编码! 然后客户端,通过js来进行解析。 这样问题就解决了!json...

    Java面试宝典2020修订版V1.0.1.doc

    9、java后台如何接收ajax数据? 26 10、为什么要有jquery? 26 11、jQuery选择器有多少种? 27 13、你是如何使用jquery中的ajax的? 27 14、jquery中的$.get和$.post请求区别? 27 15、jquery中如何操作样式的? 28 ...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -一个典型应用,在Window控件中打开新页面,如果传递的参数不正确,则首先提示参数不对然后关闭此弹出窗口。 -ExtAspNet.Alert.Show("参数错误!", String.Empty, ExtAspNet.ActiveWindow.GetCloseReference());...

    ExtAspNet_v2.3.2_dll

    -一个典型应用,在Window控件中打开新页面,如果传递的参数不正确,则首先提示参数不对然后关闭此弹出窗口。 -ExtAspNet.Alert.Show("参数错误!", String.Empty, ExtAspNet.ActiveWindow.GetCloseReference());...

    大名鼎鼎SWFUpload- Flash+JS 上传

     file_post_name : "Filedata", 是POST过去的$_FILES的数组名  post_params : {  "post_param_name_1" : "post_param_value_1",  "post_param_name_2" : "post_param_value_2",  "post_param_name_n" : ...

    xheditor-1.1.14

    方法2:利用xhEditor提供的jQuery插件接口来实现对特定textarea的初始化和传递参数,例: $('#elm1').xheditor(); 或者 $('#elm1').xheditor({tools:'mini'}); 特别说明:两种初始化方法只能选择其中一种使用,如果...

Global site tag (gtag.js) - Google Analytics