这个问题是对Returning ModelAndView in ajax spring mvc
的跟进唯一的答案是我们需要从Controller而不是ModelAndView返回json。所以问题是
更新1: 如上所述,我尝试了一些例子。这是我的代码。
@Controller
public class AppController
{
@RequestMapping(value="/greeting",method=RequestMethod.POST)
@ResponseBody
public ModelAndView getGreeting(@RequestBody String json) throws IOException
{
JSONObject inputjsonObject = new JSONObject(json);
String name = inputjsonObject.getString("name");
ModelAndView modelAndView = new ModelAndView();
String result = "Hi "+name;
modelAndView.addObject("testdata", result);
modelAndView.addObject("user", getPrincipal());
modelAndView.setViewName("greetingHtmlPage");
return modelAndView;
}
// other stuff
}
在上面的控制器方法中,我可以获得成功的数据。此方法是从 home.html 上的javascript调用的。以下是javascript函数
function callGreeting(){
var nameData={
name : document.getElementById("name").value
}
var dataInJson = JSON.stringify(nameData);
var csrf_token = document.getElementById("token").value;
$.ajax({
type: 'POST',
url: "greeting",
data: dataInJson,
cache:false,
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', csrf_token);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
},
success: function (response) {
document.open();
document.write(response);
document.close();
},
error: function (data) {
alert("failed response");
}
}); }
我已成功渲染页面。但是,即使加载了新页面,应用程序的URL也不会从AjaxSpringMVC:8080 / home更改为AjaxSpringMVC:8080 / greeting。如果在没有Ajax的情况下使用,这将在Spring MVC中自行发生。
答案 0 :(得分:0)
返回ModelAndView可以做些什么?
您可以像往常一样返回ModelAndView:
public ModelAndView returnView( Model model ) {
model.addAttribute( "myStaff", "my staff as string" );
return new ModelAndView( "myView" );
}
如何呈现页面:
你可以控制它的渲染方式。
当您返回ModelAndView
时,响应会显示一个HTML页面。
在Ajax调用之后,您可以执行$("#container").html(response)
或类似的操作以在任何位置显示HTML页面。
换句话说,您从控制器获得整个html页面的内容。
但是,我强烈建议您只返回json对象并使用json对象更新视图。 Ajax主要用于通过异步更新部分视图来创建良好的用户体验,因此使用Ajax获取整个页面对我来说没有意义。
如何在Controller中读取ajax的发布数据。
有很多方法,我喜欢将json体直接发送到控制器
@ResponseBody
@RequestMapping(value = "/saveObj", method = RequestMethod.POST, consumes = "application/json")
public String saveObj(Model model, @RequestBody MyObj myObj) {
// do staff..
}