全到哭!阿里P8大佬最新推出王者笔记:“Spring MVC实战+源码”

204 阅读6分钟

Hello,今天给各位童鞋们分享Spring MVC,赶紧拿出小本子记下来吧!

image.png

1.1 Spring MVC 简介

1.1.1 MVC 体系结构

  • 表现层,处理web请求

  • 业务层,处理业务逻辑

  • 持久层,数据持久化

MVC设计模式

  • Model(模型),模型包含业务模型和数据模型,数据模型⽤于封装数据,业务模型⽤于处理业务。

  • View(视图),通常指的就是我们的 jsp 或者 html。作⽤⼀般就是展示数据的。通常视图是依据模型数据创建的。

  • Controller(控制器): 是应⽤程序中处理⽤户交互的部分。作⽤⼀般就是处理程序逻辑的。

MVC提倡:每⼀层只编写⾃⼰的东⻄,不编写任何其他的代码;分层是为了解耦,解耦是为了维

护⽅便和分⼯协作。

1.1.2 SpringMVC介绍

SpringMVC 全名叫 Spring Web MVC,是⼀种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级Web 框架。

Spring MVC 本质可以认为是对servlet的封装,简化了我们serlvet的开发。

1.2 SpringMVC请求处理流程

image.png 流程说明:

第⼀步:⽤户发送请求⾄前端控制器DispatcherServlet

第⼆步: DispatcherServlet收到请求调⽤HandlerMapping处理器映射器

第三步:处理器映射器根据请求Url找到具体的Handler(后端控制器),⽣成处理器对象及处理器拦截

器(如果 有则⽣成)⼀并返回DispatcherServlet

第四步: DispatcherServlet调⽤HandlerAdapter处理器适配器去调⽤Handler

第五步:处理器适配器执⾏Handler

第六步: Handler执⾏完成给处理器适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回 ModelAndView, ModelAndView 是SpringMVC 框架的⼀个

底层对 象,包括 Model 和 View

第⼋步:前端控制器请求视图解析器去进⾏视图解析,根据逻辑视图名来解析真正的视图。

第九步:视图解析器向前端控制器返回View

第⼗步:前端控制器进⾏视图渲染,就是将模型数据(在 ModelAndView 对象中)填充到 request 域

第⼗⼀步:前端控制器向⽤户响应结果

1.3 参数绑定

注册自定义类型转换器:

<mvc:annotation-driven conversionservice="conversionServiceBean"/>

<bean id="conversionServiceBean"

class="org.springframework.format.support.FormattingConversionServiceF

actoryBean">

1.4 RESTful支持

Restful 是⼀种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是⼀个资源定位及资源操作的⻛格。

/account/1 HTTP GET :得到 id = 1 的 account

/account/1 HTTP DELETE:删除 id = 1 的 account

/account/1 HTTP PUT:更新 id = 1 的 account

依赖注解@PathVariable

form表单只支持get和post,对于post如何支持put和delete呢?

答:web.xml中配置请求⽅式过滤器(将特定的post请求转换为put和delete请求)

image.png

1.5 和Ajax Json交互

交互:两个⽅向1)前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使⽤注解@RequstBody2)后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使⽤注解@ResponseBody

默认使用jackson序列化和反序列化。

第⼆部分 Spring MVC ⾼级技术

1.1 拦截器(Inteceptor)使⽤

1.1.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)。

1.1.2 拦截器的执⾏流程

image.png 1)程序先执⾏preHandle()⽅法,如果该⽅法的返回值为true,则程序会继续向下执⾏处理器中的⽅

法,否则将不再向下执⾏。

2)在业务处理器(即控制器Controller类)处理完请求后,会执⾏postHandle()⽅法,然后会通过

DispatcherServlet向客户端返回响应。

3)在DispatcherServlet处理完请求后,才会执⾏afterCompletion()⽅法。

1.1.3 多个拦截器的执⾏流程

image.png 执行preHandler()是顺序执行,执行postHandle()⽅法和afterCompletion()是逆序执行。

1.2 处理multipart形式的数据

配置⽂件上传解析器:

<bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

后台接受参数使用MultipartFile

1.3 在控制器中处理异常

@ControllerAdvice+@ExceptionHandler(ArithmeticException.class)

@ControllerAdvice

public class GlobalExceptionResolver {

@ExceptionHandler(ArithmeticException.class)

public ModelAndView handleException(ArithmeticException exception,

HttpServletResponse response) {

ModelAndView modelAndView = new ModelAndView();

modelAndView.addObject("msg",exception.getMessage());

modelAndView.setViewName("error");

return modelAndView;

}

}

1.4 重定向请求参数传递

重定向时请求参数会丢失,我们往往需要重新携带请求参数,我们可以进⾏⼿动参数拼接如下:

return "redirect:handle01?name=" + name;

但是上述拼接参数的⽅法属于get请求,携带参数⻓度有限制,参数安全性也不⾼,此时,我们可以使

⽤SpringMVC提供的flash属性机制,向上下⽂中添加flash属性,框架会在session中记录该属性值,当

跳转到⻚⾯之后框架会⾃动删除flash属性,不需要我们⼿动删除,通过这种⽅式进⾏重定向参数传递,

