SpringMVC实现REST风格URL的两种方法

时间:2021-09-27 06:43:42


REST风格URL使用GET、POST、PUT、DELETE四种HTTP方法来完成CRUD的操作,但是PUT时存在后台接收不到参数的问题,这个问题有两种解决办法


1、在web.xml中加入一个filter


      <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>


这个filter的作用就是把POST请求转换成PUT或DELETE请求,但是需要我们在发送POST请求时添加一个额外的参数_method,它的值为"PUT"时表示转换成PUT请求,为"DELETE"时表示转换成DELETE请求



2、其实直接发送PUT请求也是可以接收到参数,只不过参数要通过一个Java bean来接收,比如对于UserController中更新用户信息这个方法,如果我们这么写
  
@RequestMapping(value = "users/{userId}", method = RequestMethod.PUT)
@ResponseBody
public void update(@PathVariable String userId, String userName, int age){
    //...
}


是接收不到userName和age的,但是如果我们换种写法就可以收到了


@RequestMapping(value = "users/{userId}", method = RequestMethod.PUT)
@ResponseBody
public void update(@PathVariable String userId, @RequestBody User user){
//...
}
public class User{
private String userId;
private String userName;
private int age;
//getter and setters
//...
}

但是有时候更新的数据我们没有一个合适的Java bean来接收或者只有一两个参数没必要写一个Java bean,这时候怎么办呢?答案就是使用Map或MultiValueMap来接收,然后再手动取出来

@RequestMapping(value = "users/{userId}", method = RequestMethod.PUT)
@ResponseBody
public void update(@PathVariable String userId, @RequestBody MultiValueMap<String, Object> user){</span>
String userName = (String)user.getFirst("userName");
//...
}


最后附两篇参考文章
http://*.com/questions/5894270/springmvc-is-not-recognizing-request-body-parameters-if-u
http://blog.csdn.net/u011403655/article/details/44590315