Spring MVC 是 Spring 给我们提供的⼀个⽤于简化 Web 开发的框架
一、springmvc简介
1.MVC体系
我们的开发架构⼀般都是基于两种形式,⼀种是 C/S 架构,也就是客户端/服务器;另⼀种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。
持久层:
2.springmvc是什么
springmvc的本质
二、Spring Web MVC ⼯作流程
1.开发过程
(1)配置DispatcherServlet前端控制器
(2)开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
(3)xml配置⽂件配置controller扫描,配置springmvc三⼤件
(4)将xml⽂件路径告诉springmvc(DispatcherServlet)
2.Spring MVC 请求处理流程
3.Spring MVC 九⼤组件
HandlerAdapter(处理器适配器)
FlashMapManager
FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完post请求之后重定向到⼀个get请求,这个get请求可以⽤来显示订单详情之类的信息。这样做虽然可以规避⽤户重新提交订单的问题,但是在这个⻚⾯上要显示订单的信息,这些数据从哪⾥来获得呢?因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通过FlashMap来传递。只需要在重定向之前将要传递的数据写⼊请求(可以通过ServletRequestAttributes.getRequest()⽅法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,这样在重定向之后的Handler中Spring就会⾃动将其设置到Model中,在显示订单信息的⻚⾯上就可以直接从Model中获取数据。FlashMapManager 就是⽤来管理 FalshMap 的。
4.url-pattern的配置及原理
拦截静态资源的两种方法
第二种要加上前缀
5.model、map、modelmap的关系
还可以用
原理
6.请求参数绑定
(1).了解(为何都是字符串参数接收呢,因为servlet使用的都是http协议)
(2)深入:
绑定Pojo类型参数
绑定Pojo包装对象参数
绑定⽇期类型参数(需要配置⾃定义类型转换器)
三、 Restful ⻛格请求⽀持
Restful 是⼀种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是⼀个资源定位及资源操作的⻛格。
1. 什么是 RESTful
REST(英⽂:Representational State Transfer,简称 REST)描述了⼀个架构样式的⽹络系统, ⽐如web 应⽤程序。它⾸次出现在 2000 年 Roy Fielding 的博⼠论⽂中,他是 HTTP 规范的主要编写者之⼀。在⽬前主流的三种 Web 服务交互⽅案中,REST 相⽐于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,⽆论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于⽤更加简单轻量的⽅法设计和实现。值得注意的是 REST 并没有⼀个明确的标准,⽽更像是⼀种设计的⻛格。
它本身并没有什么实⽤性,其核⼼价值在于如何设计出符合 REST ⻛格的⽹络接⼝。
2.Restful 的优点
它结构清晰、符合标准、易于理解、扩展⽅便,所以正得到越来越多⽹站的采⽤。
3.Restful 的特性
资源 表现层 状态转移
(1)资源(Resources):⽹络上的⼀个实体,或者说是⽹络上的⼀个具体信息。
它可以是⼀段⽂本、⼀张图⽚、⼀⾸歌曲、⼀种服务,总之就是⼀个具体的存在。可以⽤⼀个 URI(统⼀资源定位符)指向它,每种资源对应⼀个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此URI 即为每⼀个资源的独⼀⽆⼆的识别符。
(2)表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。⽐如,⽂本可以⽤ txt 格式表现,也可以⽤ HTML 格式、XML 格式、JSON 格式表现,甚⾄可以采⽤⼆进制格式。
(3)状态转化(State Transfer):每发出⼀个请求,就代表了客户端和服务器的⼀次交互过程。
HTTP 协议,是⼀个⽆状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种⼿段,让服务器端发⽣“状态转化”(State Transfer)。⽽这种转化是建⽴在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议⾥⾯,四个表示操作⽅式的动词:GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET ⽤来获取资源,POST ⽤来新建资源,PUT ⽤来更新资源,DELETE ⽤来删除资源。
4.RESTful 的示例:
5.springmvc对rest风格的请求支持
springmvc对rest⻛格请求到底提供了怎样的⽀持:是⼀个注解的使⽤@PathVariable,可以帮助我们从uri中取出参数
get:
post:
put:
delete:
四、 Ajax Json交互
交互:两个⽅向
1)前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使⽤注解@RequstBody
2)后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使⽤注解@ResponseBody
所需依赖
<!--json数据交互所需jar,start-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!--json数据交互所需jar,end-->
五、拦截器(Inteceptor)
(1) 监听器、过滤器和拦截器对⽐
Servlet:处理Request请求和Response响应
过滤器(Filter):对Request请求起到过滤的作⽤,作⽤在Servlet之前,如果配置为/*可以对所有的资源访问(servlet、js/css静态资源等)进⾏过滤处理
监听器(Listener):实现了javax.servlet.ServletContextListener 接⼝的服务器端组件,它随Web应⽤的启动⽽启动,只初始化⼀次,然后会⼀直运⾏监视,随Web应⽤的停⽌⽽销毁
作⽤⼀:做⼀些初始化⼯作,web应⽤中spring容器启动ContextLoaderListener
作⽤⼆:监听web中的特定事件,⽐如HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控,⽐如统计在线⼈数,利⽤HttpSessionLisener等。
拦截器(Interceptor):是SpringMVC、Struts等表现层框架⾃⼰的,不会拦截jsp/html/css/image的访问等,只会拦截访问的控制器⽅法(Handler)。
从配置的⻆度也能够总结发现:serlvet、fifilter、listener是配置在web.xml中的,⽽interceptor是配置在表现层框架⾃⼰的配置⽂件中的:在Handler业务逻辑执⾏之前拦截⼀次、在Handler逻辑执⾏完毕但未跳转⻚⾯之前拦截⼀次、在跳转⻚⾯之后拦截⼀次
(2)拦截器的执⾏流程
在运⾏程序时,拦截器的执⾏是有⼀定顺序的,该顺序与配置⽂件中所定义的拦截器的顺序相关。 单个拦截器,在程序中的执⾏流程如下图所示:
1)程序先执⾏preHandle()⽅法,如果该⽅法的返回值为true,则程序会继续向下执⾏处理器中的⽅法,否则将不再向下执⾏。
2)在业务处理器(即控制器Controller类)处理完请求后,会执⾏postHandle()⽅法,然后会通过DispatcherServlet向客户端返回响应。
3)在DispatcherServlet处理完请求后,才会执⾏afterCompletion()⽅法。
(3)多个拦截器的执⾏流程
多个拦截器(假设有两个拦截器Interceptor1和Interceptor2,并且在配置⽂件中, Interceptor1拦截器配置在前),在程序中的执⾏流程如下图所示:
六、文件上传
引入依赖
<!--⽂件上传所需jar坐标-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
七、在控制器中处理异常
1.在controller中处理异常
2.全局捕获异常
八、基于Flash属性的跨重定向请求数据传递
九、手写迷你mvc框架
1.流程
十、源码分析
1.DispatcherSevlet继承结构
2.重要时机分析
SpringMVC处理请求的流程即为 :org.springframework.web.servlet.DispatcherServlet#doDispatch⽅法的执⾏过程,其中步骤2、3、4、5是核⼼步骤
1)调⽤getHandler()获取到能够处理当前请求的执⾏链 HandlerExecutionChain(Handler+拦截器);但是如何去getHandler的?
2)调⽤getHandlerAdapter();获取能够执⾏1)中Handler的适配器;但是如何去getHandlerAdapter的?
3)适配器调⽤Handler执⾏ha.handle(总会返回⼀个ModelAndView对象)
4)调⽤processDispatchResult()⽅法完成视图渲染跳转
3.核⼼步骤getHandler⽅法剖析
4.核⼼步骤getHandlerAdapter⽅法剖析
5.springmvc九大组件
(1)在DispatcherServlet中定义了九个属性,每⼀个属性都对应⼀种组件
(2)九⼤组件的初始化时机
DispatcherServlet中的onRefresh(),该⽅法中初始化了九⼤组件
initStrategies⽅法
观察其中的⼀个组件initHandlerMappings(context)
如果按照类型和按照固定id从ioc容器中找不到对应组件,则会按照默认策略进⾏注册初始化,默认策略在DispatcherServlet.properties⽂件中配置
6.核⼼步骤ha.handle⽅法剖析
入口
断点从⼊⼝进⼊
7.核⼼步骤processDispatchResult⽅法剖析
解析出View视图对象的过程中,要将逻辑视图名解析为物理视图名
把modelMap中的数据暴露到request域中,这也是为什么后台model.add之后在jsp中可以从请求域取出来的根本原因
十一、ssm整合
1.整合策略
2.Mybatis整合Spring
导入依赖包
创建dao层、service层
创建jdbc文件
创建spring配置文件
测试一下spring整合mybatis是否成功
3.整合springmvc
整合思路:把SpringMVC的⼊⻔案例整合进来即可(在已有⼯程基础之上开发⼀个SpringMVC⼊⻔案例)
导入依赖
创建controller
创建springmvc的配置文件
配置web.xml(注意要在这配置spring框架的启动)
controller撰写
测试成功
十二、springdatajpa
1.简介
Spring Data Jpa 是应⽤于Dao层的⼀个框架,简化数据库开发的,作⽤和Mybatis框架⼀样,但是在使⽤⽅式和底层机制是有所不同的。最明显的⼀个特点,Spring Data Jpa 开发Dao的时候,很多场景我们连sql语句都不需要开发。由Spring出品。
Spring Data JPA 是 Spring 基于JPA 规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常⽤功能!学习并使⽤Spring Data JPA 可以极⼤提⾼开发效率。
说明:Spring Data JPA 极⼤简化了数据访问层代码。
如何简化呢?使⽤了Spring Data JPA,我们Dao层中只需要写接⼝,不需要写实现类,就⾃动具有了增删改查、分⻚查询等⽅法。
使⽤Spring Data JPA 很多场景下不需要我们⾃⼰写sql语句
2.Spring Data JPA,JPA规范和Hibernate之间的关系
JPA 是⼀套规范,内部是由接⼝和抽象类组成的,Hiberanate 是⼀套成熟的 ORM 框架,⽽且Hiberanate 实现了 JPA 规范,所以可以称 Hiberanate 为 JPA 的⼀种实现⽅式,我们使⽤ JPA 的 API 编程,意味着站在更⾼的⻆度去看待问题(⾯向接⼝编程)。Spring Data JPA 是 Spring 提供的⼀套对 JPA 操作更加⾼级的封装,是在 JPA 规范下的专⻔⽤来进⾏数据持久化的解决⽅案。