十、WEB项目开发之Form表单、Ajax请求与SpringMVC的RestFul风格的兼容处理

本文介绍如何在SpringMVC中实现RestFul风格的GET/POST/PUT/DELETE请求方法,包括表单和Ajax中的处理技巧,以及解决文件上传时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)问题1
  对于Form表单和Ajax请求而言,它的提交方式只有两种“GET”和“POST”,这显然无法满足RestFul的“GET/POST/PUT/DELETE”四种风格,怎么办?
(二)解决办法
1.表单或Ajax中的处理
  在表单中埋一个“hidden”,它的“name”属性必须为“_method”,“value”属性为“PUT/DELETE”,这样SpringMVC会自动将该“hidden”控件的“value”解析为请求的方法。
  在Ajax中,请求方法type=”POST”,请求参数必须附加一个参数”_method” : “PUT”,如下所示:

common.ajax1({
        url : $("#basePath").val() + "/users/"+ $("#userId") +"/password",
        type : "POST",
        data : {
            "_method" : "PUT",
            "oldPassword" : $("#oldPassword").val(),
        },
        success : function (response) {

        }
    });

  备注:记住是“name = _method”,同时我们还需要设置“id”,用来在JS中根据情况改变请求方法!!!

操作类型RestFul请求方法表单SpringMVC
查询GETmethod = GETRequestMethod.GET
新增POSTmethod = POSTRequestMethod.POST
修改PUTmethod = POST _method = PUTRequestMethod.PUT
删除DELETEmethod = POST _method = DELETERequestMethod.DELETE

2.SpringMVC中的处理
  在web.xml中注册过滤器

<!-- 处理表单的RestFul提交方式 -->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

(三)问题2
  从上面可知,当我们配置了“HiddenHttpMethodFilter”,同时埋一个<input type="hidden" name="_method" value="PUT"/>,就可以实现从表单中获取该“hidden”的“value”(HttpServletRequest.getParameter("_method")),解析出符合RestFul风格的请求方法。
  但是这种办法只适用于表单的enctype = application/x-www-form-urlencoded 这种提交方式,而当我们涉及到上传文件时,表单的enctype = multipart/form-data 变成这样,我们的“HiddenHttpMethodFilter”将无法通过httpServletRequest.getParameter("_method") 获取到任何值。因为对于这种表单提交方式,必须通过HttpServletRequest.getInputStream() 进行转换之后,再通过httpServletRequest.getParameter("_method")才能解析出参数,怎么办?
(四)解决办法
1.配置“MultipartFilter”过滤器
  根据上面可知,我们需要在执行“HiddenHttpMethodFilter”过滤器之前就先将参数进行解析,同时我们知道Filter过滤器执行的顺序是我们在“web.xml”中的配置顺序,所以我们需要在“HiddenHttpMethodFilter”过滤器之前配置一个SpringMVC提供的另外一个过滤器“MultipartFilter”。

<filter>
        <filter-name>multipartFilter</filter-name>
        <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
        <init-param>
            <param-name>multipartResolverBeanName</param-name>
            <!-- 这是在applicationContext-web.xml中配置的文件上传解析器的id -->
            <param-value>multipartResolver</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>multipartFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.配置Spring监听器

<context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- spring监听器加载的配置文件 -->
        <param-value>classpath:spring/root-context.xml</param-value>
    </context-param>
    <listener>
        <!--ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息-->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

3.将applicationContext-web.xml中配置的文件上传解析器放到spring监听器的配置文件root-context.xml中
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值