2012-05-12 221 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的利用也起到了很大作用。

再次感謝!