当我进行ajax呼叫时,网址会发生变化

时间:2013-11-11 18:20:07

标签: jsp spring-mvc

我的网址有问题。 在系统中,我显示一些用户信息,url是:showUserInfo。 我可以单击一个按钮,它会显示一个对话框并允许创建一个新用户。 我做了一个ajax调用:createUser。

我的问题是,当我执行此调用时,url对话框中的url更改,如果我刷新页面,则会出现一些问题,因为我们有createUser url但是有showUserInfo。

@RequestMapping(method = RequestMethod.GET, value = "/showUserInfo")
public String userView(Model model, Locale locale) {
    model.addAttribute("userList", userBeanMap);

    model.addAttribute("userBeanForm", new UserBeanForm());

    return userView;
}


@RequestMapping(method = RequestMethod.POST, value = "/createUser")
public String createUser(Model model, @ModelAttribute UserBeanForm userBeanForm, BindingResult result) {
  ...
  ...
}


$('#createUser').dialog({
    autoOpen: false,
    height: 660,
    width: 715,
    modal: true,
    buttons: {
        Save: function() {
                $('#addUserForm').submit();
            }
        },
        Cancel: function() {
            $('#addUserForm').trigger("reset");
            $(this).dialog("close");
        }
    },
    close: function() {
        $('#addUserForm').trigger("reset");
    }
 });

 <form:form id="#addUserForm" action="${addUserUrl}" modelAttribute="userBeanForm">
  ...
 </form>

有没有办法避免这种行为?

1 个答案:

答案 0 :(得分:0)

我不完全确定你在问什么,所以澄清会有所帮助。特别是,当你说: “如果我刷新页面,会出现一些问题,因为我们有createUser url但是有showUserInfo。”

你看到的问题是什么?我打算你想避免双重发布,所以使用PRG模式可以解决你的问题: http://en.wikipedia.org/wiki/Post/Redirect/Get

但是,如果你正在进行AJAX调用,情况应该不是这样。如果你想在提交后避免刷新,你可以代替调用表单的提交,做这样的事情吗?

Save: function() {
           $.ajax({
               type: "POST",
               url: "/createUser",
               data: $("#addUserForm").serialize(),
               success: function(data)
               {
                   // javascript to update page
               }
            });
        }
    },

有关JQuery ajax的更多信息:http://api.jquery.com/jQuery.ajax/ 如果帖子应该更新,你可以在服务器端返回一个json,并让javascript成功函数解析它并相应地更新页面。

如果您确实想要进行刷新,那么: “/ createUser”url是否返回了与get不同的内容?如果没有,您可以更改帖子处理程序以返回重定向到GET页面:

@RequestMapping(method = RequestMethod.POST, value = "/createUser")
public String createUser(Model model, @ModelAttribute UserBeanForm userBeanForm, BindingResult result) {
    ...
    ...
    return "redirect:/showUserInfo"
}

如果您想存储帖子创建的一些数据并使用Spring 3.1,请查看flash属性: http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes

您可以更改您的帖子处理程序,并调整您的获取处理程序以某种方式使用该数据或将其传递给视图:

@RequestMapping(method = RequestMethod.POST, value = "/createUser")
public String createUser(Model model, @ModelAttribute UserBeanForm userBeanForm, BindingResult result, RedirectAttributes redirectAttributes) {
    ...
    ...
    // add data for get handler to use
    redirectAttributes.addFlashAttribute("someString", "stringValue");
    redirectAttributes.addFlashAttribute("someInt", 10);

    return "redirect:/showUserInfo"
}

我没有机会对此进行实际测试,但希望它有效。