2012-11-29 24 views
18

Tôi đang cố gắng sử dụng RequestMethod.PUTRequestMethod.DELETE trong bộ điều khiển Spring MVC (phiên bản 3.0.2). Có ba phương thức được ánh xạ với một URL trong lớp trình điều khiển Spring như sau (PUT, GET và POST tương ứng, chỉ cho mục đích trình diễn).Sử dụng các phương pháp PUT và DELETE trong Spring MVC

@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"}) 
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    if (ServletFileUpload.isMultipartContent(request)) { 
     System.out.println("true"); 
    } 

    System.out.println("Request method PUT"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"}) 
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method GET"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"}) 
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method POST"); 
    return "admin_side/Temp"; 
} 

Khi trang web được tải, các phương pháp GET được gọi là hiển nhiên, nhưng trong mọi trường hợp khác (khi trang được đệ trình), phương pháp duy nhất được gọi là POST, phương pháp thiết kế với RequestMethod.PUT là không bao giờ được viện dẫn.


Hình thức mùa xuân chứa chỉ một nút và một trình duyệt hình ảnh như gửi,

<form:form id="mainForm" 
      name="mainForm" 
      method="PUT" 
      action="Temp.htm" 
      enctype="multipart/form-data" 
      commandName="tempBean"> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form:form> 

HTML được tạo như sau,

<form id="mainForm" 
     name="mainForm" 
     action="Temp.htm" 
     method="post" 
     enctype="multipart/form-data"> 

    <input type="hidden" name="_method" value="PUT"/> 
    <!--This hidden field is implicitly included--> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form> 

Trong tôi spring-config.xml (dispatcher-servlet.xml trong trường hợp của tôi), Tôi đã thêm một tham chiếu đến CommonsMultipartResolver:

<bean id="filterMultipartResolver" 
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 

và trong tập tin web.xml tôi, HiddenHttpMethodFilter được cấu hình như sau,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

<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>/*</servlet-name> 
</filter-mapping> 

Các PUT (và DELETE quá) phương pháp không bao giờ được gọi (không có ngoại lệ hoặc lỗi). Tôi đang thiếu gì ở đây?


Cập nhật:

Với cấu hình sau đây trong web.xml,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> <!-- Makes no difference, if excluded. --> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

<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>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

nó ném ngoại lệ sau đây.

org.springframework.beans.factory.NoSuchBeanDefinitionException: Không đậu có tên là 'filterMultipartResolver' được định nghĩa

Trường hợp tên dispatcher là tên của Servlet - org.springframework.web.servlet.DispatcherServlet đã ánh xạ trong web.xml như sau.

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

Tôi không chắc những gì khác là cần thiết? Bộ lọc HiddenHttpMethodFilter có bắt buộc phải triển khai trên riêng của chúng tôi mở rộng OncePerRequestFilter một cái gì đó như được hiển thị here không? (đây là lớp được xây dựng sẵn)

Điểm quan trọng được liệt kê here.

Trả lời

13

Hầu hết các trình duyệt không hỗ trợ action=PUT ở dạng HTML. Thay vào đó, họ sẽ chỉ gửi yêu cầu POST. HiddenHttpMethodFilter sẽ giúp bạn giải quyết vấn đề, nhưng bạn phải bao gồm một trường bị ẩn _method=PUT trong biểu mẫu của bạn.Nếu bạn sử dụng spring: form taglib này sẽ được thực hiện tự động cho bạn, nhưng ví dụ của bạn dường như sử dụng HTML thuần túy.

NoSuchBeanDefinitionException có lẽ là vấn đề không liên quan nhất.

+1

Tôi đang sử dụng mà thẻ thư viện - ' ...' và lĩnh vực ẩn '' được tự động đưa vào ** HTML được tạo ** như được hiển thị trong đoạn mã thứ hai và thứ ba trong câu hỏi. Tôi đã thấy rất nhiều bài viết trên trang này cũng như các hướng dẫn khác. Tôi gần như làm như mô tả của họ mặc dù điều này không làm việc, trong trường hợp của tôi. Tôi không chắc mình đang thiếu gì. Cảm ơn câu trả lời. – Tiny

+0

Xin lỗi, tôi đã đọc sai bài đăng của bạn ... xấu của tôi. – Guillaume

+0

Văn bản của bạn, "* NoSuchBeanDefinitionException có lẽ là một vấn đề không liên quan *" là chính xác. Vấn đề duy nhất là tôi đã định cấu hình sai 'org.springframework.web.multipart.commons.CommonsMultipartResolver' này và được đặt trong tệp xml sai thay vì đặt nó trong' applicationContext.xml'. Do đó, nó đã gây ra ngoại lệ. Nó bây giờ hoạt động và phương thức được chỉ định với 'RequestMethod.PUT' trong bộ điều khiển Spring được gọi. Một vấn đề vẫn còn là 'ServletFileUpload.isMultipartContent (request)' luôn trả về false. Nó chỉ trả về true trên 'POST'. Bạn có biết lý do không? – Tiny

1

Bạn nên thay đổi cấu hình của mình.

<servlet-name>/*</servlet-name> 

để

<servlet-name>[dispatch servlet name]</servlet-name>