1

我想我正在寻找比任何特定编码解决方案更多的建议。这是场景:

  • 我有一个可以创建新用户的表单
  • 通过 Spring 控制器通过 GET 请求访问此表单

    @RequestMapping(value = "/secure/clients", method = RequestMethod.GET)
    public String prepareNewClient(final Principal principal, final ModelMap map) {
        map.addAttribute("client", new Client());
        return "secure/clients";
    }
    
  • 提交了表单,一切正常,我使用$.ajax({})

  • 提交使用与我的控制器上的以下方法相同的 URL 触发 POST 请求

    @RequestMapping(value = "/secure/clients", method = RequestMethod.POST)
    public @ResponseBody JsonResponse saveClient(
        @ModelAttribute("client") final Client client,
        final BindingResult result,
        final Principal principal,
        final ModelMap map) {
    
        // validate input
        // save client
        // prepare JsonResponse object
    
        return jsonResponse;
    }
    

完成后,我想让用户保持在同一个屏幕上,并让表单触发 PUT 而不是 POST。这很好,我可以用 jQuery 实现,但是一旦我再次提交表单,客户端就ModelMap不再存在了。

我什至尝试将保存的客户端添加到ModelMap我的 POST 方法中,但即使这样也没有用。

我不完全确定我是否以正确的方式做这件事。老实说,我看到的每个教程都或多或少地使用了我正在做的事情,但没有一个教程PUT 请求——主要是处理对象的创建,我没有问题。

我想到的是我可能需要一个控制器方法映射到/secure/clients/{clientId}withHTTP.GET和另一个控制器方法映射/secure/clients/{clientId}HTTP.PUT.

但我不确定这是否有意义,所以我有点迷茫。

  • 我应该完全在 JSON 调用上创建我的控制器吗?
  • 在这种情况下,我应该重定向用户并忘记 AJAX 调用吗?

建议不胜感激。谢谢!

4

3 回答 3

2

Web 浏览器不完全支持 HttpMethod。PUT 请求在两个应用程序使用 Restfull API 时效果很好,但为了浏览器兼容性,最好将自己限制为 POST 或 GET 请求。

您还可以在表单中放置一个覆盖参数,以指示 Web 服务器将帖子作为所需的方法来处理。

<input type="hidden" name="_method" value="put"/>会做的工作。

Spring sf 命名空间会为您处理该隐藏字段。

<sf:form method="put">
....
</sf:form>

此外,您可以使用 restclient-ui 测试您的控制器,以查看问题是来自您的 WebServer 还是您的客户端。

于 2012-05-12T07:08:27.243 回答
1

我同意@Daniel。

但是您可以使用Spring 中提供的HiddenHttpMethodFilter。这应该会让你的工作变得轻松。您将不再需要每次都放置隐藏文件。

希望有帮助。干杯。

于 2012-05-12T09:10:43.033 回答
0

@Daniel 和 @Japan 非常感谢您的回答。

我明白了你所说的@Daniel,我最终跳出框框,以不同的方式思考——而且效果很好。

只是给你一个想法:

  • 当插入新客户端时,我实际上刷新了浏览器,而不是停留在页面上
  • 调用函数后,用户被重定向到 /secure/clients/{clientId}
  • 从那里映射一个新函数,以及一个新的 POST 请求

它对我有用。并且利用 Knockout.JS 也有很大帮助。

再次感谢!

于 2012-05-13T07:41:02.277 回答