SpringMVC-restfull风格 及对PUT和DELTE请求的包装

---恢复内容开始---

1   什么是restfull风格

http协议支持4种请求提交的方式:

       get

       post

       put

       delete

如果网络url请求资源也是以上述4种方式进行提交,并约定对4种请求方式默认进行以下的操作:

       get:查询操作

       post:新增操作

       put:更新操作

       delete:删除操作

并且,url参数的提交不再以?key=value的方式,而是以/user/id这种方式提交,就是符合restfull风格的编程风格。

2   默认form表单不支持put和delete提交方式的处理

1、在web.xml中配置一个过滤器

<!-- 配置HiddenHttpMethodFilter:可以把POST请求转为DELETE或POST请求 -->

  <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、在提交的表单中,以一个隐藏域来提交一个name为 _method 值为 put或者delete的表单元素,以便上面的过滤器能处理这种请求

<form action="${ctx}/rest/user/1004" method="post">

    <input type="hidden" name="_method" value="DELETE">

    <input type="submit" value="delete提交-->删除id为1004的用户"/>

</form>

 

3、控制器的处理器方法,注解映射中指定提交的方式为 put 或者 delete

@RequestMapping(value = "/user/{id}" ,method = RequestMethod.PUT)

    public String put(@PathVariable("id") Integer id){

        logger.debug("Restfull风格的根据put更新用户:--->id="+id);

        return "redirect:/rest/restfull";

    }

 

4、返回的逻辑视图名的时候,如果发起ajax请求,则需要在上面处理器方法中添加@responseBody注解就可以了

    @ResponseBody

    @RequestMapping(value = "/user/{id}" ,method = RequestMethod.DELETE)

    public String delete(@PathVariable("id") Integer id){

        logger.debug("Restfull风格的根据delete删除:--->id="+id);

        return "restfull";

    }

 

5、返回的逻辑视图名的时候,如果是请求转发到原来发起请求的页面,这个时候,由于form表单不支持put和delete提交方式,则会出错,解决方案是,将请求重定向到一个另一个控制器进行处理,该处理方法由于重定向方式采取的是get方式,从而就能避免上面的错误

返回的视图是一个重定向:

@RequestMapping(value = "/user/{id}" ,method = RequestMethod.PUT)

    public String put(@PathVariable("id") Integer id){

        logger.debug("Restfull风格的根据put更新用户:--->id="+id);

        return "redirect:/rest/restfull";

}

 

写一个处理器方法

 

@RequestMapping(value = "/restfull",method = RequestMethod.GET)

    public String goToRestfullJsp(){

        return "restfull";

    }

---恢复内容结束---

posted @ 2018-09-05 08:40  猫与键盘  阅读(303)  评论(0编辑  收藏  举报