分享人:田文瑞
1.背景介绍
2.知识剖析
3.编码实战
4.常见问题
5.参考文献
6.更多讨论
服务器端具体对于接受请求做出相应的工作是由Servlrt完成的,Servlet的配置过于繁琐, 同时 HTTP 协议传输的数据都是文本形式,这就需要开发者进行大量的数据类型转换,这种工作没有技术含量、简单枯燥易出错。 Servlet显得非常低效和落后。
M-Model 模型(业务逻辑:由JavaBean构成,service+dao+entity)
V-View (视图展示 jsp、html等)
C-Controller 控制器 (接收用户请求->调用模型->根据结果派发页面
M-dao层、实体、service(逻辑层)
V-jsp页面等前端
C-Controller 控制类 DispatherServlet、Handler
第一步:用户向服务器发送请求,请求被Spring 前端控制器Servelt DispatcherServlet捕获;
第二步:DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI, 调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器), 最后以HandlerExecutionChain对象的形式返回;
第三步:DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter(控制器适配器)。( 附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,
Spring将帮你做一些额外的工作:HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
第四步:Handler执行完后,向DispatcherServlet 返回一个ModelAndView对象
第五步: HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
第六步:根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
第七步:视图解析器像前端控制器DispatcherServlet返回View
第八步:DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
第九:前端控制器向用户响应结果
--1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供:
作用:接收用户请求,响应结果,控制其他组件执行,降耦合,提扩展。 相当于mvc模式中的c,由它调用其他组件对于用户请求进行处理。
--2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据用户请求的url查找handler(控制器) springmvc提供了不同的映射器及实现方式:xml配置、注解方式等。
--3、处理器适配器HandlerAdapter(不需要工程师开发),由框架提供:
作用:把处理器包装成适配器,这样就可以支持多种类型的处理器 按照特定规则(HandlerAdapter要求的规则)去执行Handler 按照特定规则(HandlerAdapter要求的规则)去执行Handler
--4、处理器Handler(需要工程师开发) 即Controller类
作用:是继前端控制器DispatcherServlet的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 涉及到具体的用户业务请求的处理,一般情况下需要工程师根据业务需求开发Handler。
--5、视图解析器View resolver(不需要工程师开发),由框架提供:
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
--视图View(需要工程师开发jsp...)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
1、DispatcherServlet接到请求后如何映射到Controller呢?
在Spring MVC中,Web请求被Web应用程序上下文中声明的一个或者多个处理程序映射Bean(是吸纳了HandlerMapping接口的Bean)映射到Controller。Spring MVC提供了几种HandlerMapping实现:1. BeanNameUrlHandlerMapping(默认情况),他根据Controller Bean名称中指定的URL模式将请求映射到处理程序上。
eg.
DispatcherServlet接到请求后如何映射到Controller呢?
2. ControllerClassNameHandlerMapping,它是按控制器类名称映射请求。
3. SimpleUrlHandlerMapping,用定制的映射定义来映射请求。
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"
2.2返回值为 ModelAndView 类型
ModelAndView是Model 和 View 的一个集合类型,其中Model 是一个Map类型的空间,其主要用来存储页面请求的返回数据
而view 则一般是用来存储 请求数据 将要被 接收的 页面(一般为页面名称),也是服务器响应的页面(即前端得到响应后要显示的页面)
2.3返回值为void 时
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
1、使用request转向页面,如下:request.getRequestDispatcher("页面路径").forward(request, response);
2、也可以通过response页面重定向: response.sendRedirect("url")
2.3返回值为void 时
3、也可以通过response指定响应结果,例如响应json数据如下: response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json串");
https://blog.csdn.net/a745233700/article/details/80963758
https://www.cnblogs.com/xiaoxi/p/6164383.html
https://www.cnblogs.com/dreamworlds/p/5396112.html
感谢观看,如有出错,恳请指正