一、什么是 MVC

MVC 实际上就是一种设计模式 Model-View-Controller

  • Model 模型其实就是数据,Dao,Bean 等等
  • View 视图就是所看到的东西,网页,JSP,展示模型中的数据,包括数据逻辑的处理和数据操作(数据库中存取数据)
  • Controller 控制器就是将不同的数据(Model)显示在不同的视图(View)上

1. Model1 时代

它是在 JSP + Bean (Model + View) 基础上升级演变过来的,称之为 Model1,相对于 MVC 而言,它是将 Controller 和 View 两者结合在一起。前后端高度耦合,代码难以复用

正是因此,MVC 随之抽象出来,形成了 Servlet + JSP + JavaBean 的新开发模式

2. Model2 时代

这时,将 JSP 中的控制功能抽象提取出来,形成 Servlet ,用于处理用户的数据请求。

大大的提高了代码的可重用性,三个模块相互独立,降低了各模块的耦合度。

二、什么是 SpringMVC

SpringMVC 是 Spring 的一个子项目,它其实是为三层架构中的表示层开发提供的一整套完备的解决方案

三层架构分为表示层、业务逻辑层、数据访问层。表示层主要表示出前台页面和后台 servlet

优点:

  • 基于原生的 Servlet, 通过了功能强大的前端控制器 DispatcherServlet,对请求和响应进行统一处理
  • 代码清新简洁,而且是插拔式组件即插即用
  • 性能卓著,适合大型互联网项目要求

问题:MVC 和 三层架构的区别?

这里引用一下回答,原地址在这

其实它们相同的地方在于他们都有一个表现层。

但是他们不同的地方在于其他的两个层。

首先先解释一下MVC。V即View.是视图的意思。C即Controler.是控制器的意思。而M即Model,是模型的意思。这三个里.最不容易理解的应该是Model.就是什么是Model,而为什么叫Model。我先不说为什么叫Model,先解释Controler。

Controller是控制器的意思,所谓控制器,就是将用户请求转发给模型层,经过处理后把结果返回到界面展现的一个中间层,那么Controler到底管什么工作呢?先不说.先来看下在Java Web中这三个层一般的定义,一般在Java Web里,JSP充当V,Servlet充当C,JavaBean充当M,这里的Servlet管什么工作呢?接受输入,转到Model层去处理,处理结果保存后转发到JSP,然后展现数据。所以它的功能就是控制器的基本功能,它就管转发,在V和M之间转来转去。

再来说说M,即Model,在Java Web里说的是JavaBean,我认识的很多人都把JavaBean误认为是实体类,其实JavaBean有比实体类更丰富的定义,在JavaBean中除了其属性和字段,还可以有行为及其事件,JavaBean可以理解为普通Java对象。Java普通对象,就是符合Java规范的所有对象,这和实体类完全是两回事。所以,我认为在MVC中。业务逻辑和数据访问应该放在Model层,也就是V负责展示数据,Controler除了转发不做业务逻辑。真正的逻辑事务,数据访问,甚至算法都放到Model去。

再说三层架构。三层其实很好理解,界面,业务,数据访问,就这三个,从字面都可以理解出它们的意思。我要说的是它和MVC的区别。在三层架构中没有定义Controler的概念。这是我认为最不同的地方。而MVC也没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。

当然了。在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是已实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。不一样的概念。虽然名字一样

三、利用一个 HelloSpringMVC 程序来跟踪 SpringMVC 的请求过程

先看看 SpringMVC 的请求过程:

1. HTTP 请求到 DispatcherServlet

用户发起一个 Request 请求,这个请求会到达 DispatcherServlet ,经过相应的处理传送到对应的 Handler 处理器(Controller)。首先查看对应的 web.xml 文件的 Servlet 部分代码:

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--拦截所有的请求,将这些请求发送给 Spring MVC 控制器-->
<url-pattern>/</url-pattern>
</servlet-mapping>

2. DispatcherServlet 请求处理器映射器,查找对应的控制器

将 3, 4 ,5 步骤合起来讲,这一部分我们先看 dispatcher-servlet.xml 文件中的内容:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
<prop key="/hello">helloController</prop>
</props>
</property>
</bean>
<bean id="helloController" class="controller.HelloController"></bean>
</beans>

处理器映射器会通过在浏览器中输入的 URL 信息返回一个执行链,然后 HandlerAdapter 根据执行链中的 Handler 的信息找到对应的 Handler 。比如我们在输入框输入https://localhost:8080/hello 处理器映射器则会对应将这个信息传送给 HelloController 控制器进行处理。

