Hello,今天给各位童鞋们分享Spring MVC,赶紧拿出小本子记下来吧!
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请求处理流程
流程说明:
第⼀步:⽤户发送请求⾄前端控制器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请求)
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 拦截器的执⾏流程
1)程序先执⾏preHandle()⽅法,如果该⽅法的返回值为true,则程序会继续向下执⾏处理器中的⽅
法,否则将不再向下执⾏。
2)在业务处理器(即控制器Controller类)处理完请求后,会执⾏postHandle()⽅法,然后会通过
DispatcherServlet向客户端返回响应。
3)在DispatcherServlet处理完请求后,才会执⾏afterCompletion()⽅法。
1.1.3 多个拦截器的执⾏流程
执行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属性,不需要我们⼿动删除,通过这种⽅式进⾏重定向参数传递,
参数⻓度和安全性都得到了保障,如下:
第三部分 ⼿写 MVC 框架
SpringMVC执行的大致原理如下:
根据上面的分析,手动实现每一个步骤即可。
主要关注第三步和第四步:
第四部分 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依赖
applicationContext-dao.xml
applicationContext-service.xml
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"/>
web.xml
第六部分 Spring Data JPA
1.1 Spring Data JPA 概述
Spring Data JPA 是 Spring 基于JPA 规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的
代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常⽤功能!学习并使⽤
Spring Data JPA 可以极⼤提⾼开发效率
1.2 Spring Data JPA, JPA规范和Hibernate之间的关系
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层接口:
1.4 实现原理
和Mybatis一样也是基于JDK动态代理实现(Spring AOP中JDK动态代理的实现)。
好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们