SpringMVC控制器接收不了PUT提交的参数的解决方案

摘要: SpringMVC控制器接收不了PUT提交的参数的解决方案

这次改造了下框架,把控制器的API全部REST化,不做不知道,SpringMVC的REST有各种坑让你去跳,顺利绕过它们花了我不少时间,这次来提下SpringMVC的PUT提交参数为null的情况。

照常先贴出我的控制器代码,没什么特别的,就是打印出接受到的前台参数值:

 

@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
	@ResponseBody
	public Map<String, Object> update(
			@RequestParam(value = "isform", required = false) String isform,
			@PathVariable("id") String id) {
		System.out.println("id value: " + id);
		System.out.println("isform value: " + isform);

		return null;

	}

很常规的PUT控制器,用来修改原有的记录,原有的的web.xml中,我只添加了一个和REST涉及的过滤器

 

org.springframework.web.filter.HiddenHttpMethodFilter

 

<filter>
		<filter-name>HttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

这个因为大多数人都知道它的作用,这里再啰嗦提一下:

 

        浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转 换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter,只需要在表单中添加一个隐藏字段"_method"

 

<form action="..." method="post">
            <input type="hidden" name="_method" value="put" />
            ......
    </form>

下边我们来看下,运行的结果,我会在我的前台发起一个PUT请求作为案例,

 

我们来看下后台的参数打印情况:

id参数顺利的获取到了,因为它其实是由@PathVariable获取的,这个没有什么问题,但是http body中提交的参数值isform却为null,查询了一番,原因是:

如果是使用的是PUT方式,SpringMVC默认将不会辨认到请求体中的参数,或者也有人说是Spirng MVC默认不支持 PUT请求带参数,

解决方案也很简单,就是在web.xml中把原来的过滤器改一下,换成org.springframework.web.filter.HttpPutFormContentFilter

<filter>
		<filter-name>HttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在更改之后我们继续一下刚才的案例,发送一个PUT请求,参数基本都不变

看下后台打印的结果:

ok,现在已经可以成功的获取并打印出前台的参数。

 

https://my.oschina.net/buwei/blog/191942

时间: 2024-11-01 22:08:47

SpringMVC控制器接收不了PUT提交的参数的解决方案的相关文章

解决angular的post请求后SpringMVC后台接收不到参数值问题的方法_AngularJS

这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值: @RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) String isform) { System.out.println("isform value

springmvc怎么接收json对象 springmvc接收json对象的方式

springmvc接收json对象的方式介绍: 1.以实体类方式接收 前端 ajax 提交数据: function fAddObj() { var obj = {}; obj['objname'] = "obj"; obj['pid'] = 1 ; $.ajax({ url: 'admin/Obj/addObj.do', method: 'post', contentType: 'application/json', // 这句不加出现415错误:Unsupported Media T

springmvc控制器类方法

问题描述 springmvc控制器类方法 在springmvc中,在前台页面调用控制器类的方法后,不改变当前视图? 解决方案 用ajax去调用,不刷新页面,自然也不改变视图.http://blog.csdn.net/zhujianli1314/article/details/43193183 解决方案二: SpringMVC入门之注解式控制器

springmvc @requestbody 接收json字符串的原理

问题描述 springmvc @requestbody 接收json字符串的原理 问题如上.贴出代码 @RequestMapping(value = "/sk/api/users", method = RequestMethod.POST) public void entitys(@RequestBody List users, HttpServletRequest request, HttpServletResponse response) { System.out.println(

非一般的乱码,url通过get方式提交带参数乱码

问题描述 web项目,参数以get方式提交,发现汉字乱码:环境:tomcat字符集utf8,spring设置字符集utf8,在浏览器里直接输入测试url参数:?BRANCH_NAME=陕西省的时候,ie浏览器传递给后台的代码是乱码的,ff,chrome正常但是有些时候,url参数会是下面这个样子的,BRANCH_NAME=%E9%99%95%E8%A5%BF%E7%9C%81这个时候后台均正确了,问题:怎样保证系统url为?BRANCH_NAME=陕西省的时候,后台获取不乱码多谢 解决方案 解决

springmvc取不到表单传递的参数?怎么回事呢?

问题描述 springmvc取不到表单传递的参数?怎么回事呢? 前台向后台提交数据的时候,属性参数取到的全部是null. 通过request和userCustom取的都是null值. 为什么取不到值呢? html中代码如下: controller中的代码如下: @RequestMapping("/editUser") public String editUser(HttpServletRequest request,Integer id,UserCustom userCustom)th

mvc4.0 提交的参数验证问题怎么做验证

问题描述 1.所有的请求不管GET.POST提交我需要进行类似过滤器进行验证但是那样太麻烦了我需要写一个全局不需要在每个action上加怕有时候忘记2.另外一个问题,想一个全局的地方统一进行表单提交的值或者URL参数进行统一解密,到action的时候参数是自动解密好的.因为所有的参数都是客户端加密好的 解决方案 本帖最后由 liaoqun3 于 2016-01-07 14:47:10 编辑解决方案二:如果你不希望使用ActionFilterAttribute来限制和过滤的话.那么你可以尝试创建一

web service 服务端如何跟据客户端提交的参数,连接不同的数据库

问题描述 webservice服务端如何跟据客户端提交的参数,连接不同的数据库如:客户端A传了一个值a_sql给webservice服务,服务端跟据传入的参数连接数据库a_sql客户端B传了一个值B_sql给webservice服务,服务端跟据传入的参数连接数据库b_sql 解决方案 解决方案二:这类问题无法真的好好回答啊.你想想看.解决方案三:服务端要干什么,依赖的是输入输出协议.不纠结什么"客户端A.客户端B".在一个客户端要访问服务器之前,它通常会"注册",来

file-PHP接收手机上的图片和参数

问题描述 PHP接收手机上的图片和参数 function uploadPhoto() { var options = new FileUploadOptions(); var test=document.getElementById("bxadmin").value; var test1=document.getElementById("bxname").value; var test2=document.getElementById("bxPH"