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只是一个一种风格,现在越来越多的网站使用。