SpringMVC实现PUT请求上传文件
2017-02-08 14:24
253 查看
在JQuery中,我们可以进行REST ful中delete和put的请求,但是在java EE标准中,默认只有在POST请求的时候,servlet 才会通过getparameter()方法取得请求体中的相应的请求参数的数据。而PUT,delete请求的请求体中数据则默认不会被解析。
关于delete请求:delete请求用来从服务器上删除资源。因此我们只需要把要删除的资源的ID上传给服务器,即使是批量删除的时候,也可以通过URL传参的方式将多个id传给servlet,因此,可以满足我们的需求,可以直接发送请求。
关于put请求(指的是带有请求体)
没有文件时:SpringMVC提供了一个将post转换为put和delete的方法,通过在web.xml中注册一个HiddenHttpMethodFilter过滤器。
上传文件时:我们可以通过在web.xml中注册一个MultipartFilter,一定要在HiddenHttpMethodFilter之前。
然后我们看源码:
this.methodParam属性被默认初始化为"
然后它把request进行包装后传给下一个filter。
因此,我们需要在提交的时候添加一个字段
或者在
然后我们就可以在后台
和MultipartFilter源码中这样的注释
也就是说我们可以通过在web.xml中注册一个MultipartFilter,一定要在HiddenHttpMethodFilter之前。
然后再在Spring的 root application context中添加如下代码
FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。
最后,就可以实现将文件上传提交给put方法。
关于delete请求:delete请求用来从服务器上删除资源。因此我们只需要把要删除的资源的ID上传给服务器,即使是批量删除的时候,也可以通过URL传参的方式将多个id传给servlet,因此,可以满足我们的需求,可以直接发送请求。
关于put请求(指的是带有请求体)
没有文件时:SpringMVC提供了一个将post转换为put和delete的方法,通过在web.xml中注册一个HiddenHttpMethodFilter过滤器。
上传文件时:我们可以通过在web.xml中注册一个MultipartFilter,一定要在HiddenHttpMethodFilter之前。
SpringMVC实现PUT,DELETE请求
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-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> </filter-mapping>
然后我们看源码:
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String paramValue = request.getParameter(this.methodParam); if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method); filterChain.doFilter(wrapper, response); } else { filterChain.doFilter(request, response); } }
this.methodParam属性被默认初始化为"
_method",通过
request.getParameter(this.methodParam);判断是put还是delete,
"POST".equals(request.getMethod()),而且必须要求是post方式提交的,
然后它把request进行包装后传给下一个filter。
因此,我们需要在提交的时候添加一个字段
<form action="" id="formData" name="formData" method="post"> <input type="text" name="username" id="username"/> <input type="hidden" name="_method" value="delete"/> <input type="submit" value="submit"/> </form>
或者在
$.ajax中
function login() { $.ajax({ type: "post",//请求方式 url: "", //发送请求地址 timeout: 30000,//超时时间:30秒 data: { "username": $('#username').val(), "password": $("#password").val(), "_method": delete }, dataType: "json",//设置返回数据的格式 success: function (data) { console.log(data); }, error: function () { //请求出错的处理 } }); }
然后我们就可以在后台
@RequestMapping(value = "", method = RequestMethod.PUT)注解中标识我们的方法,最后就可以成功地获得数据。
SpringMVC实现PUT请求上传文件
可是后来我又有遇到另外一个需求那就是修改的时候需要传送文件到put方法中,于是这种方法就不可行了,但是我在HiddenHttpMethodFilter源码中看到这样一句话
* <p><b>NOTE: This filter needs to run after multipart processing in case of a multipart * POST request, due to its inherent need for checking a POST body parameter.</b> * So typically, put a Spring {@link org.springframework.web.multipart.support.MultipartFilter} * <i>before</i> this HiddenHttpMethodFilter in your {@code web.xml} filter chain.
和MultipartFilter源码中这样的注释
/** * Set the bean name of the MultipartResolver to fetch from Spring's * root application context. Default is "filterMultipartResolver". */
也就是说我们可以通过在web.xml中注册一个MultipartFilter,一定要在HiddenHttpMethodFilter之前。
<filter> <filter-name>MultipartFilter</filter-name> <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> </filter> <filter-mapping> <filter-name>MultipartFilter</filter-name> <servlet-name>dispatcher</servlet-name> </filter-mapping> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter>
然后再在Spring的 root application context中添加如下代码
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="209715200"/> <property name="defaultEncoding" value="UTF-8"/> <property name="resolveLazily" value="true"/> </bean>
FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。
function test() { var form = new FormData(document.getElementById("tf")); form.append("_method", 'put'); $.ajax({ url: url, type: 'post', data: form, processData: false, contentType: false, success: function (data) { window.clearInterval(timer); console.log("over.."); }, error: function (e) { alert("错误!!"); window.clearInterval(timer); } }); get();//此处为上传文件的进度条 }
<form id="tf" method="post" name="formDada" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="text" name="id"/> <input type="text" name="name"/> <input type="button" value="提" onclick="test()"/> </form>
最后,就可以实现将文件上传提交给put方法。
相关文章推荐
- servlet、struts2、springmvc中实现带进度条的文件上传
- springMVC 注解方式实现全程+文件上传
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传
- springMVC两种方式实现多文件上传及效率比较
- 通过终端命令行进行WebDav服务器配置,实现使用PUT进行文件上传【图文详解】
- 利用O’Reilly公司的cos实现文件上传前获取请求参数
- springMVC 注解方式实现全程+文件上传
- springMVC两种方式实现多文件上传及效率比较
- SpringMVC实现文件上传进度条
- springMVC两种方式实现多文件上传及效率比较
- C#实现http协议支持上传下载文件的GET、POST请求
- SpringMVC配置,简单实例,文件上传与下载,ajax请求
- springMVC实现上传文件功能
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传
- JQuery与springmvc实现多个文件上传操作
- 基于SpringMVC文件上传服务器端进度条实现
- servlet、struts2、springmvc中实现带进度条的文件上传
- HTML5+Springmvc实现拖拽文件上传
- SpringMVC实现jQueryAjax文件上传(简单的例子)
- SpringMVC结合ajaxfileupload.js实现文件无刷新上传