Spring MVC 原理总结

MVC设计思想:

基于java的web 应用系统采用的mvc架构模式,即model(模型),view(视图),controller(控制器)分离设计
Model 即处理业务逻辑的模块, 每一种处理一个模块
View负责页面显示,显示Model处理结果给用户,主要实现数据到页面转换过程
Controller负责每个请求的分发,把Form数据传递给Model处理,把处理结果的数据传递给View

1. 什么是MVC?

MVC是一种架构模式 --- 程序分层,分工合作,既相互独立,又协同工作
MVC核心思想:业务数据抽取同业务数据实现相分离
总结:
模型层(M) :业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合;
视图层(V): 为用户提供UI,重点关注数据的呈现;
控制器(C) : 相当于一个总调配中心,接受用户请求,并调用相应的模型处理最后通过视图给用户进行展示);

MVC(Model-View-Controller)设计思想

即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

视图(View)代表用户交互界面;

模型(Model):就是业务流程/状态的处理以及业务规则的制定。
  业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。

控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求.

MVC的优点

大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。


2 什么是springMVC?

springMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等)。

为什么要用springMVC?

基本上,框架的作用就是用来简化编程的,相对于servlet来说,获取表单参数,响应请求等变得更简单了。

SpringMVC 工作流出图:

springmvc的工作机制

在容器初始化时会建立所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化容器(加载bean的定义信息和初始化所有单例bean),然后springmvc会遍历容器中的bean,获取每一个controller中的所有方法访问的url,然后将url和controller保存到一个Map中;

这样就可以根据request快速定位到controller,因为最终处理request的是controller中的方法,Map中只保留了url和controller中的对应关系,所以要根据request的url进一步确认controller中的method,这一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法;

确定处理请求的method后,接下来的任务就是参数绑定,把request中参数绑定到方法的形式参数上,这一步是整个请求处理过程中最复杂的一个步骤。springmvc提供了两种request参数与方法形参的绑定方法:

① 通过注解进行绑定,@RequestParam

② 通过参数名称进行绑定.使用注解进行绑定,我们只要在方法参数前面声明@RequestParam("a"),就可以将request中参数a的值绑定到方法的该参数上.使用参数名称进行绑定的前提是必须要获取方法中参数的名称,Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法.springmvc解决这个问题的方法是用asm框架读取字节码文件,来获取方法的参数名称.asm框架是一个字节码操作框架,关于asm更多介绍可以参考它的官网.个人建议,使用注解来完成参数绑定,这样就可以省去asm框架的读取字节码的操作.

springMVC流程

  1. 用户发送请求至前端控制器DispatcherServle
    注:DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户(分发调度);相当于中央处理器,是整个流程控制的中心,有了dispatcherServlet减少了其它组件之间的耦合度。

  2. 前端控制器(DispatcherServlet): 用户请求到达前端控制器,dispatcherServlet调用HandlerMapping(处理器映射器)。

3 处理器映射器(HandlerMapping) :前端控制器根据用户的url,请求处理器映射器(HandlerMapping)查找匹配该url的handler,并返回一个执行链(HandlerExecutionChain)。

*4 前端控制器收到HandlerMapping返还的Handler信息后,再请求处理器适配器(HandlerAdapter)调用相应的handler进行处理并返回给前端控制器一modelAndView。

处理器适配器(HandlerAdapter): HandlerAdapter根据DispatcherServlet 发来的handler信息找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  • 处理器-Handler:Handler 是后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    (由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler;编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler)。

5 前端控制器拿到modelAndView之后,再请求视图解析器(ViewResolver)进行解析。

  • 视图解析器View resolver: 负责将处理结果生成View视图。
    (View Resolver首先根据逻辑视图名,解析成物理视图名(具体的页面地址),再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等)

6 最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。* 视图View**(需要工程师开发) : View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

为什么叫前端控制器?前端又是什么?

举个例子:假如你去医院看病,通过向分诊台的医院描述自己的病情,就可以得到医生的指导具体去看外科、内科或者神经科等等,这里我们的分诊台就扮演着前端控制器(Dispatcher)的角色,也叫做调度器,而各个科室就扮演着控制器(Controller)的角色,因为分诊台是在具体各个科室之前,所以这个模式就叫做前端控制器。


