博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMvc 框架阅读记录
阅读量:6458 次
发布时间:2019-06-23

本文共 4529 字,大约阅读时间需要 15 分钟。

  hot3.png

简介

springmvc 是spring框架的一个模块,springmvc和spring 无需通过中间整合层进行整合。springmvc是一个基于mvc的web框架。

MVC模式最早由在1978年提出,是(Xerox PARC)在20世纪80年代为程序语言发明的一种软件架构。MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:

  • 控制器(Controller)- 负责转发请求,对请求进行处理。
  • 视图(View) - 界面设计人员进行图形界面设计。
  • 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

 

MVC 在B/S 系统下的应用

 

SpringMVC框架

Spring Web MVC 是基于 Servlet API 设计的,它被部署到 Servlet 容器 中

 

DispatcherServlet (前端控制器)

WebApplicationContext 是根据自己的配置对普通的 ApplicationContext 进行扩展。

它有一个指向 ServletContext 容器和其相关联的 Servlet 的连接。

 

1> Web 系统读取 web.xml 文件

org.springframework.web.context.ContextLoaderListener
...
contextConfigLocation
/WEB-INF/applicationContext*.xml

 

2> ContextLoaderListener 寻找相应的 /WEB-INF/applicationContext*.xml 文件并加载

此时 Spring 创建一个 WebApplicationContext 对象,将其存储在 ServletContext 中。

注:可以通过下面的方法从 ServletContext 中获取当时的 WebApplicationContext。

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

 

Spring 容器分级

由下图可以看出 , DispatcherServlet 需要 WebApplicationContext。Web  ApplicationContext 一般 需要分级成 两级容器:一级是 Root WebApplicationContext,另一级是 Servlet WebApplicationContext 。前者被多个 servlet 共享,后者则是根据自己应用的 servlet 配置而来。

由图还可以看出,Root WebApplicationContext 与 Servlet WebApplicationContext  不是包含关系,只是存在引用。Servlet WebApplicationContext 引用 Root WebApplicationContext

 

注:不分级的话,只有一个 单独的 WebApplicationContext 也是足够的,则所有 beans 都要从 Root WebApplicationContext 中获取。

 

再结合具体代码去理解:

1)通过 web.xml 配置 ServletContext(Servlet 容器),包含 RootApplicationContext 根容器,前端控制器( Servlet WebApplicationContext 子容器)

org.springframework.web.context.ContextLoaderListener
contextConfigLocation
/WEB-INF/root-context.xml
// Root WebApplicationContext 根容器配置
app1
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/app1-context.xml
// Servlet WebApplicationContext 子容器配置
1
app1
/app1/*

2)引入了一个 前端控制器(包含一个 Servlet WebApplicationContext 子容器 )

import org.springframework.web.WebApplicationInitializer;public class MyWebApplicationInitializer implements WebApplicationInitializer {    @Override    public void onStartup(ServletContext container) {        XmlWebApplicationContext appContext = new XmlWebApplicationContext();        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));        registration.setLoadOnStartup(1);        registration.addMapping("/");    }}

3)引入了一个 前端控制器(包含一个 Servlet WebApplicationContext 子容器)

public class MyWebApplicationInitializer implements WebApplicationInitializer {    @Override    public void onStartup(ServletContext servletCxt) {        // Load Spring web application configuration        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();        ac.register(AppConfig.class);        ac.refresh();        // Create and register the DispatcherServlet        DispatcherServlet servlet = new DispatcherServlet(ac);        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);        registration.setLoadOnStartup(1);        registration.addMapping("/app/*");    }}

 

基本处理流程

上面的容器部署好了,下面开始 DispatcherServlet 处理请求:

用户发出请求 -> WebApplicationContext  绑定request 作为自己的一个属性,以便 Controller可以访问到。实际上也是绑定 request 到 Thread ->  locale resolver,theme resolver,multipart file resolver 依次绑定到 request ,让其决定使用哪个resolver -> 搜索合适的 handler 处理,执行链 preprocessors, postprocessors, and controllers,直接返回或填充 model -> 回收 model,渲染视图。

WebApplicationContext 上声明的 HandlerExceptionResolver 负责处理请求过程中的异常。

 

实际应用

HandlerMapping 可以实现 Interception 拦截器

  • preHandle(..) — before the actual handler is executed

  • postHandle(..) — after the handler is executed

  • afterCompletion(..) — after the complete request has finished

还支持 Filter(如 cors filter),这类 Filter 不包括在 servlet 中。注解 ,RestTemplate

 

参考资料

https://zh.wikipedia.org/wiki/MVC

https://spring.io/docs/reference

http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html

转载于:https://my.oschina.net/lemos/blog/790117

你可能感兴趣的文章
如何在线生成自己的短网址,可自定义域名 可统计点击数
查看>>
Oracle中的单行函数
查看>>
像在K8S集群中一样运行本地程序
查看>>
估算软件规模之前如何明确划分系统边界?
查看>>
Log4j 简介
查看>>
易改衣完成 5000 万 A 轮融资,唯品会战略投资
查看>>
Python零基础学习代码实践 —— 99乘法表
查看>>
同步异步阻塞非阻塞杂记
查看>>
python 目录
查看>>
2018年java技术面试题整理
查看>>
高并发架构系列:Kafka、RocketMQ、RabbitMQ的优劣势比较
查看>>
python实现归并算法
查看>>
【答疑】对象存储OSS常见问题解答(SDK类2)
查看>>
[雪峰磁针石博客]python 3.7极速入门教程1安装:Linux(Ubuntu 18.04)及Windows上安装Anaconda...
查看>>
Linux find并移动mv 14天前的文件
查看>>
redis zset底层数据结构
查看>>
对话CDN巨头Akamai:携手金山云,意欲何为?
查看>>
非零基础入门微信小程序
查看>>
怎么读 Tomcat 源码?
查看>>
win10下Linux子系统开启ssh服务
查看>>