Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 传递地图<;字符串,字符串>;到springMVC控制器_Ajax_Json_Spring_Spring Mvc - Fatal编程技术网

Ajax 传递地图<;字符串,字符串>;到springMVC控制器

Ajax 传递地图<;字符串,字符串>;到springMVC控制器,ajax,json,spring,spring-mvc,Ajax,Json,Spring,Spring Mvc,我试图将HashMap或任何其他Map实现从ajax发送到SpringMVC控制器 以下是我如何做到这一点的细节: Ajax调用如下 var tags = {}; tags["foo"] = "bar"; tags["whee"] = "whizzz"; $.post("doTestMap.do", {"tags" : tags }, function(data, textStatus, jqXHR) { if (textStatus == 'success') { //hand

我试图将HashMap或任何其他Map实现从ajax发送到SpringMVC控制器

以下是我如何做到这一点的细节:

Ajax调用如下

var tags = {};
tags["foo"] = "bar";
tags["whee"] = "whizzz";


$.post("doTestMap.do",   {"tags" : tags }, function(data, textStatus, jqXHR) {
if (textStatus == 'success') {
    //handle success
    console.log("doTest returned " + data);
} else {
    console.err("doTest returned " + data);
}
}); 
在控制器方面,我有:

@RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
public @ResponseBody String doTestMap(@RequestParam(value = "tags", defaultValue = "") HashMap<String,String> tags, HttpServletRequest request) {  //

    System.out.println(tags);

    return "cool";
} 
我做错了什么


谢谢。

您正在发送一个javascript数组
标记
,默认情况下,该数组将由jQuery作为一系列名为
标记[]的参数进行url编码。
。不确定这是否是你想要的

您会得到一个错误,因为spring没有从多个同名参数到
HashMap
的默认转换策略。但是,它可以轻松地将它们转换为
列表
、数组或
集合

所以试试这个:

@RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
public @ResponseBody String doTestMap(@RequestParam(value = "tags[]") Set<String> tags, HttpServletRequest request) {  //

    System.out.println(tags); //this probably won't print what you want

    return "cool";
} 
@RequestMapping(value=“/publisher/doTestMap.do”,method=RequestMethod.POST)
public@ResponseBody字符串doTestMap(@RequestParam(value=“tags[]”)Set tags,HttpServletRequest请求){//
System.out.println(标记);//这可能无法打印您想要的内容
返回“酷”;
} 

最好的方法是使用JSON编码对象并对其进行解码

你需要两个图书馆。在你需要的客户端。现在有些浏览器似乎是天生这样做的。但这样做更安全

在您需要的服务器上

在客户端上,对地图进行编码并将其作为参数传递:

var myEncodedObject = JSON.stringify(tags);
在服务器上,以字符串形式接收参数并对其进行解码:

ObjectMapper myMapper = new ObjectMapper();
Map<String, Object> myMap = myMapper.readValue(tags, new TypeReference<Map<String, Object>>);
ObjectMapper myMapper=new ObjectMapper();
Map myMap=myMapper.readValue(标记,新类型引用);

Spring中可能有某种方法使其自动转换,但这是它的要点。

在Spring控制器中绑定映射的支持方式与绑定数组的支持方式相同。不需要特殊的转换器

但有一件事需要记住:

  • Spring使用命令对象作为顶级值保持器。命令对象可以是任何类
因此,您只需要一个包装类(
TagsWrapper
),它保存一个名为tags的
Map
类型的字段。 与绑定数组的方法相同

文档中对此进行了很好的解释,但我偶尔会忘记包装器对象的需要;)

您需要更改的第二件事是提交标记值的方式:

  • 每个映射键使用一个表单参数,而不是完整映射的完整字符串表示形式
  • 一个输入值应如下所示:

      <input type="text" name="tags[key]" value="something">
    
    
    

如果标记是包装器中的映射,则此操作可用于表单提交。

以下是我的完整答案,其中包含根据Martin Frey的帮助编写的代码:

javascript端(注意标记值是如何填充的):

然后在控制器端:

@RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
public @ResponseBody String doTestMap(@ModelAttribute MyWrapper wrapper, HttpServletRequest request) {
} 
并创建包含Map的包装器类:

class MyWrapper {

    Map<String,String> tags;

   +getters and setters

}
类MyWrapper{
地图标签;
+接球手和接球手
}

然后你会得到你的地图适当填充

这可能是响应的延迟。然而,它可能会帮助某些人。 我有一个类似的问题,这就是我如何解决它。 关于JS: 我的地图看起来像

var values = {};
values[element.id] = element.value;
阿贾克斯:

控制器:

@RequestMapping(value = "/xxx.mvc", method=RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> getValues(@RequestBody Map<String, Object> pvmValues, final HttpServletRequest request, final HttpServletResponse response) {
System.out.println(pvmValues.get("key"));
}
@RequestMapping(value=“/xxx.mvc”,method=RequestMethod.POST)
@应答器
公共映射getValues(@RequestBody-Map-pvmValues,最终HttpServletRequest请求,最终HttpServletResponse响应){
System.out.println(pvmValues.get(“key”));
}

看起来spring将“tags”参数读取为字符串,而不是映射。这意味着spring没有将字符串转换为映射的默认消息转换器。所以您需要编写自定义MessageConverter并在应用程序中注册它?spring不支持映射到开箱即用的映射吗?
tags
如何用jquery
post
序列化?它看起来像json。可能您正在寻找
@RequestBody
。javascript端的
标记是什么类型的?生成的地图将把什么映射到什么?是的,就是它!如果将映射包装在任何类的@modeldattribute注释参数中,则该映射有效。这太疯狂了,因为如果你只是把map作为参数放到controller方法中,它不会正确绑定,并创建一个空的BindingAwareModelMap请注意,关于表单参数的注释是正确的。谢谢!在Javascript上,使用类似这样的东西;var值={};elementid=elementvalue;而不是值[elementid]=elementvalue;我们使用的是spring安全性,上面的代码给出了403异常。因此,我们必须遵循这个答案以及上述变化。
var values = {};
values[element.id] = element.value;
        $.ajax({
            type : 'POST',
            url : 'xxx.mvc',
            data : JSON.stringify(values),              
            error : function(response) {
                alert("Operation failed.");
            },
            success : function(response) {
                alert("Success");
            },
            contentType : "application/json",
            dataType : "json"
        });
@RequestMapping(value = "/xxx.mvc", method=RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> getValues(@RequestBody Map<String, Object> pvmValues, final HttpServletRequest request, final HttpServletResponse response) {
System.out.println(pvmValues.get("key"));
}