Tin*_*iny 22 spring spring-mvc http-post http-put http-delete
我试图使用RequestMethod.PUT和RequestMethod.DELETESpring MVC中控制器(3.0.2版).在Spring控制器类中有三个映射方法的方法如下(分别为PUT,GET和POST,仅用于演示目的).
@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";
}
Run Code Online (Sandbox Code Playgroud)
加载页面时,GET显式调用该方法,但在所有其他情况下(提交页面时),唯一要调用POST的方法RequestMethod.PUT是,从不调用指定的方法.
Spring表单只包含一个提交按钮和一个图像浏览器,
<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>
Run Code Online (Sandbox Code Playgroud)
生成的HTML如下,
<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>
Run Code Online (Sandbox Code Playgroud)
在我spring-config.xml(dispatcher-servlet.xml在我的情况下),我添加了一个引用CommonsMultipartResolver:
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
Run Code Online (Sandbox Code Playgroud)
在我的web.xml文件中,HiddenHttpMethodFilter配置如下,
<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>
Run Code Online (Sandbox Code Playgroud)
的PUT(和DELETE太)方法永远不会调用(没有异常或错误).我在这里错过了什么?
更新:
通过以下配置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>
Run Code Online (Sandbox Code Playgroud)
它抛出以下异常.
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'filterMultipartResolver'的bean
其中名称dispatcher是Servlet的名称 - org.springframework.web.servlet.DispatcherServlet已在web.xml中映射,如下所示.
<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>
Run Code Online (Sandbox Code Playgroud)
我不确定还需要什么?在过滤器HiddenHttpMethodFilter需要我们自己的扩展来实现OncePerRequestFilter类似所示的位置?(这是一个内置的类)
Gui*_*ume 16
大多数浏览器不支持action=PUTHTML表单.他们只会发送POST请求.该HiddenHttpMethodFilter会帮助你解决问题,但你必须有一个隐藏字段_method=PUT在您的形式.如果您使用spring:form taglib,这将自动为您完成,但您的示例似乎使用纯HTML.
这NoSuchBeanDefinitionException很可能是一个无关的问题.
| 归档时间: |
|
| 查看次数: |
36114 次 |
| 最近记录: |