什么叫MVC,Spring里对应的MVC分别是什么,是怎么收到用户请求然后分发给不同的Controller的?

分享人:田文瑞

1.背景介绍

2.知识剖析

3.编码实战

4.常见问题

5.参考文献

6.更多讨论

1.背景介绍

web应用开发原理是什么

服务器端接收到用户请求(request),进行业务处理后通过Response响应给用户的过程

服务器端具体对于接受请求做出相应的工作是由Servlrt完成的,Servlet的配置过于繁琐, 同时 HTTP 协议传输的数据都是文本形式,这就需要开发者进行大量的数据类型转换,这种工作没有技术含量、简单枯燥易出错。 Servlet显得非常低效和落后。

MVC是什么

M-Model 模型(业务逻辑:由JavaBean构成,service+dao+entity)

V-View (视图展示 jsp、html等)

C-Controller 控制器 (接收用户请求->调用模型->根据结果派发页面

SpringMVC是什么

Spring MVC是一个MVC的开源框架,是用来简化web应用程序开发的应用开发框架。把较为复杂的web应用逻辑分成清晰的几部分。是spring的子模块,不需要与spring再次进行整合。 和Struts2比较

Spring里对应的MVC分别是什么

M-dao层、实体、service(逻辑层)

V-jsp页面等前端

C-Controller 控制类 DispatherServlet、Handler

2.知识剖析

SpringMVC工作流程

SpringMVC工作流程

第一步:用户向服务器发送请求,请求被Spring 前端控制器Servelt DispatcherServlet捕获;

第二步:DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI, 调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器), 最后以HandlerExecutionChain对象的形式返回;

SpringMVC工作流程

第三步:DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter(控制器适配器)。( 附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,

Spring将帮你做一些额外的工作:

HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

SpringMVC工作流程

第四步:Handler执行完后,向DispatcherServlet 返回一个ModelAndView对象

第五步: HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

第六步:根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

SpringMVC工作流程

第七步:视图解析器像前端控制器DispatcherServlet返回View

第八步:DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)

第九:前端控制器向用户响应结果

SpringMVC组件说明

--1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供:

作用:接收用户请求,响应结果,控制其他组件执行,降耦合,提扩展。 相当于mvc模式中的c,由它调用其他组件对于用户请求进行处理。

--2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供

作用:根据用户请求的url查找handler(控制器) springmvc提供了不同的映射器及实现方式:xml配置、注解方式等。

SpringMVC组件说明

--3、处理器适配器HandlerAdapter(不需要工程师开发),由框架提供:

作用:把处理器包装成适配器,这样就可以支持多种类型的处理器 按照特定规则(HandlerAdapter要求的规则)去执行Handler 按照特定规则(HandlerAdapter要求的规则)去执行Handler

--4、处理器Handler(需要工程师开发) 即Controller类

作用:是继前端控制器DispatcherServlet的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 涉及到具体的用户业务请求的处理,一般情况下需要工程师根据业务需求开发Handler。

SpringMVC组件说明

--5、视图解析器View resolver(不需要工程师开发),由框架提供:

作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

--视图View(需要工程师开发jsp...)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

3.编码实战

4.常见问题

1、DispatcherServlet接到请求后如何映射到Controller呢?

在Spring MVC中,Web请求被Web应用程序上下文中声明的一个或者多个处理程序映射Bean(是吸纳了HandlerMapping接口的Bean)映射到Controller。Spring MVC提供了几种HandlerMapping实现:

1. BeanNameUrlHandlerMapping(默认情况),他根据Controller Bean名称中指定的URL模式将请求映射到处理程序上。 eg. ...

当你访问http://******/welcome.htm这个URL时,DispatcherServlet通过BeanNameUrlHandlerMapping映射就找到了WelcomeController。

4.常见问题

DispatcherServlet接到请求后如何映射到Controller呢?

2. ControllerClassNameHandlerMapping,它是按控制器类名称映射请求。

3. SimpleUrlHandlerMapping,用定制的映射定义来映射请求。

4.常见问题

2、SpringMvc中函数的返回值是什么?

返回值可以有很多类型,有String, ModelAndView,Sting类型比较常用。

2.1返回值为 String 类型

redirect重定向:

redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)

return "redirect:xxx.action" 重定向到另一个Action请求中

forward页面转发: 通过forward进行页面转发,浏览器地址栏url不变,request可以共享。 return "forward:xxx.action"

4.常见问题

2.2返回值为 ModelAndView 类型

ModelAndView是Model 和 View 的一个集合类型,其中Model 是一个Map类型的空间,其主要用来存储页面请求的返回数据

而view 则一般是用来存储 请求数据 将要被 接收的 页面(一般为页面名称),也是服务器响应的页面(即前端得到响应后要显示的页面)

4.常见问题

2.3返回值为void 时

 在controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转向页面,如下:request.getRequestDispatcher("页面路径").forward(request, response);

2、也可以通过response页面重定向: response.sendRedirect("url")

4.常见问题

2.3返回值为void 时

3、也可以通过response指定响应结果,例如响应json数据如下: response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json串");

5.参考资料

https://blog.csdn.net/a745233700/article/details/80963758

https://www.cnblogs.com/xiaoxi/p/6164383.html

https://www.cnblogs.com/dreamworlds/p/5396112.html

6.更多讨论

鸣谢

感谢观看,如有出错,恳请指正