Spring MVC之Restful风格编程以及拦截器

一、Restful风格编程

Restful简介:

Restful是一种软件设计规范,是客户端和服务端进行数据交互的一个规范。
早期使用JSP页面开发网页时,数据交互基本都是通过表单提交,然后通过内置对象传递。当HTML5兴起,移动互联网兴起,网站后端服务,不仅要考虑PC端的网页,也要考虑移动端的数据显示、小程序、HTML5页面等。如果需要多个终端(Android、iOS、小程序、Pad、HTML5页面)共用一个后端,一般来说主流方案就是使用JSON进行传递。Restful则规范了请求的URL,注意Restful只是一个规范,不是一个技术。

在Restful中

  • 一个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方法执行了。

规则:

  1. 所有拦截器的preHandle方法返回true时,postHandle方法才会执行。
  2. 拦截器自己的preHandle方法返回true时,后面的拦截器才会执行,同时他自己的afterCompletion也会执行。
  3. 拦截器的执行顺序和xml中的定义顺序有关。(preHandle按照定义的顺序执行,postHandle和afterCompletion执行顺序与定义顺序相反)

猜你喜欢

转载自blog.csdn.net/LOYE_YOU/article/details/89468234