SMVC2:RestFul风格的使用

2.1 简介

​ RestFul风格,是一种 URL地址表现形式 。例如,假设我们使用某搜索引擎时,我们搜索 ”爱情“ ,那么URL地址栏内可能是:

https://xxxxxx/search?values=爱情

而如果是RestFul风格,那么URL地址栏应该是这样:

https://xxxxxx/search/爱情

提示: 简单来说,所谓的RestFul风格,就是把地址栏中的地址进行了一个格式上的改变,使用 / 来进行参数已经相关请求等的分割,可以使用不同的方法(POST,GET,DELETE,PUT),对资源进行操作。

2.2 优点

  • 简洁: 使用RestFul风格之后,URL只会表现出相应的 ”值“ ,而不会像是相应的 ”名“ 。所以,很大程度上缩短了URL,看上去更简洁。
  • 高效: 此部分涉及缓存内容,暂时不理解,反正就是高效。
  • 安全: URL再也不会显示所谓的参数名,那么,用户在使用时,根本就不知道传递的到底是什么参数,所以更加安全。

2.3 使用

  • 配置SpringMVC环境

    • web.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
    
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
    • springmvc-servlet.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.yun.controller"/>
        <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  • 前端页面

    • restPage.jsp:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${res}
    </body>
    </html>
    
  • 控制器

    • MyController:

      package com.yun.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.PathVariable;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      @Controller
      public class MyController {
      
          @RequestMapping("/rest/{a}/{b}")
          public String restFul(@PathVariable int a, @PathVariable int b, Model model){
              int result = a+b;
              model.addAttribute("res","参数结果"+result);
              return "restPage";
          }
      }
      

      提示: 此处,在**@RequestMapping("/rest/{a}/{b}")** 注解中,添加了参数 {a},{b} ,而值的提供则是来自于方法中的参数 @PathVariable int a, @PathVariable int b ,值得注意的是,两个注解中的参数名,必须一致。如果RequestMapping注解中的参数名为a1,b1,而方法中的参数为a,b,那么,在使用时,就会传参失败。

2.4 RestFul方法

2.4.1 简介

​ 在JSP或者往常的开发中,表单提交的方式,或者说方法往往是 POST与GET 两种,各有各的优势。而使用RestFul风格后,我们这里则多出来了几个方法:POST、GET、DELETE、PUT

2.4.2 方法

简介: 在传统的资源操作中,我们使用 GET来负责查询 ,使用 POST来进行增加、更新、删除 等操作(删除也可以使用GET)。但是,在RestFul风格中,我们可以使用GET作查询,POST作增加,PUT作更新,DELETE作删除。

  • 传统资源操作
功能 方法 URL
查询 GET http://localhost/item/select.do?id=1
新增 POST http://localhost/item/insert.do
更新 POST http://localhost/item/update.do
删除 POST或者GET http://localhost/item/delete.do?id=1
  • RestFul资源操作
功能 方法 URL
查询 GET http://localhost/item/1
新增 POST http://localhost/item
更新 PUT http://localhost/item
删除 DELETE http://localhost/item/1

提示: 在这里会发现,明明使用的是一样的URL,却可以实现不同的操作,这就是RestFul风格的方法使用。

2.4.3 方法的使用

MyController.java:

package com.yun.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping(value = "/rest/{a}/{b}",method = RequestMethod.POST)
    public String restFul(@PathVariable int a, @PathVariable int b, Model model){
        int result = a+b;
        model.addAttribute("res","参数结果"+result);
        return "restPage";
    }
}

提示: 在这里我们发现,我们在 @RequestMapping 注解中,指定了 value与method 的值,前者是参数,后者则是请求方法。上述例子中,我们指定的请求方法是 POST ,那么,当我们使用 GET 方法进行访问时,便会出错。例如我们直接在URL地址栏中输入:

http://localhost:8080/SpringMVC_03_restFul_war_exploded/rest/1/4

那么,程序就会报错405:Request method ‘GET’ not supported。因为地址栏直接访问,默认的方式是GET,而不是POST。如果想要有效的地访问该请求,那么我则需要使用POST方法。当然,其他方法的使用也是这样。

当然,通过方法,我们也可以实现同一URL,执行不同功能的操作:

package com.yun.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyController {

    @RequestMapping(value = "/rest/{a}/{b}",method = RequestMethod.POST)
    public String restFul(@PathVariable int a, @PathVariable int b, Model model){
        int result = a+b;
        model.addAttribute("res","POST方法,参数结果"+result);
        return "restPage";
    }

    @RequestMapping(value = "/rest/{a}/{b}",method = RequestMethod.GET)
    public String restFul1(@PathVariable int a, @PathVariable int b, Model model){
        int result = a+b;
        model.addAttribute("res","GET方法,参数结果"+result);
        return "restPage";
    }
}

提示: 此时,我们在URL地址栏中输入:

http://localhost:8080/SpringMVC_03_restFul_war_exploded/rest/1/4

然后,进行资源访问时,并不会出现405错误。因为URL访问是GET方式,而控制器中,同样也准备了GET访问时,应该执行的方法。但是,在用户看来,不管是使用POST还是GET,在URL的表示上面,并没有区别。因为都是:http://localhost:8080/SpringMVC_03_restFul_war_exploded/rest/1/4。由此便实现了,同一个URL,实现不同功能的作用。当然,如果同时给两个方法指定的 RequestMapping 注解一模一样,那么程序就会出现500错误,因为程序无法抉择使用哪一个方法。值得一提的是,此处所谓的一模一样,无关参数名。指的是URL格式,与method方法,如:

@RequestMapping(value = "/rest/{a}/{b}",method = RequestMethod.GET)
    public String restFul(@PathVariable int a, @PathVariable int b, Model model){
        int result = a+b;
        model.addAttribute("res","参数结果"+result);
        return "restPage";
    }

    @RequestMapping(value = "/rest/{a1}/{b}",method = RequestMethod.GET)
    public String restFul1(@PathVariable int a1, @PathVariable int b, Model model){
        int result = a1+b;
        model.addAttribute("res","参数结果"+result);
        return "restPage";
    }

RestFul只是一个一种风格,现在越来越多的网站使用。

上一篇:Apizza在线接口工具如何支持RESTful Path 参数


下一篇:SpringMVC RESTful支持 2021-09-20