3 说说spring mvc中常用注解有哪些,分别什么作用?

@Controller标识这个类是一个控制器
@RestController= @Controller+ @ResponseBody
@Autowired 根据SpringMVC的依赖注入通过包扫描自动注入
@Resource 根据SpringMVC的依赖注入通过配置文件注入
@Service 用来声明业务层
@RequestMapping给控制器方法绑定一个uri/ 用来定义访问接口,可以在类名和方法上使用
@ResponseBody将java对象转成json,并且发送给客户端
@RequestBody将客户端请求过来的json转成java对象
@RequestParam当表单参数和方法形参名字不一致时,做一个名字映射
@PathVarible用于获取uri中的参数,比如user/1中1的值
Rest风格的新api
@GetMapping@DeleteMapping@PostMapping@PutMapping
其他注解
@SessionAttribute声明将什么模型数据存入session
@CookieValue获取cookie值
@ModelAttribute将方法返回值存入model中
@HeaderValue获取请求头中的值

4 如何在spring mvc实现RESTful 服务

1,导入jackson2包
2,开启注解驱动<mvc:annotation-driven/>
3,json交互=@RequestBody @ResponseBody

5 WebService如何与客户端交互

① webServices通过SOAP协议进行参数的接收与返回值的传递。
② SOAP协议在web上提供软件服务,使用WSDL文件进行说明,通过UDDI进行注册
③ WSDL文件是一个XML文档,用于说明一组SOAP消息以及如何交换这些信息,大多数情况下由软件自动生成和使用
④ XML是一种扩展型可标记语言,面向短期临时数据和万维网络。
⑤ UDDI是一个主要针对web服务供应商和使用者的项目,在用户能够调用web服务之前,必须确定这个服务包含哪些商务方法,找到被调用的接口定义,还要服务端来编制软件;UDDI是一种根据描述文章来引导系统查找响应服务的机制,UDDI利用SOAP消息机制来发布、编译、浏览及查找注册信息,它采用XML格式来封装各种不同类型的数据,并且发送到注册中心来返回需要的数据。

6 什么是拦截器?有什么用?spring mvc如何定义拦截器?

what:
类似于filter的一个对象,用于预处理以及后处理处理器(控制器)。
how:
新建class实现HandlerInterceptor重写三个方法:
preHandler
postHandler
afterCompletion
springmvc.xml中配置拦截器

7 springMVC与struts2的区别

一、拦截机制的不同
  Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter把request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。

SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。
二、底层框架的不同
  Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。
三、性能方面
  Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。
四、配置方面
  spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

8 .拦截器和过滤器的区别

① 拦截器inteceptor是基于java的反射机制实现的;
过滤器Filter是基于函数回调实现(filter接口中的doFilter方法是回调函数实现的)
② 拦截器不依赖于servlet容器;
过滤器filter依赖servlet,没有servlet无法回调doFilter
③ 拦截器只能对action请求起作用;
而filter可以对所有请求起作用,filter过滤范围比拦截器大
④ 拦截器可以访问action上下文,值栈里的对象;
而过滤器filter不能;
⑤ 在action的生命周期中,拦截器可以多次被调用;
而过滤器只能在容器初始化时被调用一次;
⑥ 拦截器可以获取IOC容器中的各个bean,而过滤器不行;


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • SpringMVC的工作原理图: SpringMVC的工作原理图: SpringMVC流程 1、 用户发送请求至前...
    我不饿我不想吃东西阅读 844评论 0 1
  • 前言 对于Spring MVC项目搭建相信大家按照网上教程来做基本都会,但更多时候我们应该多问几个为什么,多思考实...
    九风萍舟阅读 2,743评论 0 12
  • 1.Spring背景 1.1.Spring四大原则: 使用POJO进行轻量级和最侵入式开发; 通过依赖注入和基于借...
    嗷大彬彬阅读 782评论 0 2
  • 一 什么是spring mvc springMVC是spring框架的一个模块,springMVC和spring无...
    敲程序的人生阅读 190评论 0 1
  • 暗时间简单的说就是思维的时间,也就是没有产生直接成果的时间。一个人走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、...
    不爱下雨天阅读 275评论 0 0