-
先抛开原理不说,咱们平时开发的时候,基于 Spring MVC 的 Web 应用程序开发流程或者说开发步骤是啥呢?
- 这套基于传统的 Spring MVC 框架开发 Web 应用逐渐暴露出一些问题,比较典型的就是
传统的 Spring MVC 配置工作过于复杂和繁重,以及缺少必要的应用程序管理和监控机制
。如果想优化这一套开发过程,有几个点值得我们去挖掘,比方说减少不必要的配置工作、启动依赖项的自动管理、简化部署并提供应用监控等。而这些优化点恰巧推动了以 Spring Boot 为代表的新一代开发框架的诞生
。Spring Boot 一锅粥在这里
- 这套基于传统的 Spring MVC 框架开发 Web 应用逐渐暴露出一些问题,比较典型的就是
-
咱们甭管点页面上的图标还是直接在浏览器的地址栏中输入网址去访问网页内容,都是咱们作为客户端向服务器发出了一个请求,网页前端有个控制器(这个在java这里前期控制器就是servlet),会拦截这些请求数据,然后调用对应的业务逻辑方法进行处理…过程不就是下面这几步:
- 用户发请求
- Servlet【接口就是来定义规范的,servlet接口不就是一个定义了规范的接口嘛】接收请求数据,调用对应的业务逻辑方法。比如编写自己的servlet类用来模拟处理用户的请求,然后可以写一个简单的表单提交的页面去向后台提交些数据(要去继承或者说实现官方的Servlet类并重写其中的doGet()和doPost()两个方法,一般都是在doPost()中调用doGet()方法然后代码就写在doGet()方法中哦)
- servlet容器两个作用:
- 存放servlet实例或者servlet接口们
- 我们就是在web.xml中配置,把servlet放到servlet容器中。配置好所有的请求让我配置的servlet来分发处理
- 接收http报文并解析成Java对象【肯定是借助了tomcat,咱们光知道咱们不管是最早的service或者doGet以及doPost方法,还是现在的形参中的Request或者HttpRequest以及相应的响应,
不都是人家Tomcat帮咱们把客户端发来的请求封装为Request了嘛
】
- init():
- 存放servlet实例或者servlet接口们
- servlet容器两个作用:
- 业务处理完毕,返回更新后的数据给servlet,让servlet进行进一步调度
- servlet转发或者重定向到JSP,由JSP来渲染页面(个人感觉渲染就是把页面中的数据塞到或者说填充到页面对应位置中)
- 把更新后的页面响应给或者说返回给前端进行展示
那说白了,我个人觉得,springmvc就是一个升级版的控制器或者企业级开发简历中的大型控制器。
-
SpringMVC
- MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,MVC核心思想是通过将业务逻辑、数据、显示分离来组织代码。没有MVC设计模式之前咱们是咋玩的,是Model 1 和 Model 2这两个时代里面的玩法
- 在 Model1 模式:
- 整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。
这个模式下 JSP 即是控制层(Controller)又是表现层(View)
。显而易见,这种模式存在很多问题。比如控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;再比如前端和后端相互依赖,难以进行测试维护并且开发效率极低。
- 整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。
- 在 Model2模式:Java Bean(Model)+ JSP(View)+Servlet(Controller) ”这种开发模式。Model2 模式下还存在很多问题,Model2 的抽象和封装程度还远远不够,使用 Model2 进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。
于是,很多 JavaWeb 开发相关的 MVC 框架应运而生比如 Struts2,但是 Struts2 比较笨重
。- Model:系统涉及的数据,也就是 dao 和 bean
- View:展示模型中的数据,只是用来展示
- Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户
- 在 Model1 模式:
- Spring MVC 时代:
- 随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。
Spring MVC 可以帮助我们进行更简洁的 Web 层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)
- 随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。
- MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,MVC核心思想是通过将业务逻辑、数据、显示分离来组织代码。没有MVC设计模式之前咱们是咋玩的,是Model 1 和 Model 2这两个时代里面的玩法
-
虽然说咱们学的时候得深入到原理,学懂原理,从而体现springmvc这里面东西很多。
- 但是,罗马不是一天建成的,咱们之前还没学框架时,用的是servlet+jsp(早期的JSP,本质上就是一个Servlet)等等一些技术开发javaweb项目【整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。
这个模式下 JSP 即是控制层(Controller)又是表现层(View)
这种模式存在很多问题。比如控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;再比如前端和后端相互依赖,难以进行测试维护并且开发效率极低。】。
- 紧接着,“Java Bean(Model)+ JSP(View)+Servlet(Controller) ”这种开发模式,这就是早期的 JavaWeb MVC 开发模式。【Model2 的抽象和封装程度还远远不够,使用 Model2 进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。】
- Model:系统涉及的数据,
也就是 dao 和 bean
。 - View:展示模型中的数据,只是用来展示。
- Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。
- 当时的大体开发步骤就是:
- 写好web.xml:里面配置好过滤器、servlet、欢迎页面等
- 配置用的servlet、映射规则等。配置好所有的请求让我配置的servlet来分发处理
- 其实过滤器就是,为了避免在代码中写很多的if else呗,你想if else不也是一种过滤嘛
- 配置用的servlet、映射规则等。配置好所有的请求让我配置的servlet来分发处理
- 写好pom.xml:不就是将咱们最早的导jar包形式变成了maven坐标依赖嘛
- 然后编写自己的servlet类用来模拟处理用户的请求,然后可以写一个简单的表单提交的页面去向后台提交些数据(要去继承或者说实现官方的Servlet类并重写其中的doGet()和doPost()两个方法,一般都是在doPost()中调用doGet()方法然后代码就写在doGet()方法中哦)
不管是咱们之前玩service的GenericServlet,还是玩get和post方法的HttpServlet,还是SpringMVC的DispatcherServlet,不都是Servlet的封装了不同功能的不同子类或者子接口嘛
- 然后呢,可以再看看DispatcherServlet这个Servlet的子实现类的代码层次结构是什么样的。
- 然后呢,可以再看看DispatcherServlet这个Servlet的子实现类的代码层次结构是什么样的。
- 写好web.xml:里面配置好过滤器、servlet、欢迎页面等
- Model:系统涉及的数据,
- 另外呢,之前接触的MVC是个啥呀,也回顾一下:当咱们还没接触到springmvc前自己实现MVC时,会这样搞:
- MVC:一种软件设计规范。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
- Controller:控制器
- 1.取得表单数据
- 2.调用业务逻辑层的业务逻辑
- 3.转向指定的页面(通过转发或者重定向)
- Model:模型
- 1.业务逻辑
- 2.保存数据的状态
- View:视图
- 1.显示页面
- Controller:控制器
- MVC:一种软件设计规范。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
- 当咱们用了SSM框架后【或者对于本文而言,当咱们用了Spring MVC后】,
- 随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。
相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快
。【MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的 Web 层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。】 - 我个人感觉作为一个扎哇程序员,
实际做项目时用的时候基本上主要就干了两件事
:- 写个XxxController跨层调调调+
- 在XxxController类的相应方法中设置视图名称并return转发两件事(如果把写配置文件算上那就三件事)
- 但是实际干项目的步骤肯定不止这两步,毕竟虽然说不是经常从0开始写,但是咱们也应该知道实际干项目时,Spring MVC做项目时的使用步骤就是:
- 第一步:导一下jar包(后期基本上都是maven项目,所以就编写maven坐标导入依赖即可),先检查依赖 ,没有的导进去
- 里面的注册DispatcherServlet中的主要内容就是在web.xml中这样配:
- 里面的注册DispatcherServlet中的主要内容就是在web.xml中这样配:
- 第二步:具体就是就是编写一下springmvc的配置文件,【spring全家桶,基本上都有自己的配置文件,咱们做项目时都得配置一下】,
- 在配置文件中开一下注解驱动(注解驱动的作用就是帮咱
们注册以及注入了适配器和处理器
,就不用咱们自己写两个适配器和处理器的bean,再把他俩的bean注入到spring的上下文中或者叫IOC容器中了)和组件扫描(可以扫描指定路径下的所有注解,让注解生效呀,不然咱们写那个注解,spring怎么知道他是干啥来的),以及过滤一下静态资源、以及配一下视图解析器(视图解析器主要作用是帮咱们拼接视图名称,再把数据塞进去),
处理映射器和处理器适配器的作用就是先找到哪些控制器能处理当前请求,再把当前请求拿过去交给控制器去处理
。
- 但是呢,咱们实际做项目时,是用
注解驱动
这个配置代替
处理映射器和处理器适配器这两个bean的配置的。
- 配置视图解析器:虽然处理映射器和处理器适配器被注解的配置代替了,但是视图解析器依旧是原理那里的配置,还是得配置的。
- 视图解析器是用来进行两件事的:
跳转到拼接的页面+渲染(塞数据的)
。其实Servlet中的request和response两个可以以形参的形式出现的东东,也可以实现视图跳转、转发重定向、打印啥啥啥等功能,你看程序嘛,只不过这也不咋用了,和ModelAndView一样被淘汰了
不是有个mv.setViewName("xxx")嘛;//xxx会和springmvc的配置文件中的suffix和prefix一块拼接成为/...页面具体路径.../xxx.jsp完整的页面名称,拼接好之后直接跳转过去显示页面出来
- 在配置文件中开一下注解驱动(注解驱动的作用就是帮咱
- 第三步:除了编写web.xml、pom.xml、以及各式各样的Spring MVC的配置文件之外,另外一件事就是编写XxxController们。编写我们要操作业务Controller,
要么实现Controller接口
,要么增加注解
;需要返回一个ModelAndView,装数据,封视图;- 实现Controller接口:这肯定得配合XML配置文件
- 要自己写一个XxxController实现Controller接口,把咱们自己写的这个XxxController类当作控制器:
然后呢,将自己的类交给SpringIOC容器,也就是注册bean
写好之后,然后在配置文件中配置这个控制器。【这不就是咱们自己写的一个处理器,咱们URL那里的请求会被咱们这个处理器适配到,先适配到再处理(这是学原理才这样写,实际干项目时咱们用@RequestMapping()代替了这个URL的通过id找的bean配置)】
咱们写的这个Handler,也就是<bean id = “/hello”…>,不就是来处理咱们目前例子程序中这个hello对应的这句URL请求了嘛,这个bean标签里面不刚好有个class中对应着这个XxxController这个类了嘛,再看看咱们这个XxxController这个类中(这个XxxController这个类中也只有一个方法,这个方法本质上就是返回一个ModelAndView)。但是咱们这是学原理才这样写的,实际做项目咱们的XxxController中主要写的是两件事:用return返回视图名字或者加个@RequestBody再return返回一个JSON字符串,同时用model.addAttribute(“”,“”)将处理好的数据塞到视图中,也就是这两件事,不会像学原理时这样写代码。
model.addAttribute()的作用就是将结果传递给前端
- 要自己写一个XxxController实现Controller接口,把咱们自己写的这个XxxController类当作控制器:
- 使用注解开发:
- 咱们真实做项目时,里面就是写@Component、@RequestMapping,return视图名称给前台(有时咱们会玩到JSON字符串,那就用一个@RequestBody把return后面的视图名称换个身份变成一个JSON字符串,然后再用model.addAttribute把数据通过视图解析器塞到视图中等)。
- 咱们真实做项目时,里面就是写@Component、@RequestMapping,return视图名称给前台(有时咱们会玩到JSON字符串,那就用一个@RequestBody把return后面的视图名称换个身份变成一个JSON字符串,然后再用model.addAttribute把数据通过视图解析器塞到视图中等)。
- 实现Controller接口:这肯定得配合XML配置文件
- 第一步:导一下jar包(后期基本上都是maven项目,所以就编写maven坐标导入依赖即可),先检查依赖 ,没有的导进去
- 随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。
- 但是,罗马不是一天建成的,咱们之前还没学框架时,用的是servlet+jsp(早期的JSP,本质上就是一个Servlet)等等一些技术开发javaweb项目【整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。
-
SpringMVC 工作原理
【或者说那如果用了框架后,Spring MVC在SSM中起了个什么作用呢?】:springmvc大体过程也不就是来了个请求
,拿着请求的url中的hello去先寻找Handler这个XxxController这个处理器,找到了后在去适配这个Handler这个XxxController这个处理器并让处理器帮咱们处理客户端请求【不然我费这么多人这么多步骤找你适配你干啥】,之后springmvc会帮咱们处理并返回ModelAndView,然后解析渲染,展示给访问者(请求的发起着,或者URL的输入着)
不管是咱们之前玩service的GenericServlet,还是玩get和post方法的HttpServlet,还是SpringMVC的DispatcherServlet,不都是Servlet的封装了不同功能的不同子类或者子接口嘛
。【还是那一句话,人家springmvc升级版可不是吹来的,人家能干的事多着呢,可不止当一个纯控制器哦。】- 然后呢,可以再看看DispatcherServlet这个Servlet的子实现类的代码层次结构是什么样的。
- 然后呢,可以再看看DispatcherServlet这个Servlet的子实现类的代码层次结构是什么样的。
- springmvc主要负责Web层,当客户(通过浏览器)发起request等请求时,SpringMVC负责封装data,并把实体进行传递,最终指派视图进行网页信息的展示。。概括一下步骤如下:
- 1。发送请求:就是当咱们在浏览器地址输入栏输入地址并敲回车后
- 2.请求会先经过web.xml中配置的servlet的子类DispatcherServlet进行分发(只不过这里的servlet是DispatcherServlet(
这个DispatcherServlet其实也是Servlet的一个子类
【不管是咱们之前玩service的GenericServlet,还是玩get和post方法的HttpServlet,还是SpringMVC的DispatcherServlet,不都是Servlet的封装了不同功能的不同子类或者子接口嘛
】))
- notes:当然啦,这里作为拦截请求时,不仅可以写/和/*,咱们也可以只写一个hello这种,就相当于只拦截某一个请求喽。/和/*都是代表匹配从URL中来的所有的请求,但是/常用,/*容易形成死循环
- 3.把请求委托给处理器,而这里的处理器就指的是咱们写的XxxController,而咱们的XxxController里面不就是写了设置页面名称并进行页面名称拼接、以及调用业务对象、返回模型数据等,然后最终返回ModelAndView。
- 上面和这里都提到了这个ModelAndView,这个货到底是个啥东西呢。
- 上面和这里都提到了这个ModelAndView,这个货到底是个啥东西呢。
- 1。发送请求:就是当咱们在浏览器地址输入栏输入地址并敲回车后
-
Spring MVC 的10个核心组件:DispatcherServlet 和九大组件
- DispatcherServlet 负责协调(DispatcherServlet这个类,这个前端控制器挺重要的):Spring的web框架围绕DispatcherServlet 调度Servlet 设计。
DispatcherServlet的作用是负责接收请求、将请求分发到不同的处理器,并给予客户端响应
。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁; .
- 其他组件则各自做分内之事,互不干扰
- HandlerMapping :
处理器映射器,根据 uri 去匹配查找能处理客户端请求的 Handler
,并会将请求涉及到的拦截器和 Handler 一起封装
- HandlerAdapter :
处理器适配器,根据 HandlerMapping 找到的 Handler
,适配执行对应的 Handler
- Handler :请求处理器,处理实际请求的处理器
- ViewResolver :视图解析器,
根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端
- HandlerMapping :
- DispatcherServlet 负责协调(DispatcherServlet这个类,这个前端控制器挺重要的):Spring的web框架围绕DispatcherServlet 调度Servlet 设计。
下面就是买框图的赠品喽:
- @RequestMapping 注解,让前台页面能够找到后台类中的方法们,在上面已经讲过了,配置处理器的 HTTP 请求方法,URI等信息,这样才能将请求和方法进行映射。这个注解可以作用于类上面,也可以作用于方法上面,在类上面一般是配置这个控制器的 URI 前缀
- @RestController 和 @Controller 有什么区别?
- @RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,
返回什么样的数据格式,根据客户端的 ACCEPT 请求头来决定
。
- @RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,
- @RequestMapping 和 @GetMapping 注解的不同之处在哪里?
- @RequestMapping:可注解在类和方法上;
- @GetMapping 仅可注册在方法上
- @RequestMapping:可进行 GET、POST、PUT、DELETE 等请求方法;
- @GetMapping 是 @RequestMapping 的 GET 请求方法的特例,目的是为了提高清晰度。
- @RequestParam 和 @PathVariable 两个注解的区别:两个注解都用于方法参数,获取参数值的
方式
不同
- @RequestParam 注解的参数从请求携带的参数中获取
- @PathVariable 注解从请求的 URI 中获取
- 有时候依赖不全,可以从下面几个方面检查一下依赖:
- springmvc的数据处理:从前端接收到数据的三种情况
- 乱码问题
- JSON:是一种数据交换格式
- 返回 JSON 格式使用什么注解:可以使用 @ResponseBody 注解,或者使用包含 @ResponseBody 注解的 @RestController 注解。(还是需要配合相应的支持 JSON 格式化的 HttpMessageConverter 实现类。例如,Spring MVC 默认使用 MappingJackson2HttpMessageConverter。)
- Json数据处理:
- 过滤 json 数据:@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
- @JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
- 格式化Json数据:@JsonFormat一般用来格式化 json 数据。
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT") private Date date;
- 扁平化对象
- 原对象未扁平化之前:
- 使用@JsonUnwrapped 扁平对象之后:
- 原对象未扁平化之前:
- 过滤 json 数据:@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
- 返回 JSON 格式使用什么注解:可以使用 @ResponseBody 注解,或者使用包含 @ResponseBody 注解的 @RestController 注解。(还是需要配合相应的支持 JSON 格式化的 HttpMessageConverter 实现类。例如,Spring MVC 默认使用 MappingJackson2HttpMessageConverter。)
- 什么是springmvc拦截器以及如何使用它:Spring的处理程序映射机制包括处理程序拦截器,当你希望将特定功能应用于某些请求时,例如,检查用户主题时,这些拦截器非常有用。自定义拦截器时,拦截器必须实现org.springframework.web.servlet包的HandlerInterceptor,
然后需要去SpringMVC的配置文件中配置拦截器,需去web.xml中配置过滤器
:。
- org.springframework.web.servlet包的HandlerInterceptor接口定义了三种方法:
- preHandle:在执行实际处理程序之前调用。在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
- postHandle:在执行完实际程序之后调用,在处理过程中(Controller方法处理完之后 DispatcherServlet进行视图的渲染之前)执行拦截
- afterCompletion:在完成请求后调用。在DispatcherServlet进行视图的渲染后 返回前进行拦截
- 拦截器和过滤器的区别:
- org.springframework.web.servlet包的HandlerInterceptor接口定义了三种方法:
- REST&RESTful&API
- API:
- 我们在进行后端开发的时候,主要的工作就是
为前端或者其他后端服务提供 API 比如查询用户数据的 API。API 不仅仅代表后端系统暴露的接口,像框架中提供的方法也属于 API 的范畴。
- 我们在进行后端开发的时候,主要的工作就是
RESTful API 经常也被叫做 REST API
:是基于 REST 构建的 API【REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口)
;】
- RESTful API 可以
让咱们看到 URL+Http Method 就知道这个 URL 是干什么的,让你看到了 HTTP 状态码(status code)就知道请求结果如何
- 咱们在开发过程中设计 API 的时候也应该至少要满足 RESTful API 的最基本的要求:
- (比如接口中尽量使用名词,使用 POST 请求创建资源,DELETE 请求删除资源等等,示例:GET /notes/id:获取某个指定 id 的笔记的信息)。
- 咱们在开发过程中设计 API 的时候也应该至少要满足 RESTful API 的最基本的要求:
- REST 代表着什么? Resource Representational State Transfer 的缩写,翻译过来就是
“资源”在网络传输中以某种“表现形式”进行“状态转移”【**REST 代表着抽象状态转移**,它是根据 HTTP 协议从客户端发送数据到服务端,例如:**服务端的一本书可以以 XML 或 JSON 格式传递到客户端**】
。- 资源(Resource) :
- 我们可以把
真实的对象数据称为资源
。一个资源既可以是一个集合,也可以是单个个体。比如我们的班级 classes 是代表一个集合形式的资源,而特定的 class 代表单个个体资源。每一种资源都有特定的 URI(统一资源标识符)与之对应,如果我们需要获取这个资源,访问这个 URI 就可以了
,比如获取特定的班级:/class/12。另外,资源也可以包含子资源,比如 /classes/classId/teachers:列出某个指定班级的所有老师的信息
- 我们可以把
- 表现形式(Representational):“资源"具体呈现出来的形式比如 json,xml,image,txt 等等叫做它的"表现层/表现形式”。
- Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。当然还可以压缩HTTP传输时的数据(on-wire data compression)。
- 状态转移(State Transfer) :REST 中的状态转移更多地描述的服务器端资源的状态,比如你通过增删改查(通过 HTTP 动词实现)引起资源状态的改变【
用HTTP协议里的动词来实现资源的添加,修改,删除等操作。即通过HTTP动词来实现资源的状态扭转
】。- 互联网通信协议 HTTP 协议,是一个无状态协议,所有的资源状态都保存在服务器端。
- REST API 是无状态的吗?
- 是的,REST API 应该是无状态的,因为它是基于 HTTP 的,它也是无状态的,REST API 中的请求应该包含处理它所需的所有细节。
REST API不应该依赖于以前或下一个请求或服务器端维护的一些数据
,例如会话【REST 规范为使其无状态设置了一个约束,在设计 REST API 时,你应该记住这一点
】
- 是的,REST API 应该是无状态的,因为它是基于 HTTP 的,它也是无状态的,REST API 中的请求应该包含处理它所需的所有细节。
- 什么是安全的 REST 操作?(REST 接口是通过 HTTP 方法完成操作,
是否安全的界限,在于是否修改服务端的资源
)- 一些 HTTP 操作是安全的,如 GET 和 HEAD ,它不能在服务端修改资源
- PUT、POST 和 DELETE 是不安全的,因为他们能修改服务端的资源
- REST安全吗? 你能做什么来保护它?
- 安全是一个宽泛的术语。REST 通常不是安全的,需要开发人员自己实现安全机制,它可能意味着消息的安全性,这是通过认证和授权提供的加密或访问限制提供的
- 资源(Resource) :
- RESTful 架构:
每一个 URI 代表一种资源
- API 的具体网址在实际开发中常见的规范:
- 举例:一个 API 提供班级(class)的信息,还包括班级中的学生和教师的信息,则它的路径应该设计成下面这样。
- API 的具体网址在实际开发中常见的规范:
客户端和服务器之间,传递这种资源的某种表现形式比如 json,xml,image,txt 等等
- 客户端通过特定的 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"
- RESTful API 可以
- API:
- Spring MVC和Struts2的异同
- 统一异常处理:
一般会使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice + @ExceptionHandler 这两个注解
。@ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @ExceptionHandler(BaseException.class) public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) { //...... } @ExceptionHandler(value = ResourceNotFoundException.class) public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) { //...... } }
- 这种异常处理方式下,会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被@ExceptionHandler 注解修饰的方法进行处理。
- ExceptionHandlerMethodResolver 中 getMappedMethod 方法决定了异常具体被哪个被 @ExceptionHandler 注解修饰的方法处理异常
巨人的肩膀:
Spring MVC中文官方文档:https://www.w3cschool.cn/spring_mvc_documentation_linesh_translation/
https://www.bilibili.com/video/BV1PE411i7CV?
https://www.javalearn.cn/