在struts2中,接受ajax传的json对象集合,接受不到

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在struts2中,接受ajax传的json对象集合,接受不到相关的知识,希望对你有一定的参考价值。

实例如下:action中,action中List<JsonTest> jsonTest = new ArrayList<JsonTest>();有jsonTest的get,set方法;JsonTest有属性t_id,t_name,有set,get方法,js:
$.ajax(
type:"POST",
async:false,
url :"<%=basePath%>pages/User/getUserObj.action",
data :
'userName' : '薛军军',
'sex' : '男',
'others' : '其他值',
'jsonTest':['t_id':'sd','t_name':'trs','t_id':'sd','t_name':'trs']
,
dataType : "text",
success : function(data)
alert(data);


);
报错:
16:09:30,687 WARN OgnlValueStack:60 - Error setting value
java.lang.NullPointerException
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:160)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2315)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.ASTChain.setValueBody(ASTChain.java:227)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
谢谢回答

参考技术A dataType : "text",

你 的ajax 参数 是 json 格式 这里 用 text 文本类型 发送 肯定是不对的吧

你 该 成 json 试试
参考技术B 不知道你解决了没有。我刚好遇到这个问题,基本上和你差不多。
你这个实际上是复杂数据传递。
因为你的json中又包含了JsonArray,array中又存储了json对象......
因为你是采用jquery的Ajax进行传递的,但是jquery的ajax和struts并不是很兼容,传递过去的值,根本无法被被正确的解析。那么如何解决这个问题呢?
这样改
var myparam = var myparam = JSON.stringify(

'userName' : '薛军军',
'sex' : '男',
'others' : '其他值',
'jsonTest':['t_id':'sd','t_name':'trs','t_id':'sd','t_name':'trs']
,
);
$.ajax(
type:"POST",
async:false,
url :"<%=basePath%>pages/User/getUserObj.action",
data : myparam,
dataType : "text",
success : function(data)
alert(data);


);
这样就向后台传递了正确的json对象。
但是现在后台还无法正确接收对象,还需要配置struts.xml,在你的包中,action前面加上拦截器
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="json"></interceptor-ref>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack" />
好了,这样就应该可以了本回答被提问者和网友采纳

springMVC通过ajax传递参数list对象或传递数组对象到后台

springMVC通过ajax传递参数list对象或传递数组对象到后台

环境:

  • 前台传递参数到后台
  • 前台使用ajax
  • 后台使用springMVC
  • 传递的参数是N多个对象

 

JSON对象和JSON字符串

在SpringMVC环境中,@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。
然而在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。
同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端!

Content-Type

  服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,且Content-Type为application/x-www-form-urlencoded,
而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,
所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。 jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,
如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。


第一种方式 传递的参数Bean

jsp文件:
$("#saveuddd").click(function(){
                    var saveDataAry=[];
                    var data1={"name":"test","password":"gz"};
                    var data2={"name":"ququ","password":"gr"};
                    saveDataAry.push(data1);
                    saveDataAry.push(data2);
                    $.ajax({
                        type:"POST",
                        url: basePath + "/user/saveUser",
                        dataType:"json",
                        contentType:"application/json", // 指定这个协议很重要
                        data:JSON.stringify(saveDataAry), //只有这一个参数,json格式,后台解析为实体,后台可以直接用
                        success:function(data){
                        }
                    });
                })
java文件
 @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
     @ResponseBody
    public void saveu( @RequestBody List<User> users ){ //此时的user是map数据,并没有解析为bean // 不建议使用
         System.out.println(users) ;
    }
使用如下方法,可以使用bean
 @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
     @ResponseBody
    public void saveu( @RequestBody User[] users ){ 
         System.out.println(users.getName()) ; // 此时的user是实体bean
    }

 

第二种方式 传递的键值对

jsp同上
另外一种:
 @RequestMapping(value = "saveUser", method = {RequestMethod.POST })
 @ResponseBody
 public void saveu( @RequestBody List<Map<String,String>> users ){ // spring MVC只能解析外层的json格式,内部的bean转化为Map格式的键值对,需要对map解析
      List<User> userList = new ArrayList<User>();
      for(Map<String,String> map : users){
          User u = new User();
          u.setName(map.get("name"));
          u.setPassword(map.get("password"));
          userList.add(u);
      }
     // 这里就可以使用 userList 了
 }

 

第三种方式

能够传递多个参数,但是每一个参数都是字符串(bean类型的数据会转化为JSON格式的字符串)

jsp文件
$("#saveuddd").click(function(){
                    var saveDataAry=[];
                    var data1={"name":"test","password":"gz"};
                    var data2={"name":"ququ","password":"gr"};
                    saveDataAry.push(data1);
                    saveDataAry.push(data2);
                    $.ajax({
                        type:"POST",
                        url: basePath + "/user/saveUser",
                        dataType:"json",
                        data:{users:JSON.stringify(saveDataAry),aa:"ddd"},
                          // 可以传递多个参数,但此时的users内容与另外一个参数:aa 的内容一起传递,所以后台解析为字符串
                         // 后台接收的users内容:[{"name":"test","password":"gz"},{"name":"ququ","password":"gr"}]
                         // 后台接收的 aa 内容:"ddd"
                        success:function(data){

                        }
                    });
                })
java文件
@RequestMapping(value = "saveUser", method = {RequestMethod.POST })
     @ResponseBody
    public void saveu( String users , String aa ){
         System.out.println(users) ;
    }

 

转载自 https://blog.csdn.net/alan_alei/article/details/73361104

 
 










以上是关于在struts2中,接受ajax传的json对象集合,接受不到的主要内容,如果未能解决你的问题,请参考以下文章

Struts2+Jquery实现ajax并返回json类型数据

Struts2+Jquery实现ajax并返回json类型数据

Struts2:Json插件_Ajax

json与java对象的转换,以及struts2对json的支持,实现ajax技术

struts2,ajax,json传json给Action中的类对象,并返回需要的数据

struts2怎样获取AJAX post请求传递的数据