Spring 学习笔记(3)Spring MVC
一、什么是 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的更多相关文章
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- Spring学习笔记之五----Spring MVC
Spring MVC通常的执行流程是:当一个Web请求被发送给Spring MVC Application,Dispatcher Servlet接收到这个请求,通过HandlerMapping找到Co ...
- Spring学习笔记之Spring概述
概述 Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
- Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式
本节主要内容: 1. 给MessageBean注入参数值 2. 测试Spring自动组件扫描方式 3. 如何控制ExampleBean实例化方式 4. 使用注解方式重构Jdb ...
- Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入
本节主要内容: 1.实例化Spring容器示例 2.利用Spring容器创建JavaBean对象 3.如何控制Bean实例化 4.利用Spring实现bean属性sett ...
- spring学习笔记之spring框架本质
Spring框架的本质是,开发者在Spring配置文件中使用XML元素进行配置,实际驱动Spring执行相应的代码: 使用<bean.../>元素,实际启动Spring执行无参或有参构造函 ...
- Spring学习笔记2:Spring HelloWorld
1:IntelliJ新建Maven工程 2:pom文件加入Spring依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction
1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...
随机推荐
- 关于mysql集群主从服务器搭建
在高并发流量下,数据库往往是服务端的瓶颈,由于数据库数据需要确保落地,同时保证数据同步,数据即时性,有效性的问题,导致数据库不能像平常后端程序一样负载均衡. 那么在大并发下,该如何缓解数据库的压力呢? ...
- androidstudio创建第一个so文件
前言:之前看安卓软件安全与逆向分析这书,看到ndk开发这节,发现自己连so文件都没编译操作过233,所以就直接上手试试, 感觉挺好玩的,把关键的加密流程都放进so中去实现,这周先写个demo试试,感觉 ...
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 取球博弈
2012年第三届蓝桥杯C/C++程序设计本科B组省赛 取球博弈 题目描述 **取球博弈 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并 ...
- Rust 与 Golang - 何时使用它们?
[转自 Fizer Khan的<Rust Vs Golang - When to use them?>(翻译)] 在过去的十年中,Rust 和 Go 两种新的编程语言主要为企业开发而开发和 ...
- 青蛙跳台阶问题(斐波那契数列) python
一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法 class Solution: def jump(self,n): if n ==0: return 0 el ...
- 各种学位&不同学段的表达
1.学士 B.S.=Bachelor of Science 2.硕士 Master MA.Sc(master of Science科学硕士) MA.Eng(master of engineer ...
- Apache Flink目录遍历(CVE-2020-17519)
1.漏洞描述 2021年1月5日,Apache Flink官方发布安全更新,修复了由蚂蚁安全非攻实验室发现提交的2个高危漏洞,漏洞之一就是Apache Flink目录遍历漏洞(CVE-2020-175 ...
- python 得到字典的所有键 和值
a={} a={"a":1,"b":2,"c":3,"d":4} print(a) print(a.items()) p ...
- mysql:insert replace
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for key ...
- 微信小程序云开发-云存储-上传、下载、打开文件文件(word/excel/ppt/pdf)一步到位
一.wxml文件 <!-- 上传.下载.打开文件一步执行 --> <view class="handle"> <button bindtap=&quo ...