我在控制器中有一个方法,它将根据要求返回HTML或JSON.这是一个这样一个方法的简化示例,模仿我在this question中找到的有关如何执行此操作的信息:
@RequestMapping(value="callback")
public ModelAndView callback(@RequestParam("c") String c) {
Map response = new HashMap<String, String>();
response.put("foo", "bar");
return new ModelAndView("fake", "data", new JSONPObject(c, response));
}
我将JSONPObject放入模型中,因为我必须能够从呈现是否请求HTML的视图中访问它.但是当我使用回调渲染JSON时,这会产生一个问题:
curl 'http://localhost:8080/notes/callback.json?c=call'
{"data"call(:{"foo":"bar"})}
正如您所看到的,因为我将数据放在模型的“数据”插槽中,当模型呈现为JSON时,会有额外的包装.我正在寻找的是渲染的JSON(技术上是JSONP)看起来像这样:
call({"data":{"foo":"bar"}})
任何人都可以看到一种方法来获得我想要去的地方而不会破坏在渲染过程中返回访问JSONPObject的视图的能力吗?
解决方法:
这就是我在Spring MVC中使用JSONP的方法,只需根据您的需要进行修改:
在服务器端:
@RequestMapping(value="/notes/callback.json", method=RequestMethod.GET)
public void jsonpCallback(@RequestParam("callback") String callback, HttpServletResponse response) {
response.setContentType("text/javascript; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(callback + "(" + jsonDataString + ")");
}
在客户端:
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script type="text/javascript">
function yourfunction() {
jQuery.getJSON("http://localhost:8080/notes/callback.json?callback=?",
function(data) {
alert(data.someParam);
});
}
</script>