SpringMVC教程五【Restful和拦截器】

Restful风格

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

在Restful中:

1.一个URL操作一个资源
2.请求的URL不能有动词
3.使用HTTP的请求方式来描述请求行为
在restful接口中,所有的方法都是返回json数据,没有返回页面(modelandview),因此,所有的方法上面都要添加@restponsebody注解。一个代替的简单方案,是使用@RestController代替@Controller,@RestController是一个组合注解,是@Controller和@ResponseBody的组合:
在这里插入图片描述

案例

package com.sxt;


import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.sxt.bean.Book;

@RestController
public class Conreoller {
	@PostMapping("/book")
	@ResponseBody
	public void getbook(@RequestBody Book book){
		System.out.println(book);
	}
	@GetMapping("/book/{id}")
	@ResponseBody
	public void getbookid(@PathVariable Integer id){
		System.out.println(id);
	}
	@DeleteMapping("/book/{id}")
	@ResponseBody
	public void getbookid1(@PathVariable Integer id){
		System.out.println(id);
	}
	
	@PutMapping("/book")
	@ResponseBody
	public void getbookid1(@RequestBody Book book){
		System.out.println(book);
	}
	
}

二,拦截器

1.简介

SpringMVC中的拦截器对应了Web基础中的过滤器,过滤器和拦截器的区别:

序号 区别
1 一般来说,如果使用了SpringMVC框架,然后有拦截的需求,建议使用拦截器而不是过滤器
2 过滤器依赖于Servlet容器,而拦截器是SpringMVC自带的,不依赖于容器
3 拦截器的功能更加强大,因为拦截器是一种AOP风格的过滤器

使用(定义拦截器)

package com.sxt.fifle;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
 * 自定义拦截器
 * @author Administrator
 *
 */
public class MyFifle implements HandlerInterceptor{
	/**
	 * 进入Handler之前调用的方法
	 * 处理:
	 *    用于身份确认和授权
	 *    比如确认当前请求是否登陆,如果登陆就方法,否则拦截跳回登陆界面
	 * @return
	 *    true 放过
	 *    false 拦截
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("执行了");
		return true;
	}
	/**
	 * 进入Handler之后,返回ModelAndView对象之前执行
	 * 可以修改调整的视图
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("中间执行了");
	modelAndView.setViewName("/user.jsp");
		
	}
	/**
	 * 执行完成Handler之后执行此方法,
	 * 应用场景:
	 *    统一异常处理,统一日志处理,资源释放
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("末尾执行了");
		
	}

}

第一个拦截器的preHandle方法返回false(后面方法都没有执行了):
preHandle
第一个拦截器的preHandle方法返回true,
第二个拦截器的preHandle方法返回false,此时,第一个拦截器的afterCompletion方法执行了,第二个拦截器的preHandle方法执行了。
规则:1. 所有拦截器的preHandle方法返回true时,postHandle方法才会执行。
2. 拦截器自己的preHandle方法返回true时,后面的拦截器才会执行,同时他自己的afterCompletion也会执行。
3. 拦截器的执行顺序和xml中的定义顺序有关。(preHandle按照定义的顺序执行,postHandle和afterCompletion执行顺序与定义顺序相反)

在这里插入图片描述

配置拦截条件


	<!-- 开启SpringMVC注解的方式 -->
	<mvc:annotation-driven >
	</mvc:annotation-driven>
		<!-- 开启扫描 -->
	<context:component-scan base-package="com.sxt"/>
	<!-- 拦截器配置 -->
	<mvc:interceptors>
		<mvc:interceptor>
		<!-- ** 表示当前目录及其子目录路径 -->
				<mvc:mapping path="/**"/>
				<!-- 自定义拦截器的全路径 -->
				<bean class="com.sxt.fifle.MyFifle"/>
		</mvc:interceptor>
	</mvc:interceptors>

测试

在这里插入图片描述
但是在拦截器修改了页面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

拦截器工作原理

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30984561/article/details/89468236
今日推荐