Ajax POST调用Spring MVC

时间:2017-01-19 19:02:10

标签: ajax spring spring-mvc

这个问题是对Returning ModelAndView in ajax spring mvc

的跟进

唯一的答案是我们需要从Controller而不是ModelAndView返回json。所以问题是

  1. 返回ModelAndView可以做些什么?
  2. 如何呈现页面: -
    • 是否必须在ajax call
    • 的成功部分处理
    • 或者Spring Controller将像在Spring MVC中一样返回页面
  3. 如何在Controller中读取ajax的发布数据。
  4. 更新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中自行发生。

1 个答案:

答案 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..
}