后期可以用注解来代替这种方式。

3. Handler 处理器

对应 6,7 步骤,这一部分就是我们常见的 Controller 代码,处理相应的逻辑。

public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView("index.jsp");
modelAndView.addObject("message", "Hello SpringMVC");
return modelAndView;
}
}

在处理完会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息), HandlerAdapter 会继续将这个对象返回给 DispatcherServlet 。

4. ViewResolver 视图解析器

这部分对应 8,9 步骤 DispatcherServlet 会将接收到的 ModelAndView 传递给 ViewResolver , 让其对该对象进行解析,并且根据 View 信息匹配到相应的视图结果,并将 View 返回给 DispatcherServlet 。

注意,这里传递的仅仅是一个逻辑名称,这个名称将会用来查找产生结果的真正视图

也就是这一行代码

ModelAndView modelAndView = new ModelAndView("index.jsp");

5. View 视图

DispatcherServlet 根据接收到的 View 视图,对视图进行渲染,并且将 Model 中的模型数据填充到 View 视图中的 request 域中,生成最终的视图 View。视图将这些结果显示到浏览器中。

Spring 学习笔记(3)Spring MVC的更多相关文章

  1. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  2. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  3. Spring 学习笔记(2) Spring Bean

    一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...

  4. Spring学习笔记之五----Spring MVC

    Spring MVC通常的执行流程是:当一个Web请求被发送给Spring MVC Application,Dispatcher Servlet接收到这个请求,通过HandlerMapping找到Co ...

  5. Spring学习笔记之Spring概述

    概述   Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

  6. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  7. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  8. spring学习笔记之spring框架本质

    Spring框架的本质是,开发者在Spring配置文件中使用XML元素进行配置,实际驱动Spring执行相应的代码: 使用<bean.../>元素,实际启动Spring执行无参或有参构造函 ...

  9. Spring学习笔记2:Spring HelloWorld

    1:IntelliJ新建Maven工程 2:pom文件加入Spring依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  10. [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...

随机推荐

  1. [转载]API网关

    1. 使用API网关统一应用入口 API网关的核心设计理念是使用一个轻量级的消息网关作为所有客户端的应用入口,并且在 API 网关层面上实现通用的非功能性需求.如下图所示:所有的服务通过 API 网关 ...

  2. Blazor 数据绑定开发指南

    翻译自 Waqas Anwar 2021年3月21日的文章 <A Developer's Guide to Blazor Data Binding> [1] 现如今,大多数 Web 应用程 ...

  3. 『与善仁』Appium基础 — 2、常用Android模拟器的安装

    目录 1.Android Virtual Devices模拟器 2.Genymotion模拟器 (1)Genymotion模拟器下载 (2)模拟器Genymotion安装 (3)Genymotion模 ...

  4. python 读注册表 检测NET版本

    from winreg import * import re def subRegKey(key, pattern, patchlist): # 个数 count = QueryInfoKey(key ...

  5. Java基础00-IDEA8

    1. IDEA概述和安装 https://www.jetbrains.com/idea/ 2. IDEA中的HelloWord 2.1 IDEA中HelloWord步骤 3. IDEA的项目结构 3. ...

  6. 【论文阅读】Motion Planning through policy search

    想着CSDN还是不适合做论文类的笔记,那里就当做技术/系统笔记区,博客园就专心搞看论文的笔记和一些想法好了,[]以后中框号中间的都算作是自己的内心OS 有时候可能是问题,有时候可能是自问自答,毕竟是笔 ...

  7. 解决clipboard.js在移动端复制失败的问题

    1.前沿 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能.功能做好后,一开始无论这pc端还是移动端都能正常使用.突然某一天测出了一个bug:移动端复制失败,pc端是 ...

  8. 微信小程序云开发-云存储-上传单张照片到云存储并显示到页面上

    一.wxml文件 页面上写上传图片的按钮,按钮绑定chooseImg. <button bindtap="chooseImg" type="primary" ...

  9. THE MINTO PYRAMID PRINCIPLE

    金字塔原理:(重点突出,逻辑清晰.层次分明,简单易懂的思考方式.沟通方式.规范的动作.) 结构:结论先行,以上统下,归类分组,逻辑递进.先重要后次要,先总结后具体,先框架后细节,先结论后原因,先结果后 ...

  10. ES6 属性方法简写一例:vue methods 属性定义方法

    const o = { method() { return "Hello!"; } }; // 等同于 const o = { method: function() { retur ...