SpringMVC-Rest url 请求风格

Rest-优雅的 url 请求风格

1.Rest-基本介绍

● 说明

  1. REST:即 Representational State Transfer。(资源)表现层状态转化。是目前流行的请求方 式。它结构清晰, 很多网站采用
  2. HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应 四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
  3. 实例

传统的请求方法:

getBook?id=1 —查询

GET delete?id=1 —删除

update POST —修改

add POST —新增

  1. 说明: 传统的 url 是通过参数来说明 crud 的类型,rest 是通过 get/post/put/delete 来说明crud 的类型

● REST 的核心过滤器

  1. 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式需要使用 Spring 提供的 HiddenHttpMethodFilter 过滤器进行转换.
  2. HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT 等 method 并不支持,Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 方 法,使得支持 GET、POST、PUT 与 DELETE 请求
  3. HiddenHttpMethodFilter 能对 post 请求方式进行转换,因此我们需要特别的注意这一点
  4. 这个过滤器需要在 web.xml 中配置

2.Rest 风格的 url-完成增删改查

1.需求说明

SpringMVC-Rest url 请求风格_第1张图片

2.Rest 应用案例-代码实现

  1. 修改 web.xml 添加 HiddenHttpMethodFilter

<filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>
  1. 修改 springDispatcherServlet-servlet.xml
xmlns:mvc="http://www.springframework.org/schema/mvc"


<mvc:annotation-driven>mvc:annotation-driven>

<mvc:default-servlet-handler/>
  1. 创建 \web\rest.jsp, 注意需要引入 jquery, 测试 查询/添加/删除/修改
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    rest 
<%--    引入jquery--%>
    
    


Rest风格的crud操作案例



rest风格的url 查询书籍[get]

点击查询书籍

rest风格的url 添加书籍[post]

name:


rest风格的url, 删除一本书

<%-- 1. 默认情况下 删除指定id的书 是get 2. 【源码】怎么样将 get 请求转成 springmvc 可以识别的 delete 就要考虑HiddenHttpMethodFilter机制 public static final String DEFAULT_METHOD_PARAM = "_method"; --------------------------------------------------- private static final List ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name())); --------------------------------------------------- if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); if (ALLOWED_METHODS.contains(method)) { requestToUse = new HttpMethodRequestWrapper(request, method); } } } 3. 上面代码可以看到 HiddenHttpMethodFilter 过滤器可以对以Post方式提交的delete,put,patch进行转换,成springmvc 识别的 RequestMethod.DELETE / RequestMethod.PUT /... 4. 我们需要将 get 删除指定id的书 以post方式提交给后端handler, 这样过滤器才会生效 5. 我们可以通过jquery来处理-引入jquery --%> 删除指定id的书


rest风格的url 修改书籍[put]~

  1. 创建 \web\rest\BookHandler.java , 处 理 rest 风格的请求
@RequestMapping("/user")
@Controller
public class BookHandler {

    //查询[GET]
    @RequestMapping(value = "/book/{id}", method = RequestMethod.GET)
    public String getBook(@PathVariable("id") String id) {
        System.out.println("查询书籍 id=" + id);
        return "success";
    }

    //添加[POST]
    @PostMapping(value = "/book")
    public String addBook(String bookName) {
        System.out.println("添加书籍 bookName== " + bookName);
        return "success";
    }

    //删除[DELETE]
    @RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE)
    public String delBook(@PathVariable("id") String id) {
        System.out.println("删除书籍 id= " + id);
        //return "success"; //[如果这样返回会报错 JSPs only permit GET POST or HEAD]
        //老师解读
        //1. redirect:/user/success重定向
        //2. 会被解析成 /springmvc/user/success
        return "redirect:/user/success";
    }

    //如果请求是 /user/success , 就转发到 success.jsp
    //successGenecal对应的url http://ip:port/springmvc/user/success
    @RequestMapping(value = "/success")
    public String successGenecal() {
        return "success";  //由该方法 转发到success.jsp页面
    }

    //修改[PUT]
    @PutMapping(value = "/book/{id}")
    public String updateBook(@PathVariable("id") String id) {
        System.out.println("修改书籍 id=" + id);
        return "redirect:/user/success";
    }
}

3.注意事项和细节说明

1、HiddenHttpMethodFilter,在将 post 转成 delete / put 请求时,是按_method 参数名 来 读取的

2、如果 web 项目是运行在 Tomcat 8 及以上,会发现被过滤成 DELETE 和 PUT 请求,到达 控制器时能顺利执行,但是返回时(forward)会报 HTTP 405 的错误提示:消息 JSP 只允许 GET、POST 或 HEAD。

1)解决方式 1: 使用 Tomcat7
2)解决方式 2: 将请求转发(forward)改为请求重定向(redirect):重定向到一个 Handler, 由 Handler 转发到页面

SpringMVC-Rest url 请求风格_第2张图片

你可能感兴趣的:(Spring,java,intellij-idea,java-ee)