SpringMVC

一、MVC是一种设计模式

MVC原理图

分析:

  1. M~Model 模型(完成业务逻辑:由javaBean构成,service+dao+entity)
  2. V~View 视图(做界面的展示 jsp,html……)
  3. C~Controller 控制器(接收请求—>调用模型—>根据结果派发页面)

二、SpringMVC是什么

SpringMVC是一个MVC的开源框架。SpringMVC和spring有什么样的关系呢?百度百科上有一个很好的解释:SpringMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),常说SpringMVC与spring无缝集成,其实SpringMVC就是spring的一个子模块,所以根本不需要同spring进行整合。

SpringMVC的解析图:

SpringMVC的原理图

这里主要理解springMVC中的几个组件:

前端控制器(DispatcherServlet):整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。相当于电脑的CPU。

处理器映射器(HandlerMapping):根据URL去查找处理器。通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

处理器(Handler):即后端控制器,用controller表示。(需要程序员去写代码处理逻辑的)

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)

视图解析器(ViewResovler):进行视图解析,多返回字符串,进行处理,可以解析成对应的页面,展示给用户。视图中通常需要标签语言展示模型数据。支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。(需要程序员去写代码处理逻辑的)

三、SpringMVC工作原理

SpringMVC工作原理图

SpringMVC工作原理

SpringMVC流程

  1. 用户发送请求至前端控制器DispatcherServlet。

  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。

  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  4. DispatcherServlet调用HandlerAdapter处理器适配器。

  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

  6. Controller执行完成返回ModelAndView。

  7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。

  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

  9. ViewReslover解析后返回具体View。

  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

  11. DispatcherServlet响应用户。

组件说明:

  1. 前端控制器DispatcherServlet(不需要工程师开发),由框架提供
    作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
    用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

  2. 处理器映射器HandlerMapping(不需要工程师开发),由框架提供
    作用:根据请求的url查找Handler
    HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  3. 处理器适配器HandlerAdapter
    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

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

  5. 视图解析器View resolver(不需要工程师开发),由框架提供
    作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。SpringMVC框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
    一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

  6. 视图View(需要工程师开发jsp…)
    View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

核心架构的具体流程步骤如下:

  1. 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象【包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器对象】。通过这种策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  4. HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
  5. ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
  6. View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
  7. 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

四、Spring MVC 的优点

  1. 它是基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是组件,并且和 Spring 提供的其他基础结构紧密集成。
  2. 不依赖于 Servlet API(目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)。
  3. 可以任意使用各种视图技术,而不仅仅局限于 JSP。
  4. 支持各种请求资源的映射策略。
  5. 它应是易于扩展的。

五、SpringMVC 的控制器是不是单例模式?如果是有什么问题,怎么解决?

答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的。解决方案是在控制器里面不能写字段。

六、SpingMVC 中的控制器的注解一般用哪个,有没有别的注解可以替代?

答:一般用@Conntroller 注解,表示是控制层,该注解表明该类扮演控制器的角色。不能用别的注解代替。

七、 @RequestMapping 注解用在类上面有什么作用?

答:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中响应请求的方法都是以该地址作为父路径。

八、怎么样把某个请求映射到特定的方法上面?

答:直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径。

九、怎么配置,才能在拦截请求中拦截 get 方式提交的方法?

答:可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

十、怎么样在方法里面得到 Request或者 Session?

答:直接在方法的形参中声明 request,SpringMVC 就自动把 request 对象传入了。

十一、怎么在拦截的方法里面得到从前台传入的参数?

答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。

十二、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这象?

答:直接在方法中声明这个对象,SpringMVC 就自动会把属性赋值到这个对象里面。

十三、SpringMVC 中函数的返回值是什么?

答:返回值可以有很多类型,有 String、ModelAndView。一般用 String 比较好。

十四、SpringMVC 怎么样设定转发和重定向的?

  • 在返回值前面加"forward:"就可以让结果转发,比如"forward:user.do?name=method4"
  • 在返回值前面加"redirect:"就可以让返回值重定向,比如"redirect:百度一下,你就知道"

十五、SpringMVC 用什么对象从后台向前台传递数据的?

答:通过 ModelMap 对象,可以在这个对象里面用 put 方法,把对象加到里面,前台就可以过 el 表达式拿到。

十六、SpringMVC 中有个类把视图和数据都合并的一起的,叫什么?

答:叫 ModelAndView。

十七、怎么样把 ModelMap 里面的数据放入Session 里面?

答:可以在类上面加上@SessionAttributes 注解,里面包含的字符串就是要放入 session 的 key。

十八、SpringMVC 怎么和 AJAX 相互调用的?

答:通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。具体步骤如下 :

  1. 加入 Jackson.jar
  2. 在配置文件中配置 json 的映射
  3. 在接受 Ajax 方法里面可以直接返回 Object、List 等,但方法前面要加上@ResponseBody注解

十九、当一个方法向 AJAX 返回特殊对象,比如 Object、List 等,需要做什么处理?

答:要加上@ResponseBody 注解

二十、SpringMVC 拦截器是怎么写的?

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

推荐阅读更多精彩内容