0

我的网址有问题。在一个系统中,我显示了一些用户信息,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>

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

4

1 回答 1

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 不同的内容?如果没有,您可以更改 post 处理程序以将重定向返回到 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-属性

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

@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"
}

我没有机会实际测试这个,但希望它有效。

于 2013-11-13T08:08:37.130 回答