【问题标题】:Ajax POST call to Spring MVC对 Spring MVC 的 Ajax POST 调用
【发布时间】:2017-06-04 14:48:35
【问题描述】:

这个问题是Returning ModelAndView in ajax spring mvc的后续问题

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

  1. 如何返回 ModelAndView ?
  2. 页面将如何呈现:-
    • 是否必须在ajax调用的成功部分进行处理
    • 或者 Spring Controller 会像在 Spring MVC 中一样返回页面
  3. 如何在 Controller 中读取来自 ajax 的发布数据。

更新 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 中会自行发生。

【问题讨论】:

    标签: ajax spring spring-mvc


    【解决方案1】:

    如何返回 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 的 post 数据。

    方法很多,我喜欢直接把json body发给controller

    @ResponseBody
    @RequestMapping(value = "/saveObj", method = RequestMethod.POST, consumes = "application/json")
    public String saveObj(Model model, @RequestBody MyObj myObj) {
        // do staff..
    }
    

    【讨论】:

    • 更新了问题的详细信息。我按照你的建议尝试了,即渲染整个 html 页面,但 url 没有改变,有什么建议吗?
    • url 不应更改,因为 ajax 代码正在执行请求的页面上运行,并且您没有明确使用 javascript 来重定向。请不要使用 ajax 进行重定向。如果您想进行重定向,请删除 ajax 代码,并在您的控制器中删除 return redirect:/anotherView"
    • 完美。这和我想的一样。不幸的是,我们不能排除 ajax 或 spingmvc。
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多