Tôi đang cố gắng sử dụng RequestMethod.PUT
và RequestMethod.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.
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
Xin lỗi, tôi đã đọc sai bài đăng của bạn ... xấu của tôi. – Guillaume
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