一、Restful风格编程
Restful简介:
Restful是一种软件设计规范,是客户端和服务端进行数据交互的一个规范。
早期使用JSP页面开发网页时,数据交互基本都是通过表单提交,然后通过内置对象传递。当HTML5兴起,移动互联网兴起,网站后端服务,不仅要考虑PC端的网页,也要考虑移动端的数据显示、小程序、HTML5页面等。如果需要多个终端(Android、iOS、小程序、Pad、HTML5页面)共用一个后端,一般来说主流方案就是使用JSON进行传递。Restful则规范了请求的URL,注意Restful只是一个规范,不是一个技术。
在Restful中
- 每个 URL 都有一个对应的特定资源,一个URL操作一个资源
- 请求中的URL中不能有动词
- 风格简洁明了,根据注解名称就知道想要做什么操作。
- 使用HTTP的请求方式来描述请求行为:
提交方式 | 地址 | 说明 |
---|---|---|
GET(查): | http://localhost:8080/spring-demo06-Restful/restful01/1 | 查询id为1的数据 |
POST(增): | http://localhost:8080/spring-demo06-Restful/restful02 | 添加一条数据 |
DELETE(删): | http://localhost:8080/spring-demo06-Restful/restful03/3 | 删除id为3的数据 |
PUT(修): | http://localhost:8080/spring-demo06-Restful/restful04 | 修改一条数据 |
注意:
在Restful接口中,所有的方法都是返回JSON,没有返回页面的(ModelAndView),因此,所有的方法上都要添加@ResponseBody注解。一个代替的简化方案,是使用@RestController代替@Controller。@RestController实际上是一个组合注解,是@Controller和@ResponseBody的组合:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
在项目中的使用:
@RestControllerpublic class UserController {
@Autowired
UserService userService;
@GetMapping("/users")
public List<User> getAllUser() {
return userService.getAllUser();
}}
Restful案例:
@Controller
public class HelloController1 {
/**
* get(查询)请求提交
* @param id
*/
@GetMapping("/restful01/{id}")
@ResponseBody
public void restful01(@PathVariable Integer id) {
System.out.println(id);
}
/**
* post(添加)请求提交
* @param cat
*/
@PostMapping("/restful02")
@ResponseBody
public void restful02(@RequestBody Cat cat) {
System.out.println(cat);
}
/**
* delete(删除)请求提交
* @param id
*/
@DeleteMapping("/restful03/{id}")
@ResponseBody
public void restful03(@PathVariable Integer id) {
System.out.println(id);
}
/**
* put(修改)请求提交
* @param cat
*/
@PutMapping("/restful04")
@ResponseBody
public void restful04(@RequestBody Cat cat) {
System.out.println(cat);
cat.setName("zmf");
cat.setId(01);
System.out.println(cat);
}
}
二、拦截器
Spring MVC中的拦截器对应了Web基础中的过滤器。
拦截器和过滤器的区别:
- 1、一般来说,如果使用了Spring MVC框架,然后有拦截器的需求,建议使用拦截器而不是过滤器。
- 2、过滤器依赖于servlet容器,而拦截器是Spring MVC 自带的,不依赖于容器。
- 3、拦截器的功能更强大,因为拦截器是一种AOP风格的过滤器(实际上这个功能过滤器也能实现,只是没有拦截器这么简单明了。)
1、创建拦截器:
拦截器一:
拦截器二:
2、配置拦截器
两个拦截器的preHandle方法返回值都是为true(所有的方法都执行了):
preHandle
preHandle-2
getAllUser
postHandle-2
postHandle
afterCompletion-2
afterCompletion
第一个拦截器的preHandle方法返回false(后面方法都没有执行了):
preHandle
第一个拦截器的preHandle方法返回true,第二个拦截器的preHandle方法返回false,此时,第一个拦截器的afterCompletion方法执行了,第二个拦截器的preHandle方法执行了。
规则:
- 所有拦截器的preHandle方法返回true时,postHandle方法才会执行。
- 拦截器自己的preHandle方法返回true时,后面的拦截器才会执行,同时他自己的afterCompletion也会执行。
- 拦截器的执行顺序和xml中的定义顺序有关。(preHandle按照定义的顺序执行,postHandle和afterCompletion执行顺序与定义顺序相反)