文档章节

1.spring mvc入门

 老二q
发布于 2016/09/13 14:56
字数 1787
阅读 21
收藏 0

 

1.前端控制器是DispatcherServlet

2.应用控制器其实拆为:a,处理器映射器(Handler Mapping),用于进行处理器管理

                                    b,视图解析器(View Resolver),用于进行视图管理;

3,页面控制器/动作/处理器为Controller接口(包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。

 

spring web mvc 架构

Spring Web MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理(个人理解:和struts类似,通过配置文件查找相应的action)

 

spring web mvc 处理请求的流程

 

 

具体执行步骤如下:

1、  首先用户发送请求————>前端控制器(也就是springmvc核心,DispatcherServlet),前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器(也就是controller)进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的1、2步骤;

2、  页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);图中的3、4、5步骤;

3、  前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤6、7;

4、  前端控制器再次收回控制权,将响应返回给用户,图中的步骤8;至此整个结束。

 

 

 

spring web mvc 架构

 

 架构图对应的DispatcherServlet核心代码如下:

//前端控制器分派方法  
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        HttpServletRequest processedRequest = request;  
        HandlerExecutionChain mappedHandler = null;  
        int interceptorIndex = -1;  
  
        try {  
            ModelAndView mv;  
            boolean errorView = false;  
  
            try {  
                   //步骤1、检查是否是请求是否是multipart(如文件上传),如果是将通过MultipartResolver解析  
                processedRequest = checkMultipart(request);  
                   //步骤2、请求到处理器(页面控制器)的映射,通过HandlerMapping进行映射。ps:(个人理解:
//项目启动时会注册springmvc项目的配置文件中的bean,如果配置文件中没有指定默认会注册DispatcherServlet.properties配置文件中的bean,
//DispatcherServlet.properties这个配置文件是springmvc自己的,对应处理器的bean就是HandlerMapping对象,
//HandlerMapping对象为BeanNameUrlHandlerMapping,DefaultAnnotationHandlerMapping,个人理解就是有通过url对应的,
//有的是通过注解对应的,然后将这两个HandlerMapping放到handlerMappings这个list中,这个动作是在项目启动时候初始化一些处理器、解析器时候操作的,
//再根据request去HandlerMapping中获取handler也就是处理器,不为空的handler就是要获取的处理器,此处理器包含映射关系,
//映射关系为请求的url具体请求哪个controller)


                mappedHandler = getHandler(processedRequest, false);  
                if (mappedHandler == null || mappedHandler.getHandler() == null) {  
                    noHandlerFound(processedRequest, response);  
                    return;  
                }  
                   //步骤3、处理器适配,即将我们的处理器包装成相应的适配器(从而支持多种类型的处理器)。ps:(个人理解:
//项目启动时也会注册配置文件中的bean,原理和步骤2个人理解中一致,对应适配器的bean就是HandlerAdapter对象,
//HandlerAdapter对象为HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter这些接口,
//这些接口都实现了HandlerAdapter,HandlerAdapter接口中有一个support判断,还有一个处理请求的方法handle,
//通过传入参数也就是处理器调用support方法来决定具体得到哪个适配器也就是用哪个实现类来处理,support方法就是判断了处理器中映射的页面控制器是否继承了Controller,
//再调用适配器的handle方法处理请求,也就是用实现类处理,实现类中的处理会调用handleRequest方法,此方法是Controller接口中的,
//再调用具体的实现类处理我们的请求,此实现类也就是页面控制器,我们编写的controller)


                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  
  
                  // 304 Not Modified缓存支持  
                //此处省略具体代码  
  
                // 执行处理器相关的拦截器的预处理(HandlerInterceptor.preHandle)  
                //此处省略具体代码  
  
                // 步骤4、由适配器执行处理器(调用处理器相应功能处理方法)  
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  
  
                // Do we need view name translation?  
                if (mv != null && !mv.hasView()) {  
                    mv.setViewName(getDefaultViewName(request));  
                }  
  
                // 执行处理器相关的拦截器的后处理(HandlerInterceptor.postHandle)  
                //此处省略具体代码  
            }  
            catch (ModelAndViewDefiningException ex) {  
                logger.debug("ModelAndViewDefiningException encountered", ex);  
                mv = ex.getModelAndView();  
            }  
            catch (Exception ex) {  
                Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);  
                mv = processHandlerException(processedRequest, response, handler, ex);  
                errorView = (mv != null);  
            }  
  
            //步骤5 步骤6、解析视图并进行视图的渲染  