参数⻓度和安全性都得到了保障,如下:

image.png

第三部分 ⼿写 MVC 框架

SpringMVC执行的大致原理如下:

image.png 根据上面的分析,手动实现每一个步骤即可。

主要关注第三步和第四步:

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

第四部分 Spring MVC 源码深度剖析

SpringMVC处理请求的流程即为

org.springframework.web.servlet.DispatcherServlet#doDispatch⽅法的执⾏过程,其中步骤

2、 3、 4、 5是核⼼步骤

1)调⽤getHandler()获取到能够处理当前请求的执⾏链 HandlerExecutionChain(Handler+拦截

器)

2)调⽤getHandlerAdapter();获取能够执⾏1)中Handler的适配器

3)适配器调⽤Handler执⾏ha.handle(总会返回⼀个ModelAndView对象)

4)调⽤processDispatchResult()⽅法完成视图渲染跳转

第五部分 SSM 整合

1.1 Mybatis整合Spring

pom依赖

image.png applicationContext-dao.xml

image.png applicationContext-service.xml

image.png

1.2 整合SpringMVC

pom文件

springmvc.xml

<beans xmlns="www.springframework.org/schema/bean…"

xmlns:context="www.springframework.org/schema/cont…"

xmlns:mvc="www.springframework.org/schema/mvc"

xmlns:xsi="www.w3.org/2001/XMLSch…"

xsi:schemaLocation="www.springframework.org/schema/bean…

www.springframework.org/schema/bean…

www.springframework.org/schema/cont…

www.springframework.org/schema/cont…

www.springframework.org/schema/mvc

www.springframework.org/schema/mvc/…

">

<context:component-scan base-package="com.lagou.edu.controller"/>

mvc:annotation-driven/

web.xml

image.png

第六部分 Spring Data JPA

1.1 Spring Data JPA 概述

Spring Data JPA 是 Spring 基于JPA 规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的

代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常⽤功能!学习并使⽤

Spring Data JPA 可以极⼤提⾼开发效率

1.2 Spring Data JPA, JPA规范和Hibernate之间的关系

image.png Spring Data JPA是基于Hibernate来实现的。

1.3 Spring Data JPA 应⽤

1.3.1 接入Spring Data JPA

pom文件

junit

junit

4.12

test

org.springframework.data

spring-data-jpa

2.1.8.RELEASE

javax.el

javax.el-api

3.0.1-b04

org.glassfish.web

javax.el

2.2.6

org.springframework

spring-aop

5.1.12.RELEASE

org.aspectj

aspectjweaver

1.8.13

org.springframework

spring-context

5.1.12.RELEASE

org.springframework

spring-context-support

5.1.12.RELEASE

org.springframework

spring-orm

5.1.12.RELEASE

org.springframework

spring-beans

5.1.12.RELEASE

org.springframework

spring-core

5.1.12.RELEASE

org.hibernate

hibernate-core

5.4.0.Final

org.hibernate

hibernate-entitymanager

5.4.0.Final

org.hibernate

hibernate-validator

5.4.0.Final

mysql

mysql-connector-java

5.1.46

com.alibaba

druid

1.1.21

org.springframework

spring-test

5.1.12.RELEASE

spring配置文件

<beans xmlns="www.springframework.org/schema/bean…"

xmlns:context="www.springframework.org/schema/cont…"

xmlns:jpa="www.springframework.org/schema/data…"

xmlns:xsi="www.w3.org/2001/XMLSch…"

xsi:schemaLocation="

www.springframework.org/schema/bean…

www.springframework.org/schema/bean…

www.springframework.org/schema/cont…

www.springframework.org/schema/cont…

www.springframework.org/schema/data…

www.springframework.org/schema/data…

">

<context:property-placeholder

location="classpath:jdbc.properties"/>

class="com.alibaba.druid.pool.DruidDataSource">

<bean id="entityManagerFactory"

class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"

<property name="packagesToScan"

value="com.lagou.edu.pojo"/>

<bean

class="org.hibernate.jpa.HibernatePersistenceProvider">

<bean

class="org.springframework.orm.jpa.vendor.HibernateJpaDialect">

<bean

class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

<property name="databasePlatform"

value="org.hibernate.dialect.MySQLDialect"/>

<jpa:repositories base-package="com.lagou.edu.dao" entity-managerfactory-ref="entityManagerFactory"

transaction-manager-ref="transactionManager"/>

<bean id="transactionManager"

class="org.springframework.orm.jpa.JpaTransactionManager">

<context:component-scan base-package="com.lagou.edu"/>

注意:

对于事务管理器,spring jdbcTemplate、mybatis 使⽤的是DataSourceTransactionManager;spring data jpa使用的是JpaTransactionManager;hibernate使用的是HibernateTransactionManager。

这三个事务管理器都是Spring 事务管理器接口PlatformTransactionManager接口的实现。

1.3.2 基本使用

实体类:

使用到的ORM注解:@Entity、@Table(name = “tb_resume”)、@Id、@GeneratedValue(strategy = GenerationType.IDENTITY)、@Column(name = “id”)

Dao层接口:

image.png

1.4 实现原理

和Mybatis一样也是基于JDK动态代理实现(Spring AOP中JDK动态代理的实现)。

好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们