2012-05-12 102 views
1

我想我比任何特定的编码解决方案更多的建议。这里的情景:REST,Spring MVC 3和PUT请求与AJAX

  • 我在那里一个新的用户可以创建
  • 这种形式是通过一个Spring控制器

    @RequestMapping(value = "/secure/clients", method = RequestMethod.GET) 
    public String prepareNewClient(final Principal principal, final ModelMap map) { 
        map.addAttribute("client", new Client()); 
        return "secure/clients"; 
    } 
    
  • 形式提出通过GET请求访问的形式,所有工作正常,我提交新客户使用$.ajax({})

  • 提交会触发一个POST请求使用相同的URL在我的控制台上的以下方法[R

    @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了。

我甚至试图将保存的客户端添加到我的POST方法的ModelMap,但即使这样也行不通。

我不完全确定我是否以正确的方式做。说实话,我见过的每个教程都或多或少地使用了我在做的事情,但NONE其中有一个PUT请求 - 主要是处理对象的创建,我没有问题。

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

但我不确定这是否合理,所以我有点失落。

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

建议是非常感激。谢谢!

回答

2

HttpMethod并未得到Web浏览器的支持。 PUT requesr在两个应用程序与Restfull API一起工作时效果很好,但对于浏览器兼容性,最好将自己限制为POST或GET请求。

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

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

Spring sf命名空间负责为您隐藏该字段。

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

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

1

我同意@Daniel。

但您可以使用HiddenHttpMethodFilter在Spring中可用。这应该让你的工作变得简单。您将不再需要每次都放置隐藏的文件。

希望有帮助。干杯。

+0

我认为你仍然需要那个隐藏的领域。 – Mukus

+0

不,不需要每次都放置额外的隐藏字段。 Spring本身就是这样。 –

0

@丹尼尔和@日本非常感谢你的回答。

我想你说的是什么@丹尼尔和我最终走出了包厢,思考方式不一样 - 而且效果很好。

只给你一个想法:

  • 而不是停留在页面上,当一个新的客户端插入我居然刷新浏览器
  • 在函数被调用用户被重定向到/安全后/客户/ {}的clientId
  • 从那里上了一个新的功能映射,一个新的POST请求

它为我一起。 Knockout.JS的利用也起到了很大作用。

再次感谢!