Ajax 传递地图<;字符串,字符串>;到springMVC控制器
我试图将HashMap或任何其他Map实现从ajax发送到SpringMVC控制器 以下是我如何做到这一点的细节: Ajax调用如下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
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
如何用jquerypost
序列化?它看起来像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"));
}