//步骤5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))  
//步骤6 视图在渲染时会把Model传入(view.render(mv.getModelInternal(), request, response);)  
            if (mv != null && !mv.wasCleared()) {  
                render(mv, processedRequest, response);  
                if (errorView) {  
                    WebUtils.clearErrorRequestAttributes(request);  
                }  
            }  
            else {  
                if (logger.isDebugEnabled()) {  
                    logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +  
                            "': assuming HandlerAdapter completed request handling");  
                }  
            }  
  
            // 执行处理器相关的拦截器的完成后处理(HandlerInterceptor.afterCompletion)  
            //此处省略具体代码  
  
  
        catch (Exception ex) {  
            // Trigger after-completion for thrown exception.  
            triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);  
            throw ex;  
        }  
        catch (Error err) {  
            ServletException ex = new NestedServletException("Handler processing failed", err);  
            // Trigger after-completion for thrown exception.  
            triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);  
            throw ex;  
        }  
  
        finally {  
            // Clean up any resources used by a multipart request.  
            if (processedRequest != request) {  
                cleanupMultipart(processedRequest);  
            }  
        }  
    }

 

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

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返回响应给用户,到此一个流程结束。

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 5
码字总数 6494
作品 0
海淀
私信 提问
Map,Model,ModelMap使用方法

1.Spring MVC在内部使用了一个org.springframework.ui.Model接口存储模型数据 具体步骤: 1.Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。 2.如果方法的入参为M...

沉迷于编程的小菜菜
2018/04/23
0
0
spring-boot 加入拦截器Interceptor

1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationInterceptor LocaleChangeInterceptor ThemeChangeInterceptor 2.配置spring mvc的拦截......

凯文加内特
2015/07/27
0
0
spring mvc 使用private方法作为@RequestMapping操作时的诡异问题

代码如上,描述下问题,正常写法我们Controller对外的都是public ,偶尔一次写错了,然后发现了下面的问题: spring mvc 可以调用的内部,也可以跳转到home如果中间不报错,我注释代码测试的,但是在...

Anotherjueyue
2015/10/23
848
0
Build Spring MVC development environment

Short memo for how to build Spring MVC develepmnet environment (for windows). In case you have any questions, please feel free to leave message to me under this article. I will ......

Marvin_Chen
2018/06/26
0
0
SpringMVC ------请求参数,请求头,cookie等注解。

1.Spring MVC通过分析处理方法的签名,将HTTP请求信息绑定到处理方法的相应入参中。 2.Spring MVC对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。 3.必要时...

Rickxue
2015/12/17
385
0

没有更多内容

加载失败,请刷新页面

加载更多

商品详情页上拉查看详情

商品详情页上拉查看详情 目录介绍 01.该库介绍 02.效果展示 03.如何使用 04.注意要点 05.优化问题 06.部分代码逻辑 07.参考案例 01.该库介绍 模仿淘宝、京东、考拉等商品详情页分页加载的UI效...

潇湘剑雨
25分钟前
1
0
Netty内存池之PoolArena详解

PoolArena是Netty内存池中的一个核心容器,它的主要作用是对创建的一系列的PoolChunk和PoolSubpage进行管理,根据申请的不同内存大小将最终的申请动作委托给这两个子容器进行管理。整体上,P...

爱宝贝丶
29分钟前
1
0
Django使用Channels实现WebSocket--下篇

希望通过对这两篇文章的学习,能够对Channels有更加深入的了解,使用起来得心应手游刃有余 通过上一篇《Django使用Channels实现WebSocket--上篇》的学习应该对Channels的各种概念有了清晰的认...

运维咖啡吧
37分钟前
2
0
linux下设置定时执行shell脚本的示例

很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据、数据库数据等 不适合人工经常做的一些操作这里简单说下 shell Shell俗称壳,类似于DOS下的command...

阿锋zxf
40分钟前
3
0
介绍Kubernetes监控Heapster

什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS,Kubernetes有个出名的监控agent—cAdvisor。在每个kubernetes Node上都会运行cAdvisor,它会收集本机...

xiangyunyan
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部