2011-10-26 51 views
6

我想通過刪除鏈接(a href)或刪除按鈕(窗體)刪除頁面上的實體。我使用的刪除按鈕由於鏈接要求一個「GET」,而不是「POST」編程Spring MVC控制器和jsp的HttpDelete

這是JSP代碼打算做的是:

<td><form:form method="DELETE" action="/client/invoices/${invoice.id}"><input type="submit" value="delete"></form:form></td> 

生成的HTML是這樣的:

<td><form id="command" action="/client/invoices/9" method="post"><input type="hidden" name="_method" value="DELETE"/><input type="submit" value="delete"></form></td> 

所以,我很開心。它有_method表示它是一個DELETE動作。這是我的控制器代碼:

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 
public String delete(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, Model uiModel) { 
     invoiceServiceHibernate.removeInvoice(id); 
     return "redirect:/invoices"; 
} 

因此,會發生什麼情況是此方法未被調用。我有另一種方法,它通過POST創建發票並單擊刪除按鈕,而不是創建發票。我的猜測是,控制器將servlet視爲POST請求,並使用第一個處理POST請求的方法,在這種情況下,它將創建新的發票。

我試圖讓這個「RESTful」,所以我想這是/invoice/id和使用POST, PUT, DELETE, GET,但我不知道如何在控制器中使用Spring MVC編碼。

我能得到這個通過附加「動詞」,如/invoices/id/delete和設置控制器

@RequestMapping(value = "/{id}/delete", method = RequestMethod.POST) 

注意,RequestMethod.POST但由於地圖值顯式地/id/delete,但它確實工作不使用映射到/invoices/invoices/id的默認POST。

我希望我很清楚。如果任何人有任何建議或示例代碼(強烈偏好),我將不勝感激。我讀過這些所謂鏈接,引用: Link1 Link2 Link3

+0

現在面臨同樣的問題。我已經添加了過濾器,但是將刪除方法轉換爲POST。你能幫助 – shalu

回答

7

你設置在web.xml中HiddenHttpMethodFilter?該過濾器將張貼的方法參數轉換爲HTTP方法,並支持Spring MVC表單標記中的方法轉換。

<filter> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <servlet-name>servletName</servlet-name> 
</filter-mapping> 
+0

我面臨同樣的問題。我已經添加了過濾器,但是將刪除方法轉換爲POST。你能幫忙嗎? – shalu

2

這是Java配置等價(需要Servlet API的3.0+)

servletContext 
     .addFilter("HiddenHttpMethodFilter", HiddenHttpMethodFilter.class) 
     .addMappingForUrlPatterns(null, false, "<your desired mapping here>");