2013-01-01 58 views
2

我有一個像Spring MVC的3 REST PUT和POST進行更新和保存

@RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT }) 
    public String update(@ModelAttribute Account account) { 
this.getAccountDao().save(account); 
return "redirect:/users/account/"; 
} 

在我的AccountController的方法我使用org.springframework.web.filter.HiddenHttpMethodFilter所以我的觀點有一個隱藏的表單字段作爲 -

<form:form method="POST" modelAttribute="account"> 
     <input type="hidden" name="_method" value="PUT" /> 
.... 

現在的問題是如何控制器知道何時創建一個新帳戶或更新,或它如何知道如果請求是POST或PUT?對我來說,它總是看起來像是PUT。

我只是不喜歡使用除GET和POST之外的任何東西。控制器無需關心是否需要創建新的或更新它。如果表單具有隱藏的帳戶ID字段,則該服務可以確定要調用的DAO方法。

編輯 如果這只是一個PUT請求,那麼我需要爲POST創建一個新的jsp。不幸的是,兩個請求都非常相似,因爲他們需要幾乎準確的數據才能提交,除了帳號ID。我希望能夠從控制器和相同的jsp使用同一個方法來執行POST和PUT,並根據模型 - 帳戶被保存或更新。

回答

3

控制器不知道您是否創建或更新實體,它只知道該方法反應的RequestMethod

您指定的隱藏字段和您正在使用的HiddenHttpMethodFilter導致PUT是HTTP方法,對控制器可見,因爲過濾器會更改請求中的方法。 (根據javadocs)。

在結果,瀏覽器使用POST將其數據發送到服務器,那麼Filter運行並且改變方法在請求中PUT,所以該Filter它看起來像該請求已用PUT發送後面的應用。

我沒有看到是非常相似的代碼有問題,只是因子類似behavoir到另一個方法..如:

@RequestMapping(method = { RequestMethod.POST}) 
public String update(@ModelAttribute Account account) { 
    // do POST specific things.. 

     // and common operations 
     commonOperation(); 
} 

@RequestMapping(method = { RequestMethod.PUT }) 
public String updateWithPut(@ModelAttribute Account account) { 
     // do PUT specific things... 

     // and common operations 
     commonOperation(); 
} 

// code that put and post methods have in common 
private void commonOperation() { 
// a lot of common code 
// that needs to be done 
} 
+0

如果這是永遠不會成爲一個POST請求控制器不需要「POST」動詞,因爲它不會是一個。這將回答問題的第一部分。現在我需要能夠同時擁有POST和PUT。我怎麼用HiddenHttpMethodFilter來做到這一點。我無法創建單獨的頁面。 – Mukus

+0

隱藏字段指定哪個HTTP方法對應用程序可見。這是一種按表單標籤的特定配置,因此您可以根據您的需要和隱藏字段,使用POST發送一個表單,使用PUT發送另一個表單。 – burna

+0

嗯..我會等待更多的答案。我認爲我正在以正確的方式去做,但不瞭解我的謎題缺失的一塊。 – Mukus