6
回答
spring mvc接收put请求的数据失败。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

controller代码节选:

@RequestMapping(value = "/update/{id}", method = RequestMethod.PUT)
	public String update(HttpServletRequest request,
			HttpServletResponse response, ModelMap modelMap, Equipment equipment) {
		System.out.println(request.getParameter("name"));
		System.out.println(equipment.getIp());
		this.getEquipmentService().update(equipment);
		return "redirect:/equipment/list/json";
	}

前端jQuery的ajax请求代码:

function putTest(){
		$.ajax('<%=request.getContextPath()%>/equipment/update/82f1c375-38d0-4c4b-bc15-e81e98fc4506',{type:'post',data:{_method:'put',id:'82f1c375-38d0-4c4b-bc15-e81e98fc4506',name:'设备1',ip:'127.0.0.1',port:'8887',updateTime:'2011-10-09 11:11:56'}});
	}

web.xml添加了HiddenHttpMethodFilter:

<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>DispatcherServlet</servlet-name>
  </filter-mapping>

按上面的配置,在前端点击按钮执行putTest方法后,后台的

System.out.println(request.getParameter("name"));
System.out.println(equipment.getIp());

正常输出数据。

但是把前端的的post方法改成put,后台的数据都接收不了了,输出为null。

$.ajax('<%=request.getContextPath()%>/equipment/update/82f1c375-38d0-4c4b-bc15-e81e98fc4506',{type:'put',data:{_method:'put',id:'82f1c375-38d0-4c4b-bc15-e81e98fc4506',name:'设备1',ip:'127.0.0.1',port:'8887',updateTime:'2011-10-09 11:11:56'}});

在firebug上也没查到有出错的信息。

请问有人做过相同的例子吗?有没有遇过类似问题。put和post方法的区别是什么,数据的发送方式一样的吗?我拿着http的RFC中文文档看得有点不太明白。求解答。

 

 

 

 

举报
肥昊
发帖于6年前 6回/3K+阅
共有6个答案 最后回答: 5年前

从Ajax的运行机制上找找原因吧。Server端既然能只支持Post,那么支持Put也没什么特别之处。

非POST/GET的Method 据说有些浏览器的javascript支持得不是很好,试着找找有没有类似的问题。

--- 共有 1 条评论 ---
肥昊请问我该如何来查找或者测试浏览器的js支持呢?我现在用chrome和firefox都是能提交post,但是不能put。 6年前 回复

<form method="POST">这里不要变动。

在form内部加上一hidden域

<input type="hidden" name="_method" value="put" />就可以了。

浏览器本身只支持get和post方法,使用_method来告知spring这是一个put请求。

建议你使用spring的taglib,写form会方便很多,还可以绑定model。

好吧,我没看全,总之你type="post"能够发送put请求是正确的,就像我刚才说的,浏览器本身只支持get和post方法,使用_method来告知spring这是一个put请求。所以type是不能变动的,否则浏览器不支持。

从语义上来说,post通常代表新增,put通常代表修改。

--- 共有 1 条评论 ---
肥昊是所有浏览器都不支持put?还是只是<form>标签不支持put呢?如果浏览器ajax不支持put,那为什么我后台会有响应输出null,只没接收到数据呢?我现在就是要执行语义的修改,所以才用put的。 6年前 回复

在 jQuery 中这样发送 Ajax 请求:

$.ajax({
    url: '/xxx/' + id + '/update',
    type: 'POST',
    data: {
        _method: 'PUT'
    },
    dataType: 'HTML',
    success: function(data) {
        ...
    }
});

在 Spring Controller 这样接收请求:

@RequestMapping(value = "/xxx/{id}/update", method = RequestMethod.PUT)
public String update(HttpServletRequest request, @PathVariable("id") Long xxxId) {
    ...
}

在 web.xml 中一定要配置:

<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>spring</servlet-name>
</filter-mapping>

试试看吧,祝你成功!

引用来自“黄勇”的答案

在 jQuery 中这样发送 Ajax 请求:

$.ajax({
    url: '/xxx/' + id + '/update',
    type: 'POST',
    data: {
        _method: 'PUT'
    },
    dataType: 'HTML',
    success: function(data) {
        ...
    }
});

在 Spring Controller 这样接收请求:

@RequestMapping(value = "/xxx/{id}/update", method = RequestMethod.PUT)
public String update(HttpServletRequest request, @PathVariable("id") Long xxxId) {
    ...
}

在 web.xml 中一定要配置:

<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>spring</servlet-name>
</filter-mapping>

试试看吧,祝你成功!

这个确实可以,但是前端需要改动
顶部